aggregator: add latency query handling
This commit is contained in:
parent
9aa89185ed
commit
b30f8985d5
@ -1324,87 +1324,6 @@ gst_videoaggregator_query_duration (GstVideoAggregator * vagg, GstQuery * query)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_videoaggregator_query_latency (GstVideoAggregator * vagg, GstQuery * query)
|
|
||||||
{
|
|
||||||
GstClockTime min, max;
|
|
||||||
gboolean live;
|
|
||||||
gboolean res;
|
|
||||||
GstIterator *it;
|
|
||||||
gboolean done;
|
|
||||||
GValue item = { 0 };
|
|
||||||
|
|
||||||
res = TRUE;
|
|
||||||
done = FALSE;
|
|
||||||
live = FALSE;
|
|
||||||
min = 0;
|
|
||||||
max = GST_CLOCK_TIME_NONE;
|
|
||||||
|
|
||||||
/* Take maximum of all latency values */
|
|
||||||
it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (vagg));
|
|
||||||
while (!done) {
|
|
||||||
switch (gst_iterator_next (it, &item)) {
|
|
||||||
case GST_ITERATOR_DONE:
|
|
||||||
done = TRUE;
|
|
||||||
break;
|
|
||||||
case GST_ITERATOR_OK:
|
|
||||||
{
|
|
||||||
GstPad *pad = g_value_get_object (&item);
|
|
||||||
GstQuery *peerquery;
|
|
||||||
GstClockTime min_cur, max_cur;
|
|
||||||
gboolean live_cur;
|
|
||||||
|
|
||||||
peerquery = gst_query_new_latency ();
|
|
||||||
|
|
||||||
/* Ask peer for latency */
|
|
||||||
res &= gst_pad_peer_query (pad, peerquery);
|
|
||||||
|
|
||||||
/* take max from all valid return values */
|
|
||||||
if (res) {
|
|
||||||
gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur);
|
|
||||||
|
|
||||||
if (min_cur > min)
|
|
||||||
min = min_cur;
|
|
||||||
|
|
||||||
if (max_cur != GST_CLOCK_TIME_NONE &&
|
|
||||||
((max != GST_CLOCK_TIME_NONE && max_cur > max) ||
|
|
||||||
(max == GST_CLOCK_TIME_NONE)))
|
|
||||||
max = max_cur;
|
|
||||||
|
|
||||||
live = live || live_cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_query_unref (peerquery);
|
|
||||||
g_value_reset (&item);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GST_ITERATOR_RESYNC:
|
|
||||||
live = FALSE;
|
|
||||||
min = 0;
|
|
||||||
max = GST_CLOCK_TIME_NONE;
|
|
||||||
res = TRUE;
|
|
||||||
gst_iterator_resync (it);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
res = FALSE;
|
|
||||||
done = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_value_unset (&item);
|
|
||||||
gst_iterator_free (it);
|
|
||||||
|
|
||||||
if (res) {
|
|
||||||
/* store the results */
|
|
||||||
GST_DEBUG_OBJECT (vagg, "Calculated total latency: live %s, min %"
|
|
||||||
GST_TIME_FORMAT ", max %" GST_TIME_FORMAT,
|
|
||||||
(live ? "yes" : "no"), GST_TIME_ARGS (min), GST_TIME_ARGS (max));
|
|
||||||
gst_query_set_latency (query, live, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_videoaggregator_src_query (GstAggregator * agg, GstQuery * query)
|
gst_videoaggregator_src_query (GstAggregator * agg, GstQuery * query)
|
||||||
{
|
{
|
||||||
@ -1434,8 +1353,6 @@ gst_videoaggregator_src_query (GstAggregator * agg, GstQuery * query)
|
|||||||
res = gst_videoaggregator_query_duration (vagg, query);
|
res = gst_videoaggregator_query_duration (vagg, query);
|
||||||
break;
|
break;
|
||||||
case GST_QUERY_LATENCY:
|
case GST_QUERY_LATENCY:
|
||||||
res = gst_videoaggregator_query_latency (vagg, query);
|
|
||||||
break;
|
|
||||||
case GST_QUERY_CAPS:
|
case GST_QUERY_CAPS:
|
||||||
res =
|
res =
|
||||||
GST_AGGREGATOR_CLASS (gst_videoaggregator_parent_class)->src_query
|
GST_AGGREGATOR_CLASS (gst_videoaggregator_parent_class)->src_query
|
||||||
|
Loading…
x
Reference in New Issue
Block a user