summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2013-09-25 15:17:32 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2013-09-25 16:03:07 +0200
commitc9ff3e4f9867767e51dfa2bafd79f2a302f6305c (patch)
tree0bfdf31ad15b94eed5988ca320254791ea3b7e79
parent24f3c80fef68402d5c9f951961fbf91c49f4d466 (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.c20
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;