audioaggregator: Only skip the remaining part of a GAP buffer
authorSebastian Dröge <sebastian@centricular.com>
Fri, 18 Sep 2015 16:00:05 +0000 (18:00 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 18 Sep 2015 16:00:05 +0000 (18:00 +0200)
We might've queued up a GAP buffer that is only partially inside the current
output buffer (i.e. we received it too late!). In that case we should only
skip the part of the GAP buffer that is inside the current output buffer, not
also the remaining part. Otherwise we forward this pad too far into the future
and break synchronization.

gst/audiomixer/gstaudioaggregator.c

index 1d3dcb56b4f2f144c7e65ca6972e843e8d60b3ac..156fa93626a49052c38c893e4f769ab138871637 100644 (file)
@@ -976,7 +976,7 @@ gst_audio_aggregator_mix_buffer (GstAudioAggregator * aagg,
   if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP)) {
     /* skip gap buffer */
     GST_LOG_OBJECT (pad, "skipping GAP buffer");
-    pad->priv->output_offset += pad->priv->size;
+    pad->priv->output_offset += pad->priv->size - pad->priv->position;
     pad->priv->position = pad->priv->size;
 
     gst_buffer_replace (&pad->priv->buffer, NULL);