diff options
Diffstat (limited to 'gst/gstquery.c')
-rw-r--r-- | gst/gstquery.c | 143 |
1 files changed, 124 insertions, 19 deletions
diff --git a/gst/gstquery.c b/gst/gstquery.c index 12cf67da6..70886fc19 100644 --- a/gst/gstquery.c +++ b/gst/gstquery.c @@ -865,10 +865,20 @@ gst_query_get_structure (GstQuery * query) GstStructure * gst_query_writable_structure (GstQuery * query) { + GstStructure *res; + g_return_val_if_fail (GST_IS_QUERY (query), NULL); - g_return_val_if_fail (gst_query_is_writable (query), NULL); - return GST_QUERY_STRUCTURE (query); + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return NULL; + } + + res = GST_QUERY_STRUCTURE (query); + + gst_query_unlock (query); + + return res; } /** @@ -916,7 +926,11 @@ gst_query_set_seeking (GstQuery * query, GstFormat format, GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SEEKING); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, @@ -924,6 +938,8 @@ gst_query_set_seeking (GstQuery * query, GstFormat format, GST_QUARK (SEEKABLE), G_TYPE_BOOLEAN, seekable, GST_QUARK (SEGMENT_START), G_TYPE_INT64, segment_start, GST_QUARK (SEGMENT_END), G_TYPE_INT64, segment_end, NULL); + + gst_query_unlock (query); } /** @@ -1038,7 +1054,11 @@ gst_query_set_formats (GstQuery * query, gint n_formats, ...) GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_FORMATS); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } g_value_init (&list, GST_TYPE_LIST); @@ -1053,6 +1073,8 @@ gst_query_set_formats (GstQuery * query, gint n_formats, ...) g_value_unset (&list); + gst_query_unlock (query); + } /** @@ -1076,7 +1098,11 @@ gst_query_set_formatsv (GstQuery * query, gint n_formats, GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_FORMATS); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } g_value_init (&list, GST_TYPE_LIST); for (i = 0; i < n_formats; i++) { @@ -1086,6 +1112,8 @@ gst_query_set_formatsv (GstQuery * query, gint n_formats, gst_structure_set_value (structure, "formats", &list); g_value_unset (&list); + + gst_query_unlock (query); } /** @@ -1205,13 +1233,19 @@ gst_query_set_buffering_percent (GstQuery * query, gboolean busy, gint percent) GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING); - g_return_if_fail (gst_query_is_writable (query)); g_return_if_fail (percent >= 0 && percent <= 100); + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } + structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, GST_QUARK (BUSY), G_TYPE_BOOLEAN, busy, GST_QUARK (BUFFER_PERCENT), G_TYPE_INT, percent, NULL); + + gst_query_unlock (query); } /** @@ -1261,7 +1295,11 @@ gst_query_set_buffering_stats (GstQuery * query, GstBufferingMode mode, GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, @@ -1269,6 +1307,8 @@ gst_query_set_buffering_stats (GstQuery * query, GstBufferingMode mode, GST_QUARK (AVG_IN_RATE), G_TYPE_INT, avg_in, GST_QUARK (AVG_OUT_RATE), G_TYPE_INT, avg_out, GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, buffering_left, NULL); + + gst_query_unlock (query); } /** @@ -1329,7 +1369,11 @@ gst_query_set_buffering_range (GstQuery * query, GstFormat format, GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, @@ -1337,6 +1381,8 @@ gst_query_set_buffering_range (GstQuery * query, GstFormat format, GST_QUARK (START_VALUE), G_TYPE_INT64, start, GST_QUARK (STOP_VALUE), G_TYPE_INT64, stop, GST_QUARK (ESTIMATED_TOTAL), G_TYPE_INT64, estimated_total, NULL); + + gst_query_unlock (query); } /** @@ -1401,10 +1447,12 @@ gst_query_add_buffering_range (GstQuery * query, gint64 start, gint64 stop) GstStructure *structure; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, FALSE); - g_return_val_if_fail (gst_query_is_writable (query), FALSE); + g_return_val_if_fail (start < stop, FALSE); - if (G_UNLIKELY (start >= stop)) + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); return FALSE; + } structure = GST_QUERY_STRUCTURE (query); array = ensure_array (structure, GST_QUARK (BUFFERING_RANGES)); @@ -1413,7 +1461,7 @@ gst_query_add_buffering_range (GstQuery * query, gint64 start, gint64 stop) last_array_value = g_value_array_get_nth (array, array->n_values - 1); if (G_UNLIKELY (start <= gst_value_get_int64_range_min (last_array_value))) - return FALSE; + goto invalid_range; } g_value_init (&value, GST_TYPE_INT64_RANGE); @@ -1421,7 +1469,16 @@ gst_query_add_buffering_range (GstQuery * query, gint64 start, gint64 stop) g_value_array_append (array, &value); /* skip the g_value_unset(&value) here, we know it's not needed */ + gst_query_unlock (query); + return TRUE; + + /* ERRORS */ +invalid_range: + { + gst_query_unlock (query); + return FALSE; + } } /** @@ -1532,11 +1589,17 @@ gst_query_set_uri (GstQuery * query, const gchar * uri) GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_URI); - g_return_if_fail (gst_query_is_writable (query)); g_return_if_fail (gst_uri_is_valid (uri)); + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } + structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, GST_QUARK (URI), G_TYPE_STRING, uri, NULL); + + gst_query_unlock (query); } /** @@ -1640,10 +1703,14 @@ gst_query_set_allocation_params (GstQuery * query, guint size, GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION); - g_return_if_fail (gst_query_is_writable (query)); g_return_if_fail (((alignment + 1) & alignment) == 0); g_return_if_fail (size != 0 || pool == NULL); + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } + structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, GST_QUARK (SIZE), G_TYPE_UINT, size, @@ -1652,6 +1719,8 @@ gst_query_set_allocation_params (GstQuery * query, guint size, GST_QUARK (PREFIX), G_TYPE_UINT, prefix, GST_QUARK (ALIGN), G_TYPE_UINT, alignment, GST_QUARK (POOL), GST_TYPE_BUFFER_POOL, pool, NULL); + + gst_query_unlock (query); } /** @@ -1701,7 +1770,11 @@ gst_query_add_allocation_meta (GstQuery * query, const gchar * api) g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION); g_return_if_fail (api != NULL); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); array = ensure_array (structure, GST_QUARK (META)); @@ -1710,6 +1783,8 @@ gst_query_add_allocation_meta (GstQuery * query, const gchar * api) g_value_set_string (&api_value, api); g_value_array_append (array, &api_value); g_value_unset (&api_value); + + gst_query_unlock (query); } /** @@ -1810,7 +1885,11 @@ gst_query_add_allocation_memory (GstQuery * query, const gchar * alloc) GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); array = ensure_array (structure, GST_QUARK (ALLOCATOR)); @@ -1819,6 +1898,8 @@ gst_query_add_allocation_memory (GstQuery * query, const gchar * alloc) g_value_set_string (&value, alloc); g_value_array_append (array, &value); g_value_unset (&value); + + gst_query_unlock (query); } /** @@ -1918,7 +1999,11 @@ gst_query_set_scheduling (GstQuery * query, GstSchedulingFlags flags, GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SCHEDULING); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, @@ -1926,6 +2011,8 @@ gst_query_set_scheduling (GstQuery * query, GstSchedulingFlags flags, GST_QUARK (MINSIZE), G_TYPE_INT, minsize, GST_QUARK (MAXSIZE), G_TYPE_INT, maxsize, GST_QUARK (ALIGN), G_TYPE_INT, align, NULL); + + gst_query_unlock (query); } /** @@ -1969,7 +2056,11 @@ gst_query_add_scheduling_mode (GstQuery * query, GstPadMode mode) GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SCHEDULING); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); array = ensure_array (structure, GST_QUARK (MODES)); @@ -1978,6 +2069,8 @@ gst_query_add_scheduling_mode (GstQuery * query, GstPadMode mode) g_value_set_enum (&value, mode); g_value_array_append (array, &value); g_value_unset (&value); + + gst_query_unlock (query); } /** @@ -2112,11 +2205,17 @@ gst_query_set_accept_caps_result (GstQuery * query, gboolean result) GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ACCEPT_CAPS); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, GST_QUARK (RESULT), G_TYPE_BOOLEAN, result, NULL); + + gst_query_unlock (query); } void @@ -2201,10 +2300,16 @@ gst_query_set_caps_result (GstQuery * query, GstCaps * caps) GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_CAPS); - g_return_if_fail (gst_query_is_writable (query)); + + if (!gst_query_try_lock (query, GST_LOCK_WRITE)) { + g_warning ("could not lock query %p in WRITE mode", query); + return; + } structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, GST_QUARK (CAPS), GST_TYPE_CAPS, caps, NULL); + + gst_query_unlock (query); } /** |