audioaggregator: On timeout, resync pads with not enough data
authorOlivier Crête <olivier.crete@collabora.com>
Mon, 16 Mar 2015 21:06:46 +0000 (17:06 -0400)
committerOlivier Crête <olivier.crete@collabora.com>
Thu, 30 Jul 2015 18:00:05 +0000 (14:00 -0400)
https://bugzilla.gnome.org/show_bug.cgi?id=745768

gst/audiomixer/gstaudioaggregator.c

index 351b1d7..ca06a66 100644 (file)
@@ -1271,6 +1271,20 @@ gst_audio_aggregator_aggregate (GstAggregator * agg, gboolean timeout)
   aagg->priv->offset = next_offset;
   agg->segment.position = next_timestamp;
 
+  /* If there was a timeout and there was a gap in data in out of the streams,
+   * then it's a very good time to for a resync with the timestamps.
+   */
+  if (timeout) {
+    for (iter = element->sinkpads; iter; iter = iter->next) {
+      GstAudioAggregatorPad *pad = GST_AUDIO_AGGREGATOR_PAD (iter->data);
+
+      GST_OBJECT_LOCK (pad);
+      if (pad->priv->output_offset < aagg->priv->offset)
+        pad->priv->output_offset = -1;
+      GST_OBJECT_UNLOCK (pad);
+    }
+  }
+
   GST_OBJECT_UNLOCK (agg);
 
   /* send it out */