diff options
-rw-r--r-- | gst/gstpad.h | 34 | ||||
-rw-r--r-- | gst/gstquark.c | 4 | ||||
-rw-r--r-- | gst/gstquark.h | 19 | ||||
-rw-r--r-- | gst/gstquery.c | 325 | ||||
-rw-r--r-- | gst/gstquery.h | 24 | ||||
-rw-r--r-- | libs/gst/base/gstbaseparse.c | 3 | ||||
-rw-r--r-- | libs/gst/base/gstbasesink.c | 2 | ||||
-rw-r--r-- | libs/gst/base/gstbasesrc.c | 5 | ||||
-rw-r--r-- | libs/gst/base/gstpushsrc.c | 5 | ||||
-rw-r--r-- | plugins/elements/gstqueue2.c | 8 | ||||
-rw-r--r-- | plugins/elements/gsttypefindelement.c | 2 |
11 files changed, 253 insertions, 178 deletions
diff --git a/gst/gstpad.h b/gst/gstpad.h index f2a1b21bb6..3951d38944 100644 --- a/gst/gstpad.h +++ b/gst/gstpad.h @@ -44,6 +44,22 @@ typedef enum { GST_PAD_SINK } GstPadDirection; +/** + * GstPadMode: + * @GST_PAD_MODE_NONE: Pad will not handle dataflow + * @GST_PAD_MODE_PUSH: Pad handles dataflow in downstream push mode + * @GST_PAD_MODE_PULL: Pad handles dataflow in upstream pull mode + * + * The status of a GstPad. After activating a pad, which usually happens when the + * parent element goes from READY to PAUSED, the GstPadMode defines if the + * pad operates in push or pull mode. + */ +typedef enum { + GST_PAD_MODE_NONE, + GST_PAD_MODE_PUSH, + GST_PAD_MODE_PULL +} GstPadMode; + #include <gst/gstobject.h> #include <gst/gstbuffer.h> #include <gst/gstbufferlist.h> @@ -211,26 +227,11 @@ typedef enum { */ #define GST_PAD_LINK_CHECK_DEFAULT ((GstPadLinkCheck) (GST_PAD_LINK_CHECK_HIERARCHY | GST_PAD_LINK_CHECK_CAPS)) -/** - * GstPadMode: - * @GST_PAD_MODE_NONE: Pad will not handle dataflow - * @GST_PAD_MODE_PUSH: Pad handles dataflow in downstream push mode - * @GST_PAD_MODE_PULL: Pad handles dataflow in upstream pull mode - * - * The status of a GstPad. After activating a pad, which usually happens when the - * parent element goes from READY to PAUSED, the GstPadMode defines if the - * pad operates in push or pull mode. - */ -typedef enum { - GST_PAD_MODE_NONE, - GST_PAD_MODE_PUSH, - GST_PAD_MODE_PULL -} GstPadMode; - /* pad states */ /** * GstPadActivateFunction: * @pad: a #GstPad + * @parent: the parent of @pad * * This function is called when the pad is activated during the element * READY to PAUSED state change. By default this function will call the @@ -243,6 +244,7 @@ typedef gboolean (*GstPadActivateFunction) (GstPad *pad, GstObject *parent); /** * GstPadActivateModeFunction: * @pad: a #GstPad + * @parent: the parent of @pad * @active: activate or deactivate the pad. * * The prototype of the push and pull activate functions. diff --git a/gst/gstquark.c b/gst/gstquark.c index 2c562a3a75..b68709530c 100644 --- a/gst/gstquark.c +++ b/gst/gstquark.c @@ -54,8 +54,8 @@ static const gchar *_quark_strings[] = { "min-buffers", "max-buffers", "prefix", "postfix", "align", "time", "GstQueryAllocation", "need-pool", "meta", "pool", "GstEventCaps", "GstEventReconfigure", "segment", "GstQueryScheduling", "pull-mode", - "random-access", "sequential", "allocator", "GstEventFlushStop", "options", - "GstQueryAcceptCaps", "result", "GstQueryCaps", "filter" + "allocator", "GstEventFlushStop", "options", "GstQueryAcceptCaps", + "result", "GstQueryCaps", "filter", "modes" }; GQuark _priv_gst_quark_table[GST_QUARK_MAX]; diff --git a/gst/gstquark.h b/gst/gstquark.h index 05e4eccaad..758345c203 100644 --- a/gst/gstquark.h +++ b/gst/gstquark.h @@ -150,17 +150,16 @@ typedef enum _GstQuarkId GST_QUARK_SEGMENT = 121, GST_QUARK_QUERY_SCHEDULING = 122, GST_QUARK_PULL_MODE = 123, - GST_QUARK_RANDOM_ACCESS = 124, - GST_QUARK_SEQUENTIAL = 125, - GST_QUARK_ALLOCATOR = 126, - GST_QUARK_EVENT_FLUSH_STOP = 127, - GST_QUARK_OPTIONS = 128, - GST_QUARK_QUERY_ACCEPT_CAPS = 129, - GST_QUARK_RESULT = 130, - GST_QUARK_QUERY_CAPS = 131, - GST_QUARK_FILTER = 132, + GST_QUARK_ALLOCATOR = 124, + GST_QUARK_EVENT_FLUSH_STOP = 125, + GST_QUARK_OPTIONS = 126, + GST_QUARK_QUERY_ACCEPT_CAPS = 127, + GST_QUARK_RESULT = 128, + GST_QUARK_QUERY_CAPS = 129, + GST_QUARK_FILTER = 130, + GST_QUARK_MODES = 131, - GST_QUARK_MAX = 133 + GST_QUARK_MAX = 132 } GstQuarkId; extern GQuark _priv_gst_quark_table[GST_QUARK_MAX]; diff --git a/gst/gstquery.c b/gst/gstquery.c index e0fdff2e2d..17c5cf257a 100644 --- a/gst/gstquery.c +++ b/gst/gstquery.c @@ -963,6 +963,28 @@ gst_query_parse_seeking (GstQuery * query, GstFormat * format, GST_QUARK (SEGMENT_END))); } +static GValueArray * +ensure_array (GstStructure * s, GQuark quark) +{ + GValueArray *array; + const GValue *value; + + value = gst_structure_id_get_value (s, quark); + if (value) { + array = (GValueArray *) g_value_get_boxed (value); + } else { + GValue new_array_val = { 0, }; + + array = g_value_array_new (0); + + g_value_init (&new_array_val, G_TYPE_VALUE_ARRAY); + g_value_take_boxed (&new_array_val, array); + + gst_structure_id_take_value (s, quark, &new_array_val); + } + return array; +} + /** * gst_query_new_formats: * @@ -1375,9 +1397,7 @@ gboolean gst_query_add_buffering_range (GstQuery * query, gint64 start, gint64 stop) { GValueArray *array; - GValue *last_array_value; - const GValue *value; - GValue range_value = { 0 }; + GValue value = { 0 }; GstStructure *structure; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, FALSE); @@ -1387,30 +1407,19 @@ gst_query_add_buffering_range (GstQuery * query, gint64 start, gint64 stop) return FALSE; structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (BUFFERING_RANGES)); - if (value) { - array = (GValueArray *) g_value_get_boxed (value); + array = ensure_array (structure, GST_QUARK (BUFFERING_RANGES)); + if (array->n_values > 1) { + GValue *last_array_value; + 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; - } else { - GValue new_array_val = { 0, }; - - array = g_value_array_new (0); - - g_value_init (&new_array_val, G_TYPE_VALUE_ARRAY); - g_value_take_boxed (&new_array_val, array); - - /* set the value array only once, so we then modify (append to) the - * existing value array owned by the GstStructure / the field's GValue */ - gst_structure_id_take_value (structure, GST_QUARK (BUFFERING_RANGES), - &new_array_val); } - g_value_init (&range_value, GST_TYPE_INT64_RANGE); - gst_value_set_int64_range (&range_value, start, stop); - g_value_array_append (array, &range_value); - /* skip the g_value_unset(&range_value) here, we know it's not needed */ + g_value_init (&value, GST_TYPE_INT64_RANGE); + gst_value_set_int64_range (&value, start, stop); + g_value_array_append (array, &value); + /* skip the g_value_unset(&value) here, we know it's not needed */ return TRUE; } @@ -1430,19 +1439,14 @@ guint gst_query_get_n_buffering_ranges (GstQuery * query) { GValueArray *array; - const GValue *value; - guint size = 0; GstStructure *structure; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, 0); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (BUFFERING_RANGES)); - if (value) { - array = (GValueArray *) g_value_get_boxed (value); - size = array->n_values; - } - return size; + array = ensure_array (structure, GST_QUARK (BUFFERING_RANGES)); + + return array->n_values; } @@ -1464,23 +1468,21 @@ gboolean gst_query_parse_nth_buffering_range (GstQuery * query, guint index, gint64 * start, gint64 * stop) { + GValueArray *array; const GValue *value; - GValueArray *ranges; - GValue *range_value; gboolean ret = FALSE; GstStructure *structure; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, ret); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (BUFFERING_RANGES)); - ranges = (GValueArray *) g_value_get_boxed (value); - range_value = g_value_array_get_nth (ranges, index); - if (range_value) { + array = ensure_array (structure, GST_QUARK (BUFFERING_RANGES)); + + if ((value = g_value_array_get_nth (array, index))) { if (start) - *start = gst_value_get_int64_range_min (range_value); + *start = gst_value_get_int64_range_min (value); if (stop) - *stop = gst_value_get_int64_range_max (range_value); + *stop = gst_value_get_int64_range_max (value); ret = TRUE; } @@ -1684,7 +1686,6 @@ void gst_query_add_allocation_meta (GstQuery * query, const gchar * api) { GValueArray *array; - const GValue *value; GValue api_value = { 0 }; GstStructure *structure; @@ -1693,19 +1694,7 @@ gst_query_add_allocation_meta (GstQuery * query, const gchar * api) g_return_if_fail (gst_query_is_writable (query)); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (META)); - if (value) { - array = (GValueArray *) g_value_get_boxed (value); - } else { - GValue new_array_val = { 0, }; - - array = g_value_array_new (0); - - g_value_init (&new_array_val, G_TYPE_VALUE_ARRAY); - g_value_take_boxed (&new_array_val, array); - - gst_structure_id_take_value (structure, GST_QUARK (META), &new_array_val); - } + array = ensure_array (structure, GST_QUARK (META)); g_value_init (&api_value, G_TYPE_STRING); g_value_set_string (&api_value, api); @@ -1726,19 +1715,14 @@ guint gst_query_get_n_allocation_metas (GstQuery * query) { GValueArray *array; - const GValue *value; - guint size = 0; GstStructure *structure; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, 0); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (META)); - if (value) { - array = (GValueArray *) g_value_get_boxed (value); - size = array->n_values; - } - return size; + array = ensure_array (structure, GST_QUARK (META)); + + return array->n_values; } /** @@ -1754,24 +1738,19 @@ gst_query_get_n_allocation_metas (GstQuery * query) const gchar * gst_query_parse_nth_allocation_meta (GstQuery * query, guint index) { - const GValue *value; + GValueArray *array; + GValue *value; const gchar *ret = NULL; GstStructure *structure; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, NULL); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (META)); - if (value) { - GValueArray *meta; - GValue *api_value; + array = ensure_array (structure, GST_QUARK (META)); - meta = (GValueArray *) g_value_get_boxed (value); - api_value = g_value_array_get_nth (meta, index); + if ((value = g_value_array_get_nth (array, index))) + ret = g_value_get_string (value); - if (api_value) - ret = g_value_get_string (api_value); - } return ret; } @@ -1787,25 +1766,21 @@ gst_query_parse_nth_allocation_meta (GstQuery * query, guint index) gboolean gst_query_has_allocation_meta (GstQuery * query, const gchar * api) { - const GValue *value; + GValueArray *array; + GValue *value; GstStructure *structure; + guint i; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, FALSE); g_return_val_if_fail (api != NULL, FALSE); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (META)); - if (value) { - GValueArray *array; - GValue *api_value; - guint i; + array = ensure_array (structure, GST_QUARK (META)); - array = (GValueArray *) g_value_get_boxed (value); - for (i = 0; i < array->n_values; i++) { - api_value = g_value_array_get_nth (array, i); - if (!strcmp (api, g_value_get_string (api_value))) - return TRUE; - } + for (i = 0; i < array->n_values; i++) { + value = g_value_array_get_nth (array, i); + if (!strcmp (api, g_value_get_string (value))) + return TRUE; } return FALSE; } @@ -1821,33 +1796,19 @@ void gst_query_add_allocation_memory (GstQuery * query, const gchar * alloc) { GValueArray *array; - const GValue *value; - GValue alloc_value = { 0 }; + GValue value = { 0 }; GstStructure *structure; g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION); g_return_if_fail (gst_query_is_writable (query)); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (ALLOCATOR)); - if (value) { - array = (GValueArray *) g_value_get_boxed (value); - } else { - GValue new_array_val = { 0, }; - - array = g_value_array_new (0); - - g_value_init (&new_array_val, G_TYPE_VALUE_ARRAY); - g_value_take_boxed (&new_array_val, array); + array = ensure_array (structure, GST_QUARK (ALLOCATOR)); - gst_structure_id_take_value (structure, GST_QUARK (ALLOCATOR), - &new_array_val); - } - - g_value_init (&alloc_value, G_TYPE_STRING); - g_value_set_string (&alloc_value, alloc); - g_value_array_append (array, &alloc_value); - g_value_unset (&alloc_value); + g_value_init (&value, G_TYPE_STRING); + g_value_set_string (&value, alloc); + g_value_array_append (array, &value); + g_value_unset (&value); } /** @@ -1866,19 +1827,14 @@ guint gst_query_get_n_allocation_memories (GstQuery * query) { GValueArray *array; - const GValue *value; - guint size = 0; GstStructure *structure; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, 0); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (ALLOCATOR)); - if (value) { - array = (GValueArray *) g_value_get_boxed (value); - size = array->n_values; - } - return size; + array = ensure_array (structure, GST_QUARK (ALLOCATOR)); + + return array->n_values; } /** @@ -1894,24 +1850,19 @@ gst_query_get_n_allocation_memories (GstQuery * query) const gchar * gst_query_parse_nth_allocation_memory (GstQuery * query, guint index) { - const GValue *value; + GValueArray *array; + GValue *value; const gchar *ret = NULL; GstStructure *structure; g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, NULL); structure = GST_QUERY_STRUCTURE (query); - value = gst_structure_id_get_value (structure, GST_QUARK (ALLOCATOR)); - if (value) { - GValueArray *memory; - GValue *alloc_value; + array = ensure_array (structure, GST_QUARK (ALLOCATOR)); - memory = (GValueArray *) g_value_get_boxed (value); - alloc_value = g_value_array_get_nth (memory, index); + if ((value = g_value_array_get_nth (array, index))) + ret = g_value_get_string (value); - if (alloc_value) - ret = g_value_get_string (alloc_value); - } return ret; } @@ -1931,9 +1882,7 @@ gst_query_new_scheduling (void) GstStructure *structure; structure = gst_structure_new_id (GST_QUARK (QUERY_SCHEDULING), - GST_QUARK (PULL_MODE), G_TYPE_BOOLEAN, FALSE, - GST_QUARK (RANDOM_ACCESS), G_TYPE_BOOLEAN, FALSE, - GST_QUARK (SEQUENTIAL), G_TYPE_BOOLEAN, TRUE, + GST_QUARK (FLAGS), GST_TYPE_SCHEDULING_FLAGS, 0, GST_QUARK (MINSIZE), G_TYPE_INT, 1, GST_QUARK (MAXSIZE), G_TYPE_INT, -1, GST_QUARK (ALIGN), G_TYPE_INT, 1, NULL); @@ -1945,9 +1894,7 @@ gst_query_new_scheduling (void) /** * gst_query_set_scheduling * @query: A valid #GstQuery of type GST_QUERY_SCHEDULING. - * @pull_mode: if pull mode scheduling is supported - * @random_access: if random access is possible - * @sequential: if sequential access is recommended + * @flags: #GstSchedulingFlags * @minsize: the suggested minimum size of pull requests * @maxsize: the suggested maximum size of pull requests * @align: the suggested alignment of pull requests @@ -1955,8 +1902,7 @@ gst_query_new_scheduling (void) * Set the scheduling properties. */ void -gst_query_set_scheduling (GstQuery * query, gboolean pull_mode, - gboolean random_access, gboolean sequential, +gst_query_set_scheduling (GstQuery * query, GstSchedulingFlags flags, gint minsize, gint maxsize, gint align) { GstStructure *structure; @@ -1966,9 +1912,7 @@ gst_query_set_scheduling (GstQuery * query, gboolean pull_mode, structure = GST_QUERY_STRUCTURE (query); gst_structure_id_set (structure, - GST_QUARK (PULL_MODE), G_TYPE_BOOLEAN, pull_mode, - GST_QUARK (RANDOM_ACCESS), G_TYPE_BOOLEAN, random_access, - GST_QUARK (SEQUENTIAL), G_TYPE_BOOLEAN, sequential, + GST_QUARK (FLAGS), GST_TYPE_SCHEDULING_FLAGS, flags, GST_QUARK (MINSIZE), G_TYPE_INT, minsize, GST_QUARK (MAXSIZE), G_TYPE_INT, maxsize, GST_QUARK (ALIGN), G_TYPE_INT, align, NULL); @@ -1977,9 +1921,7 @@ gst_query_set_scheduling (GstQuery * query, gboolean pull_mode, /** * gst_query_parse_scheduling * @query: A valid #GstQuery of type GST_QUERY_SCHEDULING. - * @pull_mode: if pull mode scheduling is supported - * @random_access: if random access is possible - * @sequential: if sequential access is recommended + * @flags: #GstSchedulingFlags * @minsize: the suggested minimum size of pull requests * @maxsize: the suggested maximum size of pull requests: * @align: the suggested alignment of pull requests @@ -1987,8 +1929,7 @@ gst_query_set_scheduling (GstQuery * query, gboolean pull_mode, * Set the scheduling properties. */ void -gst_query_parse_scheduling (GstQuery * query, gboolean * pull_mode, - gboolean * random_access, gboolean * sequential, +gst_query_parse_scheduling (GstQuery * query, GstSchedulingFlags * flags, gint * minsize, gint * maxsize, gint * align) { GstStructure *structure; @@ -1997,15 +1938,121 @@ gst_query_parse_scheduling (GstQuery * query, gboolean * pull_mode, structure = GST_QUERY_STRUCTURE (query); gst_structure_id_get (structure, - GST_QUARK (PULL_MODE), G_TYPE_BOOLEAN, pull_mode, - GST_QUARK (RANDOM_ACCESS), G_TYPE_BOOLEAN, random_access, - GST_QUARK (SEQUENTIAL), G_TYPE_BOOLEAN, sequential, + GST_QUARK (FLAGS), GST_TYPE_SCHEDULING_FLAGS, 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_add_scheduling_mode + * @query: a GST_QUERY_SCHEDULING type query #GstQuery + * @mode: a #GstPadMode + * + * Add @mode as aone of the supported scheduling modes to @query. + */ +void +gst_query_add_scheduling_mode (GstQuery * query, GstPadMode mode) +{ + GValueArray *array; + GValue value = { 0 }; + GstStructure *structure; + + g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SCHEDULING); + g_return_if_fail (gst_query_is_writable (query)); + + structure = GST_QUERY_STRUCTURE (query); + array = ensure_array (structure, GST_QUARK (MODES)); + + g_value_init (&value, GST_TYPE_PAD_MODE); + g_value_set_enum (&value, mode); + g_value_array_append (array, &value); + g_value_unset (&value); +} + +/** + * gst_query_get_n_scheduling_modes: + * @query: a GST_QUERY_SCHEDULING type query #GstQuery + * + * Retrieve the number of values currently stored in the + * scheduling mode array of the query's structure. + * + * Returns: the scheduling mode array size as a #guint. + */ +guint +gst_query_get_n_scheduling_modes (GstQuery * query) +{ + GValueArray *array; + GstStructure *structure; + + g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SCHEDULING, 0); + + structure = GST_QUERY_STRUCTURE (query); + array = ensure_array (structure, GST_QUARK (MODES)); + + return array->n_values; +} + +/** + * gst_query_parse_nth_scheduling_mode + * @query: a GST_QUERY_SCHEDULING type query #GstQuery + * @index: position in the scheduling modes array to read + * + * Parse an available query and get the scheduling mode + * at @index of the scheduling modes array. + * + * Returns: a #GstPadMode of the scheduling mode at @index. + */ +GstPadMode +gst_query_parse_nth_scheduling_mode (GstQuery * query, guint index) +{ + GValueArray *array; + GValue *value; + GstPadMode ret = GST_PAD_MODE_NONE; + GstStructure *structure; + + g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SCHEDULING, ret); + + structure = GST_QUERY_STRUCTURE (query); + array = ensure_array (structure, GST_QUARK (MODES)); + + if ((value = g_value_array_get_nth (array, index))) + ret = g_value_get_enum (value); + + return ret; +} + +/** + * gst_query_has_scheduling_mode + * @query: a GST_QUERY_SCHEDULING type query #GstQuery + * @mode: the scheduling mode + * + * Check if @query has scheduling mode set. + * + * Returns: TRUE when @mode is in the list of scheduling modes. + */ +gboolean +gst_query_has_scheduling_mode (GstQuery * query, GstPadMode mode) +{ + GValueArray *array; + GValue *value; + GstStructure *structure; + guint i; + + g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SCHEDULING, FALSE); + + structure = GST_QUERY_STRUCTURE (query); + array = ensure_array (structure, GST_QUARK (MODES)); + + for (i = 0; i < array->n_values; i++) { + value = g_value_array_get_nth (array, i); + if (mode == g_value_get_enum (value)) + return TRUE; + } + return FALSE; +} + +/** * gst_query_new_accept_caps * @caps: a #GstCaps * diff --git a/gst/gstquery.h b/gst/gstquery.h index 9416169e76..7895861bab 100644 --- a/gst/gstquery.h +++ b/gst/gstquery.h @@ -374,14 +374,30 @@ guint gst_query_get_n_allocation_memories (GstQuery *query); const gchar * gst_query_parse_nth_allocation_memory (GstQuery *query, guint index); /* scheduling query */ +/** + * GstSchedulingFlags: + * @GST_SCHEDULING_FLAG_SEEKABLE: if seeking is possible + * @GST_SCHEDULING_FLAG_SEQUENTIAL: if sequential access is recommended + * + * The different scheduling flags. + */ +typedef enum { + GST_SCHEDULING_FLAG_SEEKABLE = (1 << 0), + GST_SCHEDULING_FLAG_SEQUENTIAL = (1 << 1) +} GstSchedulingFlags; + GstQuery * gst_query_new_scheduling (void); -void gst_query_set_scheduling (GstQuery *query, gboolean pull_mode, - gboolean random_access, gboolean sequential, +void gst_query_set_scheduling (GstQuery *query, GstSchedulingFlags flags, gint minsize, gint maxsize, gint align); -void gst_query_parse_scheduling (GstQuery *query, gboolean *pull_mode, - gboolean *random_access, gboolean *sequential, +void gst_query_parse_scheduling (GstQuery *query, GstSchedulingFlags *flags, gint *minsize, gint *maxsize, gint *align); + +void gst_query_add_scheduling_mode (GstQuery *query, GstPadMode mode); +guint gst_query_get_n_scheduling_modes (GstQuery *query); +GstPadMode gst_query_parse_nth_scheduling_mode (GstQuery *query, guint index); +gboolean gst_query_has_scheduling_mode (GstQuery *query, GstPadMode mode); + /* accept-caps query */ GstQuery * gst_query_new_accept_caps (GstCaps *caps); void gst_query_parse_accept_caps (GstQuery *query, GstCaps **caps); diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c index 153f422d8a..51fb9a9a11 100644 --- a/libs/gst/base/gstbaseparse.c +++ b/libs/gst/base/gstbaseparse.c @@ -2949,8 +2949,7 @@ gst_base_parse_sink_activate (GstPad * sinkpad, GstObject * parent) query = gst_query_new_scheduling (); result = gst_pad_peer_query (sinkpad, query); if (result) { - gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, - NULL); + pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL); } else { pull_mode = FALSE; } diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 252cfeb5f7..5bd7087e7e 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -4144,7 +4144,7 @@ gst_base_sink_pad_activate (GstPad * pad, GstObject * parent) } /* parse result of the query */ - gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, NULL); + pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL); gst_query_unref (query); if (!pull_mode) { diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index a87bf0cfd5..df0a7184cf 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -1117,7 +1117,10 @@ gst_base_src_default_query (GstBaseSrc * src, GstQuery * query) /* we can operate in getrange mode if the native format is bytes * and we are seekable, this condition is set in the random_access * flag and is set in the _start() method. */ - gst_query_set_scheduling (query, random_access, TRUE, FALSE, 1, -1, 1); + gst_query_set_scheduling (query, GST_SCHEDULING_FLAG_SEEKABLE, 1, -1, 0); + if (random_access) + gst_query_add_scheduling_mode (query, GST_PAD_MODE_PULL); + gst_query_add_scheduling_mode (query, GST_PAD_MODE_PUSH); res = TRUE; break; diff --git a/libs/gst/base/gstpushsrc.c b/libs/gst/base/gstpushsrc.c index 036923460a..5eb9dfe7eb 100644 --- a/libs/gst/base/gstpushsrc.c +++ b/libs/gst/base/gstpushsrc.c @@ -104,7 +104,10 @@ gst_push_src_query (GstBaseSrc * src, GstQuery * query) { /* a pushsrc can by default never operate in pull mode override * if you want something different. */ - gst_query_set_scheduling (query, FALSE, FALSE, TRUE, 1, -1, 1); + gst_query_set_scheduling (query, GST_SCHEDULING_FLAG_SEQUENTIAL, 1, -1, + 0); + gst_query_add_scheduling_mode (query, GST_PAD_MODE_PUSH); + ret = TRUE; break; } diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index eebe94e9ee..c6e0296def 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -2556,11 +2556,17 @@ gst_queue2_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query) case GST_QUERY_SCHEDULING: { gboolean pull_mode; + GstSchedulingFlags flags = 0; /* we can operate in pull mode when we are using a tempfile */ pull_mode = !QUEUE_IS_USING_QUEUE (queue); - gst_query_set_scheduling (query, pull_mode, pull_mode, FALSE, 0, -1, 1); + if (pull_mode) + flags |= GST_SCHEDULING_FLAG_SEEKABLE; + gst_query_set_scheduling (query, flags, 0, -1, 0); + if (pull_mode) + gst_query_add_scheduling_mode (query, GST_PAD_MODE_PULL); + gst_query_add_scheduling_mode (query, GST_PAD_MODE_PUSH); break; } default: diff --git a/plugins/elements/gsttypefindelement.c b/plugins/elements/gsttypefindelement.c index bd208e05fe..dde509504d 100644 --- a/plugins/elements/gsttypefindelement.c +++ b/plugins/elements/gsttypefindelement.c @@ -923,7 +923,7 @@ gst_type_find_element_activate (GstPad * pad, GstObject * parent) goto typefind_push; } - gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, NULL); + pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL); gst_query_unref (query); if (!pull_mode) |