summaryrefslogtreecommitdiff
path: root/gst/gstquery.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/gstquery.c')
-rw-r--r--gst/gstquery.c143
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);
}
/**