From 06a4e80be915193913c83f9d1de91f9d9a0df64b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 17 Dec 2014 19:51:32 +0100 Subject: [PATCH] aggregator: Add function to allow subclasses to set their own latency For audiomixer this is one blocksize, for videoaggregator this should be the duration of one output frame. --- gst-libs/gst/base/gstaggregator.c | 38 +++++++++++++++++++++++-- gst-libs/gst/base/gstaggregator.h | 4 +++ gst-libs/gst/video/gstvideoaggregator.c | 3 ++ gst/audiomixer/gstaudiomixer.c | 3 ++ 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/gst-libs/gst/base/gstaggregator.c b/gst-libs/gst/base/gstaggregator.c index 16690f4568..7e5b70e36c 100644 --- a/gst-libs/gst/base/gstaggregator.c +++ b/gst-libs/gst/base/gstaggregator.c @@ -243,6 +243,9 @@ struct _GstAggregatorPrivate GstClockTime latency_min; GstClockTime latency_max; + GstClockTime sub_latency_min; + GstClockTime sub_latency_max; + /* aggregate */ GstClockID aggregate_id; gint n_kicks; @@ -1040,6 +1043,11 @@ gst_aggregator_get_latency (GstAggregator * self, gboolean * live, min = self->priv->latency_min; max = self->priv->latency_max; + min += self->priv->sub_latency_min; + if (GST_CLOCK_TIME_IS_VALID (max) + && GST_CLOCK_TIME_IS_VALID (self->priv->sub_latency_max)) + max += self->priv->sub_latency_max; + if (GST_CLOCK_TIME_IS_VALID (self->latency)) { min += self->latency; if (GST_CLOCK_TIME_IS_VALID (max)) @@ -1553,8 +1561,8 @@ gst_aggregator_init (GstAggregator * self, GstAggregatorClass * klass) priv->tags_changed = FALSE; self->priv->latency_live = FALSE; - self->priv->latency_min = 0; - self->priv->latency_max = GST_CLOCK_TIME_NONE; + self->priv->latency_min = self->priv->sub_latency_min = 0; + self->priv->latency_max = self->priv->sub_latency_max = GST_CLOCK_TIME_NONE; _reset_flow_values (self); self->srcpad = gst_pad_new_from_template (pad_template, "src"); @@ -1923,3 +1931,29 @@ gst_aggregator_merge_tags (GstAggregator * self, self->priv->tags_changed = TRUE; GST_OBJECT_UNLOCK (self); } + +/** + * gst_aggregator_set_latency: + * @self: a #GstAggregator + * @min_latency: minimum latency + * @max_latency: maximum latency + * + * Lets #GstAggregator sub-classes tell the baseclass what their internal + * latency is. Will also post a LATENCY message on the bus so the pipeline + * can reconfigure its global latency. + */ +void +gst_aggregator_set_latency (GstAggregator * self, + GstClockTime min_latency, GstClockTime max_latency) +{ + g_return_if_fail (GST_IS_AGGREGATOR (self)); + g_return_if_fail (max_latency >= min_latency); + + GST_OBJECT_LOCK (self); + self->priv->sub_latency_min = min_latency; + self->priv->sub_latency_max = max_latency; + GST_OBJECT_UNLOCK (self); + + gst_element_post_message (GST_ELEMENT_CAST (self), + gst_message_new_latency (GST_OBJECT_CAST (self))); +} diff --git a/gst-libs/gst/base/gstaggregator.h b/gst-libs/gst/base/gstaggregator.h index d11545cb5d..042d2e795f 100644 --- a/gst-libs/gst/base/gstaggregator.h +++ b/gst-libs/gst/base/gstaggregator.h @@ -259,6 +259,10 @@ GstFlowReturn gst_aggregator_finish_buffer (GstAggregator void gst_aggregator_set_src_caps (GstAggregator * agg, GstCaps * caps); +void gst_aggregator_set_latency (GstAggregator * self, + GstClockTime min_latency, + GstClockTime max_latency); + GType gst_aggregator_get_type(void); /* API that should eventually land in GstElement itself*/ diff --git a/gst-libs/gst/video/gstvideoaggregator.c b/gst-libs/gst/video/gstvideoaggregator.c index 898de598f2..a8c004d0fe 100644 --- a/gst-libs/gst/video/gstvideoaggregator.c +++ b/gst-libs/gst/video/gstvideoaggregator.c @@ -597,6 +597,9 @@ gst_videoaggregator_src_setcaps (GstVideoAggregator * vagg, GstCaps * caps) GST_VIDEO_AGGREGATOR_UNLOCK (vagg); gst_aggregator_set_src_caps (agg, caps); + gst_aggregator_set_latency (agg, gst_util_uint64_scale (GST_SECOND, + GST_VIDEO_INFO_FPS_D (&info), GST_VIDEO_INFO_FPS_N (&info)), + GST_CLOCK_TIME_NONE); GST_VIDEO_AGGREGATOR_LOCK (vagg); } diff --git a/gst/audiomixer/gstaudiomixer.c b/gst/audiomixer/gstaudiomixer.c index d04e29ebab..3559750343 100644 --- a/gst/audiomixer/gstaudiomixer.c +++ b/gst/audiomixer/gstaudiomixer.c @@ -1378,6 +1378,9 @@ gst_audiomixer_aggregate (GstAggregator * agg, gboolean timeout) if (audiomixer->send_caps) { gst_aggregator_set_src_caps (agg, audiomixer->current_caps); + gst_aggregator_set_latency (agg, + gst_util_uint64_scale (audiomixer->blocksize, GST_SECOND, + GST_AUDIO_INFO_RATE (&audiomixer->info)), GST_CLOCK_TIME_NONE); if (agg->segment.rate > 0.0) agg->segment.position = agg->segment.start;