From bd66c6b665d882a65f34cdc0fcaffe8fc865e98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 15 Jun 2015 18:30:20 +0200 Subject: [PATCH] aggregator: Add property to select how to decide on a start time Before aggregator based elements always started at running time 0, now it's possible to select the first input buffer running time or explicitly set a start-time value. https://bugzilla.gnome.org/show_bug.cgi?id=749966 --- gst-libs/gst/video/gstvideoaggregator.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/gst-libs/gst/video/gstvideoaggregator.c b/gst-libs/gst/video/gstvideoaggregator.c index 66549d191b..167c09983e 100644 --- a/gst-libs/gst/video/gstvideoaggregator.c +++ b/gst-libs/gst/video/gstvideoaggregator.c @@ -604,12 +604,11 @@ gst_videoaggregator_src_setcaps (GstVideoAggregator * vagg, GstCaps * caps) if (GST_VIDEO_INFO_FPS_N (&vagg->info) != GST_VIDEO_INFO_FPS_N (&info) || GST_VIDEO_INFO_FPS_D (&vagg->info) != GST_VIDEO_INFO_FPS_D (&info)) { if (agg->segment.position != -1) { - vagg->priv->ts_offset = agg->segment.position - agg->segment.start; vagg->priv->nframes = 0; + /* The timestamp offset will be updated based on the + * segment position the next time we aggregate */ GST_DEBUG_OBJECT (vagg, - "Updating timestamp offset to %" GST_TIME_FORMAT " for segment %" - GST_SEGMENT_FORMAT, GST_TIME_ARGS (vagg->priv->ts_offset), - &agg->segment); + "Resetting frame counter because of framerate change"); } gst_videoaggregator_reset_qos (vagg); } @@ -1368,6 +1367,11 @@ gst_videoaggregator_aggregate (GstAggregator * agg, gboolean timeout) } output_start_time = gst_videoaggregator_get_next_time (agg); + if (vagg->priv->nframes == 0) { + vagg->priv->ts_offset = output_start_time; + GST_DEBUG_OBJECT (vagg, "New ts offset %" GST_TIME_FORMAT, + GST_TIME_ARGS (output_start_time)); + } if (GST_VIDEO_INFO_FPS_N (&vagg->info) == 0) output_end_time = -1; @@ -1376,7 +1380,7 @@ gst_videoaggregator_aggregate (GstAggregator * agg, gboolean timeout) vagg->priv->ts_offset + gst_util_uint64_scale_round (vagg->priv->nframes + 1, GST_SECOND * GST_VIDEO_INFO_FPS_D (&vagg->info), - GST_VIDEO_INFO_FPS_N (&vagg->info)) + agg->segment.start; + GST_VIDEO_INFO_FPS_N (&vagg->info)); if (agg->segment.stop != -1) output_end_time = MIN (output_end_time, agg->segment.stop);