From ac1cc82165da09017affc9135dca89a5cd88cd00 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 21 Nov 2007 18:02:21 +0000 Subject: [PATCH] gst-libs/gst/audio/gstbaseaudiosink.c: Our EOS time contains the base_time, _wait_eos() expects a running_time so we ... Original commit message from CVS: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_drain): Our EOS time contains the base_time, _wait_eos() expects a running_time so we have to subtract the base_time again before calling the function. This fixes an EOS regression where the base_time was added twice and EOS took longer and longer in certain situations. Fixes #498767. --- ChangeLog | 10 ++++++++++ gst-libs/gst/audio/gstbaseaudiosink.c | 14 ++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/ChangeLog b/ChangeLog index baa586de08..c848f1f37f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2007-11-21 Wim Taymans + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_drain): + Our EOS time contains the base_time, _wait_eos() expects a running_time + so we have to subtract the base_time again before calling the function. + This fixes an EOS regression where the base_time was added twice and EOS + took longer and longer in certain situations. + Fixes #498767. + 2007-11-21 Wim Taymans * docs/libs/gst-plugins-base-libs-sections.txt: diff --git a/gst-libs/gst/audio/gstbaseaudiosink.c b/gst-libs/gst/audio/gstbaseaudiosink.c index 98a63e834f..a7d8534910 100644 --- a/gst-libs/gst/audio/gstbaseaudiosink.c +++ b/gst-libs/gst/audio/gstbaseaudiosink.c @@ -639,6 +639,8 @@ gst_base_audio_sink_get_times (GstBaseSink * bsink, GstBuffer * buffer, static gboolean gst_base_audio_sink_drain (GstBaseAudioSink * sink) { + GstClockTime base_time; + if (!sink->ringbuffer) return TRUE; if (!sink->ringbuffer->spec.rate) @@ -662,6 +664,18 @@ gst_base_audio_sink_drain (GstBaseAudioSink * sink) "last sample %" G_GUINT64_FORMAT ", time %" GST_TIME_FORMAT, sink->next_sample, GST_TIME_ARGS (time)); + /* our time already includes the base_time, _wait_eos() wants a running_time + * so we have to subtract the base_time again here. FIXME, store an + * unadjusted EOS time so that we don't have to do this. */ + GST_OBJECT_LOCK (sink); + base_time = GST_ELEMENT_CAST (sink)->base_time; + GST_OBJECT_UNLOCK (sink); + + if (time > base_time) + time -= base_time; + else + time = 0; + /* wait for the EOS time to be reached, this is the time when the last * sample is played. */ gst_base_sink_wait_eos (GST_BASE_SINK (sink), time, NULL);