static void gst_hls_demux_stream_loop (GstHLSDemux * demux);
static void gst_hls_demux_updates_loop (GstHLSDemux * demux);
static void gst_hls_demux_stop (GstHLSDemux * demux);
+static void gst_hls_demux_pause_tasks (GstHLSDemux * demux);
static gboolean gst_hls_demux_cache_fragments (GstHLSDemux * demux);
static gboolean gst_hls_demux_schedule (GstHLSDemux * demux);
static gboolean gst_hls_demux_switch_playlist (GstHLSDemux * demux);
return GST_FLOW_OK;
}
+static void
+gst_hls_demux_pause_tasks (GstHLSDemux * demux)
+{
+ gst_uri_downloader_cancel (demux->downloader);
+
+ if (GST_TASK_STATE (demux->updates_task) != GST_TASK_STOPPED) {
+ demux->stop_stream_task = TRUE;
+ gst_task_pause (demux->updates_task);
+ GST_TASK_SIGNAL (demux->updates_task);
+ }
+
+ if (GST_TASK_STATE (demux->stream_task) != GST_TASK_STOPPED) {
+ gst_task_pause (demux->stream_task);
+ }
+}
+
static void
gst_hls_demux_stop (GstHLSDemux * demux)
{
{
GST_DEBUG_OBJECT (demux, "Reached end of playlist, sending EOS");
gst_pad_push_event (demux->srcpad, gst_event_new_eos ());
- gst_hls_demux_stop (demux);
+ gst_hls_demux_pause_tasks (demux);
return;
}
if (!demux->cancelled) {
GST_ELEMENT_ERROR (demux, RESOURCE, NOT_FOUND,
("Could not cache the first fragments"), (NULL));
- gst_hls_demux_stop (demux);
+ gst_hls_demux_pause_tasks (demux);
}
return;
}
error_pushing:
{
- /* FIXME: handle error */
- GST_DEBUG_OBJECT (demux, "Error pushing buffer: %s... stopping task",
- gst_flow_get_name (ret));
- gst_hls_demux_stop (demux);
+ if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_EOS) {
+ GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL),
+ ("stream stopped, reason %s", gst_flow_get_name (ret)));
+ gst_pad_push_event (demux->srcpad, gst_event_new_eos ());
+ } else {
+ GST_DEBUG_OBJECT (demux, "stream stopped, reason %s",
+ gst_flow_get_name (ret));
+ }
+ gst_hls_demux_pause_tasks (demux);
return;
}
} else {
GST_ELEMENT_ERROR (demux, RESOURCE, NOT_FOUND,
("Could not update the playlist"), (NULL));
- goto quit;
+ goto error;
}
}
}
} else {
GST_ELEMENT_ERROR (demux, RESOURCE, NOT_FOUND,
("Could not fetch the next fragment"), (NULL));
- goto quit;
+ goto error;
}
}
} else {
quit:
{
GST_DEBUG_OBJECT (demux, "Stopped updates task");
- gst_hls_demux_stop (demux);
+ g_mutex_unlock (&demux->updates_timed_lock);
+ return;
+ }
+
+error:
+ {
+ GST_DEBUG_OBJECT (demux, "Stopped updates task because of error");
+ gst_hls_demux_pause_tasks (demux);
g_mutex_unlock (&demux->updates_timed_lock);
}
}