"GstQueryURI", "GstEventStep", "GstMessageStepDone", "amount", "flush",
"intermediate", "GstMessageStepStart", "active", "eos", "sink-message",
"message", "GstMessageQOS", "running-time", "stream-time", "jitter",
- "quality", "processed", "dropped"
+ "quality", "processed", "dropped", "buffering-ranges"
};
GQuark _priv_gst_quark_table[GST_QUARK_MAX];
/**
* gst_query_parse_buffering_range:
- * @query: a GST_QUERY_SEEKING type query #GstQuery
+ * @query: a GST_QUERY_BUFFERING type query #GstQuery
* @format: (out): the format to set for the @segment_start and @segment_end values
* @start: (out): the start to set
* @stop: (out): the stop to set
}
/**
+ * gst_query_add_buffering_range
+ * @query: a GST_QUERY_BUFFERING type query #GstQuery
+ * @start: start position of the range
+ * @stop: stop position of the range
+ *
+ * Set the buffering-ranges array field in @query. The current last
+ * start position of the array should be inferior to @start.
+ *
+ * Returns: a #gboolean indicating if the range was added or not.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_query_add_buffering_range (GstQuery * query, gint64 start, gint64 stop)
+{
+ GstStructure *structure;
+ GValueArray *array;
+ GValue *last_array_value;
+ const GValue *value;
+ GValue range_value = { 0 };
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, ret);
+
+ if (start >= stop)
+ return ret;
+
+ g_value_init (&range_value, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&range_value, start, stop);
+
+ structure = gst_query_get_structure (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (BUFFERING_RANGES));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ last_array_value = g_value_array_get_nth (array, array->n_values - 1);
+ if (start > gst_value_get_int64_range_min (last_array_value))
+ ret = TRUE;
+ } else {
+ array = g_value_array_new (0);
+ ret = TRUE;
+ }
+
+ if (ret) {
+ g_value_array_append (array, &range_value);
+ gst_structure_id_set (structure, GST_QUARK (BUFFERING_RANGES),
+ G_TYPE_VALUE_ARRAY, array, NULL);
+ }
+
+ g_value_unset (&range_value);
+ if (!value)
+ g_value_array_free (array);
+
+ return ret;
+}
+
+/**
+ * gst_query_get_n_buffering_ranges
+ * @query: a GST_QUERY_BUFFERING type query #GstQuery
+ *
+ * Retrieve the number of values currently stored in the
+ * buffered-ranges array of the query's structure.
+ *
+ * Returns: the range array size as a #guint.
+ *
+ * Since: 0.10.31
+ */
+guint
+gst_query_get_n_buffering_ranges (GstQuery * query)
+{
+ GstStructure *structure;
+ GValueArray *array;
+ const GValue *value;
+ guint size = 0;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, 0);
+
+ structure = gst_query_get_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;
+}
+
+
+/**
+ * gst_query_parse_nth_buffering_range
+ * @query: a GST_QUERY_BUFFERING type query #GstQuery
+ * @index: position in the buffered-ranges array to read
+ * @start: (out): the start position to set
+ * @stop: (out): the stop position to set
+ *
+ * Parse an available query and get the start and stop values stored
+ * at the @index of the buffered ranges array.
+ *
+ * Returns: a #gboolean indicating if the parsing succeeded.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_query_parse_nth_buffering_range (GstQuery * query, guint index,
+ gint64 * start, gint64 * stop)
+{
+ GstStructure *structure;
+ const GValue *value;
+ GValueArray *ranges;
+ GValue *range_value;
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, ret);
+
+ structure = gst_query_get_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) {
+ *start = gst_value_get_int64_range_min (range_value);
+ *stop = gst_value_get_int64_range_max (range_value);
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+
+/**
* gst_query_new_uri:
*
* Constructs a new query URI query object. Use gst_query_unref()
void gst_query_parse_buffering_range (GstQuery *query, GstFormat *format,
gint64 *start, gint64 *stop,
gint64 *estimated_total);
+gboolean gst_query_add_buffering_range (GstQuery *query,
+ gint64 start, gint64 stop);
+
+guint gst_query_get_n_buffering_ranges (GstQuery *query);
+
+gboolean gst_query_parse_nth_buffering_range (GstQuery *query,
+ guint index, gint64 *start,
+ gint64 *stop);
+
/* URI query */
GstQuery * gst_query_new_uri (void);
void gst_query_parse_uri (GstQuery *query, gchar **uri);
gst_query_unref (query);
}
+ /* BUFFERING RANGES */
+ {
+ gint64 start, stop;
+
+ query = gst_query_new_buffering (GST_FORMAT_PERCENT);
+ fail_if (query == NULL);
+ fail_unless (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING);
+
+ fail_unless (gst_query_add_buffering_range (query, 0, 20));
+ fail_unless (gst_query_add_buffering_range (query, 25, 30));
+
+ /* check incoherent range insertion */
+ fail_if (gst_query_add_buffering_range (query, 10, 15));
+ fail_if (gst_query_add_buffering_range (query, 50, 40));
+
+ fail_unless (gst_query_get_n_buffering_ranges (query) == 2);
+
+ fail_unless (gst_query_parse_nth_buffering_range (query, 0, &start, &stop));
+ fail_unless (start == 0);
+ fail_unless (stop == 20);
+
+ fail_unless (gst_query_parse_nth_buffering_range (query, 1, &start, &stop));
+ fail_unless (start == 25);
+ fail_unless (stop == 30);
+
+ gst_query_unref (query);
+ }
{
/* FIXME make tests for:
*