mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-13 10:55:34 +00:00
baseaudiosink: start ringbuffer upon going to PLAYING and already EOS
... otherwise we may end up without running clock in PLAYING. Fixes #636886.
This commit is contained in:
parent
cf9aaffcb9
commit
ba2e500bd9
1 changed files with 8 additions and 10 deletions
|
@ -56,7 +56,6 @@ struct _GstBaseAudioSinkPrivate
|
||||||
gboolean sync_latency;
|
gboolean sync_latency;
|
||||||
|
|
||||||
GstClockTime eos_time;
|
GstClockTime eos_time;
|
||||||
gint eos_rendering;
|
|
||||||
|
|
||||||
gboolean do_time_offset;
|
gboolean do_time_offset;
|
||||||
/* number of microseconds we alow timestamps or clock slaving to drift
|
/* number of microseconds we alow timestamps or clock slaving to drift
|
||||||
|
@ -837,10 +836,6 @@ gst_base_audio_sink_drain (GstBaseAudioSink * sink)
|
||||||
if (!sink->ringbuffer->spec.rate)
|
if (!sink->ringbuffer->spec.rate)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* if PLAYING is interrupted,
|
|
||||||
* arrange to have clock running when going to PLAYING again */
|
|
||||||
g_atomic_int_set (&sink->priv->eos_rendering, 1);
|
|
||||||
|
|
||||||
/* need to start playback before we can drain, but only when
|
/* need to start playback before we can drain, but only when
|
||||||
* we have successfully negotiated a format and thus acquired the
|
* we have successfully negotiated a format and thus acquired the
|
||||||
* ringbuffer. */
|
* ringbuffer. */
|
||||||
|
@ -858,7 +853,6 @@ gst_base_audio_sink_drain (GstBaseAudioSink * sink)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (sink, "drained audio");
|
GST_DEBUG_OBJECT (sink, "drained audio");
|
||||||
}
|
}
|
||||||
g_atomic_int_set (&sink->priv->eos_rendering, 0);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1888,7 +1882,6 @@ gst_base_audio_sink_change_state (GstElement * element,
|
||||||
sink->next_sample = -1;
|
sink->next_sample = -1;
|
||||||
sink->priv->last_align = -1;
|
sink->priv->last_align = -1;
|
||||||
sink->priv->eos_time = -1;
|
sink->priv->eos_time = -1;
|
||||||
sink->priv->eos_rendering = 0;
|
|
||||||
gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
|
gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
|
||||||
gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
|
gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
|
||||||
|
|
||||||
|
@ -1903,19 +1896,24 @@ gst_base_audio_sink_change_state (GstElement * element,
|
||||||
sink->provided_clock, TRUE));
|
sink->provided_clock, TRUE));
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
||||||
|
{
|
||||||
|
gboolean eos;
|
||||||
|
|
||||||
GST_OBJECT_LOCK (sink);
|
GST_OBJECT_LOCK (sink);
|
||||||
GST_DEBUG_OBJECT (sink, "ringbuffer may start now");
|
GST_DEBUG_OBJECT (sink, "ringbuffer may start now");
|
||||||
sink->priv->sync_latency = TRUE;
|
sink->priv->sync_latency = TRUE;
|
||||||
|
eos = GST_BASE_SINK (sink)->eos;
|
||||||
GST_OBJECT_UNLOCK (sink);
|
GST_OBJECT_UNLOCK (sink);
|
||||||
|
|
||||||
gst_ring_buffer_may_start (sink->ringbuffer, TRUE);
|
gst_ring_buffer_may_start (sink->ringbuffer, TRUE);
|
||||||
if (GST_BASE_SINK_CAST (sink)->pad_mode == GST_ACTIVATE_PULL ||
|
if (GST_BASE_SINK_CAST (sink)->pad_mode == GST_ACTIVATE_PULL || eos) {
|
||||||
g_atomic_int_get (&sink->priv->eos_rendering)) {
|
|
||||||
/* we always start the ringbuffer in pull mode immediatly */
|
/* we always start the ringbuffer in pull mode immediatly */
|
||||||
/* sync rendering on eos needs running clock */
|
/* sync rendering on eos needs running clock,
|
||||||
|
* and others need running clock when finished rendering eos */
|
||||||
gst_ring_buffer_start (sink->ringbuffer);
|
gst_ring_buffer_start (sink->ringbuffer);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||||
/* ringbuffer cannot start anymore */
|
/* ringbuffer cannot start anymore */
|
||||||
gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
|
gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
|
||||||
|
|
Loading…
Reference in a new issue