diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2013-09-25 15:17:32 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2013-09-25 16:03:07 +0200 |
commit | c9ff3e4f9867767e51dfa2bafd79f2a302f6305c (patch) | |
tree | 0bfdf31ad15b94eed5988ca320254791ea3b7e79 | |
parent | 24f3c80fef68402d5c9f951961fbf91c49f4d466 (diff) |
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.
-rw-r--r-- | gst-libs/gst/audio/gstaudiobasesink.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/gst-libs/gst/audio/gstaudiobasesink.c b/gst-libs/gst/audio/gstaudiobasesink.c index 4062fd5ab..33d73c3cd 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; |