mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-31 11:32:38 +00:00
pad: Implement more useful default handling for the LATENCY query
Before we just took the values from the first pad that succeded the query, now we accumulate the results of every sinkpad properly and return that result.
This commit is contained in:
parent
fd3a064c97
commit
1937d09a95
1 changed files with 105 additions and 1 deletions
106
gst/gstpad.c
106
gst/gstpad.c
|
@ -3050,6 +3050,107 @@ done:
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Default latency implementation */
|
||||
typedef struct
|
||||
{
|
||||
gboolean live;
|
||||
GstClockTime min, max;
|
||||
} LatencyFoldData;
|
||||
|
||||
static gboolean
|
||||
query_latency_default_fold (const GValue * item, GValue * ret,
|
||||
gpointer user_data)
|
||||
{
|
||||
GstPad *pad = g_value_get_object (item);
|
||||
LatencyFoldData *fold_data = user_data;
|
||||
GstQuery *query;
|
||||
gboolean res;
|
||||
|
||||
query = gst_query_new_latency ();
|
||||
res = gst_pad_peer_query (pad, query);
|
||||
|
||||
if (res) {
|
||||
gboolean live;
|
||||
GstClockTime min, max;
|
||||
|
||||
gst_query_parse_latency (query, &live, &min, &max);
|
||||
|
||||
GST_LOG_OBJECT (pad, "got latency live:%s min:%" G_GINT64_FORMAT
|
||||
" max:%" G_GINT64_FORMAT, live ? "true" : "false", min, max);
|
||||
|
||||
if (live) {
|
||||
if (min > fold_data->min)
|
||||
fold_data->min = min;
|
||||
|
||||
if (fold_data->max == GST_CLOCK_TIME_NONE)
|
||||
fold_data->max = max;
|
||||
else if (max < fold_data->max)
|
||||
fold_data->max = max;
|
||||
|
||||
fold_data->live = TRUE;
|
||||
}
|
||||
g_value_set_boolean (ret, TRUE);
|
||||
}
|
||||
gst_query_unref (query);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_pad_query_latency_default (GstPad * pad, GstQuery * query)
|
||||
{
|
||||
GstIterator *it;
|
||||
GstIteratorResult res;
|
||||
GValue ret = G_VALUE_INIT;
|
||||
gboolean query_ret;
|
||||
LatencyFoldData fold_data;
|
||||
|
||||
it = gst_pad_iterate_internal_links (pad);
|
||||
|
||||
retry:
|
||||
fold_data.live = FALSE;
|
||||
fold_data.min = 0;
|
||||
fold_data.max = GST_CLOCK_TIME_NONE;
|
||||
|
||||
g_value_init (&ret, G_TYPE_BOOLEAN);
|
||||
g_value_set_boolean (&ret, FALSE);
|
||||
res = gst_iterator_fold (it, query_latency_default_fold, &ret, &fold_data);
|
||||
switch (res) {
|
||||
case GST_ITERATOR_OK:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
case GST_ITERATOR_DONE:
|
||||
break;
|
||||
case GST_ITERATOR_ERROR:
|
||||
g_value_set_boolean (&ret, FALSE);
|
||||
break;
|
||||
case GST_ITERATOR_RESYNC:
|
||||
gst_iterator_resync (it);
|
||||
goto retry;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
}
|
||||
gst_iterator_free (it);
|
||||
|
||||
query_ret = g_value_get_boolean (&ret);
|
||||
if (query_ret) {
|
||||
GST_LOG_OBJECT (pad, "got latency live:%s min:%" G_GINT64_FORMAT
|
||||
" max:%" G_GINT64_FORMAT, fold_data.live ? "true" : "false",
|
||||
fold_data.min, fold_data.max);
|
||||
|
||||
if (fold_data.min > fold_data.max) {
|
||||
GST_ERROR_OBJECT (pad, "minimum latency bigger than maximum latency");
|
||||
}
|
||||
|
||||
gst_query_set_latency (query, fold_data.live, fold_data.min, fold_data.max);
|
||||
} else {
|
||||
GST_LOG_OBJECT (pad, "latency query failed");
|
||||
}
|
||||
|
||||
return query_ret;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GstQuery *query;
|
||||
|
@ -3105,10 +3206,13 @@ gst_pad_query_default (GstPad * pad, GstObject * parent, GstQuery * query)
|
|||
ret = gst_pad_query_caps_default (pad, query);
|
||||
forward = FALSE;
|
||||
break;
|
||||
case GST_QUERY_LATENCY:
|
||||
ret = gst_pad_query_latency_default (pad, query);
|
||||
forward = FALSE;
|
||||
break;
|
||||
case GST_QUERY_POSITION:
|
||||
case GST_QUERY_SEEKING:
|
||||
case GST_QUERY_FORMATS:
|
||||
case GST_QUERY_LATENCY:
|
||||
case GST_QUERY_JITTER:
|
||||
case GST_QUERY_RATE:
|
||||
case GST_QUERY_CONVERT:
|
||||
|
|
Loading…
Reference in a new issue