}
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
gst_videoaggregator_src_query (GstAggregator * agg, GstQuery * query)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg);
res = gst_videoaggregator_query_duration (vagg, query);
break;
case GST_QUERY_LATENCY:
- res = gst_videoaggregator_query_latency (vagg, query);
- break;
case GST_QUERY_CAPS:
res =
GST_AGGREGATOR_CLASS (gst_videoaggregator_parent_class)->src_query