summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <ts.santos@sisa.samsung.com>2014-04-29 15:17:00 -0300
committerThiago Santos <ts.santos@sisa.samsung.com>2014-04-29 18:49:15 -0300
commitf16560c520de6b2e3972c6596d948b3834fede55 (patch)
treebe7b9b0a741cd19278ce0636b79a73979bf92d07
parent587851ba103aef22d4d83665792bb9a09edb7bea (diff)
downloadgstreamer-plugins-bad-f16560c520de6b2e3972c6596d948b3834fede55.tar.gz
hlsdemux: Improve pad switching conditions
When using the internal source, hlsdemux doesn't know the caps of the input before adding the pad, so remove the arguments that would use that as it is always NULL. And use an specific flag to signal when a pad switch is required. Using the discont flag is a bad idea now because when a fragment download fails it will lead to exposing a pad group without any data, causing decodebin to abort.
-rw-r--r--ext/hls/gsthlsdemux.c33
-rw-r--r--ext/hls/gsthlsdemux.h1
2 files changed, 13 insertions, 21 deletions
diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c
index eed885df3..5028bda42 100644
--- a/ext/hls/gsthlsdemux.c
+++ b/ext/hls/gsthlsdemux.c
@@ -421,6 +421,7 @@ gst_hls_demux_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
return FALSE;
}
demux->discont = TRUE;
+ demux->new_playlist = TRUE;
demux->do_typefind = TRUE;
gst_hls_demux_change_playlist (demux,
@@ -449,6 +450,7 @@ gst_hls_demux_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
return FALSE;
}
demux->discont = TRUE;
+ demux->new_playlist = TRUE;
demux->do_typefind = TRUE;
gst_hls_demux_change_playlist (demux,
@@ -948,7 +950,7 @@ _src_query (GstPad * pad, GstObject * parent, GstQuery * query)
}
static void
-switch_pads (GstHLSDemux * demux, GstCaps * newcaps)
+switch_pads (GstHLSDemux * demux)
{
GstPad *oldpad = demux->srcpad;
GstEvent *event;
@@ -958,9 +960,7 @@ switch_pads (GstHLSDemux * demux, GstCaps * newcaps)
GstPadTemplate *tmpl;
GstProxyPad *internal_pad;
- GST_DEBUG_OBJECT (demux,
- "Switching pads (oldpad:%p) with caps: %" GST_PTR_FORMAT, oldpad,
- newcaps);
+ GST_DEBUG_OBJECT (demux, "Switching pad (oldpad:%p)", oldpad);
target = gst_element_get_static_pad (demux->src, "src");
if (oldpad) {
@@ -1014,13 +1014,12 @@ switch_pads (GstHLSDemux * demux, GstCaps * newcaps)
gst_pad_push_event (demux->srcpad, event);
g_free (stream_id);
- if (newcaps != NULL)
- gst_pad_set_caps (demux->srcpad, newcaps);
-
gst_element_add_pad (GST_ELEMENT (demux), demux->srcpad);
gst_element_no_more_pads (GST_ELEMENT (demux));
+ demux->new_playlist = FALSE;
+
if (oldpad) {
/* Push out EOS */
gst_pad_push_event (oldpad, gst_event_new_eos ());
@@ -1030,21 +1029,12 @@ switch_pads (GstHLSDemux * demux, GstCaps * newcaps)
}
static gboolean
-gst_hls_demux_configure_src_pad (GstHLSDemux * demux, GstCaps * bufcaps)
+gst_hls_demux_configure_src_pad (GstHLSDemux * demux)
{
- GstCaps *srccaps = NULL;
- /* Figure out if we need to create/switch pads */
- if (G_LIKELY (demux->srcpad))
- srccaps = gst_pad_get_current_caps (demux->srcpad);
-
- if (G_UNLIKELY (!srccaps || demux->discont)) {
- switch_pads (demux, bufcaps);
+ if (G_UNLIKELY (!demux->srcpad || demux->new_playlist)) {
+ switch_pads (demux);
demux->need_segment = TRUE;
}
- if (bufcaps)
- gst_caps_unref (bufcaps);
- if (G_LIKELY (srccaps))
- gst_caps_unref (srccaps);
return TRUE;
}
@@ -1185,7 +1175,7 @@ end_of_playlist:
{
GST_DEBUG_OBJECT (demux, "Reached end of playlist, sending EOS");
- gst_hls_demux_configure_src_pad (demux, NULL);
+ gst_hls_demux_configure_src_pad (demux);
gst_pad_push_event (demux->srcpad, gst_event_new_eos ());
gst_hls_demux_pause_tasks (demux);
@@ -1542,6 +1532,7 @@ retry_failover_protection:
GST_INFO_OBJECT (demux, "Client was on %dbps, max allowed is %dbps, switching"
" to bitrate %dbps", old_bandwidth, max_bitrate, new_bandwidth);
demux->discont = TRUE;
+ demux->new_playlist = TRUE;
if (gst_hls_demux_update_playlist (demux, FALSE, NULL)) {
GstStructure *s;
@@ -1843,7 +1834,7 @@ gst_hls_demux_get_next_fragment (GstHLSDemux * demux,
gst_hls_demux_update_source (demux, next_fragment_uri,
demux->client->main ? demux->client->main->uri : NULL);
- if (!gst_hls_demux_configure_src_pad (demux, NULL)) {
+ if (!gst_hls_demux_configure_src_pad (demux)) {
*end_of_playlist = FALSE;
return FALSE;
}
diff --git a/ext/hls/gsthlsdemux.h b/ext/hls/gsthlsdemux.h
index 9e0a796ed..5768d2348 100644
--- a/ext/hls/gsthlsdemux.h
+++ b/ext/hls/gsthlsdemux.h
@@ -74,6 +74,7 @@ struct _GstHLSDemux
gchar *uri; /* Original playlist URI */
GstM3U8Client *client; /* M3U8 client */
gboolean do_typefind; /* Whether we need to typefind the next buffer */
+ gboolean new_playlist; /* Whether a new playlist is about to start and pads should be switched */
/* Properties */
guint fragments_cache; /* number of fragments needed to be cached to start playing */