From c9ff3e4f9867767e51dfa2bafd79f2a302f6305c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 25 Sep 2013 15:17:32 +0200 Subject: [PATCH] audiobasesink: do big correction for large drift If we are using skew slaving and we drift more than twice the allowed amount, do a big correction to get back on track more quickly. --- gst-libs/gst/audio/gstaudiobasesink.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gst-libs/gst/audio/gstaudiobasesink.c b/gst-libs/gst/audio/gstaudiobasesink.c index 4062fd5ab4..33d73c3cd6 100644 --- a/gst-libs/gst/audio/gstaudiobasesink.c +++ b/gst-libs/gst/audio/gstaudiobasesink.c @@ -1272,8 +1272,14 @@ gst_audio_base_sink_skew_slaving (GstAudioBaseSink * sink, GST_WARNING_OBJECT (sink, "correct clock skew %" G_GINT64_FORMAT " > %" G_GINT64_FORMAT, sink->priv->avg_skew, mdrift2); - cexternal = cexternal > mdrift ? cexternal - mdrift : 0; - sink->priv->avg_skew -= mdrift; + + if (sink->priv->avg_skew > (2 * mdrift)) { + cexternal -= sink->priv->avg_skew; + sink->priv->avg_skew = 0; + } else { + cexternal = cexternal > mdrift ? cexternal - mdrift : 0; + sink->priv->avg_skew -= mdrift; + } driftsamples = (sink->ringbuffer->spec.info.rate * mdrift) / GST_SECOND; last_align = sink->priv->last_align; @@ -1294,8 +1300,14 @@ gst_audio_base_sink_skew_slaving (GstAudioBaseSink * sink, GST_WARNING_OBJECT (sink, "correct clock skew %" G_GINT64_FORMAT " < %" G_GINT64_FORMAT, sink->priv->avg_skew, -mdrift2); - cexternal += mdrift; - sink->priv->avg_skew += mdrift; + + if (sink->priv->avg_skew < (2 * -mdrift)) { + cexternal -= sink->priv->avg_skew; + sink->priv->avg_skew = 0; + } else { + cexternal += mdrift; + sink->priv->avg_skew += mdrift; + } driftsamples = (sink->ringbuffer->spec.info.rate * mdrift) / GST_SECOND; last_align = sink->priv->last_align;