[0.11] gst-plugins-base: baseaudiosink: arrange for running clock when rendering eos

Wim Taymans wtay at kemper.freedesktop.org
Thu Mar 31 09:41:15 PDT 2011


Module: gst-plugins-base
Branch: 0.11
Commit: e73f293ee560379d3667c832be8165042a186877
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=e73f293ee560379d3667c832be8165042a186877

Author: Mark Nauwelaerts <mark.nauwelaerts at collabora.co.uk>
Date:   Mon Mar 28 22:00:25 2011 +0200

baseaudiosink: arrange for running clock when rendering eos

Commit ba2e500bd992d8ad7db0da923801964964835967 ensured to provide
a running clock when EOS had finished rendering.  However,
other measures are needed (and were in place before) to ensure a
running clock when EOS still needs rendering (i.e. waiting).

So, specifically, re-introduce eos_rendering removed in aforementioned commit,
this time as a public variable so subclasses can be aware of the situation.

Fixes (part of) #645961.

API: GstBaseAudioSink:eos_rendering

---

 gst-libs/gst/audio/gstbaseaudiosink.c |    8 +++++++-
 gst-libs/gst/audio/gstbaseaudiosink.h |    9 ++++++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/gst-libs/gst/audio/gstbaseaudiosink.c b/gst-libs/gst/audio/gstbaseaudiosink.c
index f8b18b0..c0f6008 100644
--- a/gst-libs/gst/audio/gstbaseaudiosink.c
+++ b/gst-libs/gst/audio/gstbaseaudiosink.c
@@ -836,6 +836,10 @@ gst_base_audio_sink_drain (GstBaseAudioSink * sink)
   if (!sink->ringbuffer->spec.rate)
     return TRUE;
 
+  /* if PLAYING is interrupted,
+   * arrange to have clock running when going to PLAYING again */
+  g_atomic_int_set (&sink->abidata.ABI.eos_rendering, 1);
+
   /* need to start playback before we can drain, but only when
    * we have successfully negotiated a format and thus acquired the
    * ringbuffer. */
@@ -853,6 +857,7 @@ gst_base_audio_sink_drain (GstBaseAudioSink * sink)
 
     GST_DEBUG_OBJECT (sink, "drained audio");
   }
+  g_atomic_int_set (&sink->abidata.ABI.eos_rendering, 0);
   return TRUE;
 }
 
@@ -1906,7 +1911,8 @@ gst_base_audio_sink_change_state (GstElement * element,
       GST_OBJECT_UNLOCK (sink);
 
       gst_ring_buffer_may_start (sink->ringbuffer, TRUE);
-      if (GST_BASE_SINK_CAST (sink)->pad_mode == GST_ACTIVATE_PULL || eos) {
+      if (GST_BASE_SINK_CAST (sink)->pad_mode == GST_ACTIVATE_PULL ||
+          g_atomic_int_get (&sink->abidata.ABI.eos_rendering) || eos) {
         /* we always start the ringbuffer in pull mode immediatly */
         /* sync rendering on eos needs running clock,
          * and others need running clock when finished rendering eos */
diff --git a/gst-libs/gst/audio/gstbaseaudiosink.h b/gst-libs/gst/audio/gstbaseaudiosink.h
index c4d7a01..12a90f9 100644
--- a/gst-libs/gst/audio/gstbaseaudiosink.h
+++ b/gst-libs/gst/audio/gstbaseaudiosink.h
@@ -127,7 +127,14 @@ struct _GstBaseAudioSink {
   /*< private >*/
   GstBaseAudioSinkPrivate *priv;
 
-  gpointer _gst_reserved[GST_PADDING - 1];
+  union {
+    struct {
+      /*< protected >*/
+      /* with g_atomic_; currently rendering eos */
+      gboolean   eos_rendering;
+    } ABI;
+    gpointer _gst_reserved[GST_PADDING - 1];
+  } abidata;
 };
 
 /**



More information about the gstreamer-commits mailing list