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)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 2 Dec 2017 15:10:26 +0000 (15:10 +0000)
For audiomixer this is one blocksize, for videoaggregator this should
be the duration of one output frame.

libs/gst/base/gstaggregator.c
libs/gst/base/gstaggregator.h

index 16690f4..7e5b70e 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 d11545c..042d2e7 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*/