aggregator: Add function to allow subclasses to set their own latency
authorSebastian Dröge <sebastian@centricular.com>
Wed, 17 Dec 2014 18:51:32 +0000 (19:51 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 17 Dec 2014 18:51:32 +0000 (19:51 +0100)
For audiomixer this is one blocksize, for videoaggregator this should
be the duration of one output frame.

gst-libs/gst/base/gstaggregator.c
gst-libs/gst/base/gstaggregator.h
gst-libs/gst/video/gstvideoaggregator.c
gst/audiomixer/gstaudiomixer.c

index 16690f45682efa2d8c99c1ca68ef59b94ed47e3e..7e5b70e36c156d8796e114253eea6fc53373101f 100644 (file)
@@ -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)));
+}
index d11545cb5debc58ab0159de81368113720094203..042d2e795fec76ddde55729b9268084b745c7dd7 100644 (file)
@@ -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*/
index 898de598f2972a5f2a0d07293484fa4e51d9a0f6..a8c004d0fe802da333659382cb63d50974e1b293 100644 (file)
@@ -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);
   }
index d04e29ebab1f79798509047d2c2911bdfbab367a..35597503438479341528b21963039450699ba982 100644 (file)
@@ -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;