hlsdemux: fix clearing of eos state in pads

The internal pad still keeps its EOS flag and event as it can be assigned
after the flush-start/stop pair is sent. The EOS is assigned from the streaming
thread so this is racy.

To be sure to clear it, it has to be done after setting the source to READY to
be sure that its streaming thread isn't running.

https://bugzilla.gnome.org/show_bug.cgi?id=736012
This commit is contained in:
Thiago Santos 2014-09-17 17:27:25 -03:00
parent 24c99712a8
commit 07b59c93c2

View file

@ -1044,6 +1044,31 @@ _src_query (GstPad * pad, GstObject * parent, GstQuery * query)
return gst_pad_query_default (pad, parent, query);
}
static gboolean
_hls_demux_pad_remove_eos_sticky (GstPad * pad, GstEvent ** event,
gpointer udata)
{
if (GST_EVENT_TYPE (*event) == GST_EVENT_EOS) {
gst_event_replace (event, NULL);
return FALSE;
}
return TRUE;
}
static void
gst_hls_demux_stream_clear_eos_state (GstHLSDemux * demux)
{
GstPad *internal_pad;
internal_pad =
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (demux->srcpad)));
gst_pad_sticky_events_foreach (internal_pad,
_hls_demux_pad_remove_eos_sticky, NULL);
GST_OBJECT_FLAG_UNSET (internal_pad, GST_PAD_FLAG_EOS);
gst_object_unref (internal_pad);
}
static void
switch_pads (GstHLSDemux * demux)
{
@ -2146,6 +2171,9 @@ gst_hls_demux_get_next_fragment (GstHLSDemux * demux,
NULL)));
}
/* clear the ghostpad eos state */
gst_hls_demux_stream_clear_eos_state (demux);
if (demux->last_ret != GST_FLOW_OK)
return FALSE;