summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-10-15 11:45:04 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-10-15 11:46:45 +0200
commit932c7175d3f0986516df9faba2e25581ae6eccf1 (patch)
treed2c05faa6ed25c7b9cb8cc3e7021337bb3fc23a5
parent477b04a28268f44720779c02679400c200bcf1a5 (diff)
downloadgstreamer-plugins-bad-932c7175d3f0986516df9faba2e25581ae6eccf1.tar.gz
hlsdemux: And fix another deadlock caused by the update thread not correctly shutting down
Conflicts: gst/hls/gsthlsdemux.c
-rw-r--r--gst/hls/gsthlsdemux.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/gst/hls/gsthlsdemux.c b/gst/hls/gsthlsdemux.c
index eb18a258d..b47fba83c 100644
--- a/gst/hls/gsthlsdemux.c
+++ b/gst/hls/gsthlsdemux.c
@@ -139,6 +139,7 @@ gst_hls_demux_dispose (GObject * obj)
if (demux->updates_task) {
if (GST_TASK_STATE (demux->updates_task) != GST_TASK_STOPPED) {
GST_DEBUG_OBJECT (demux, "Leaving updates task");
+ demux->cancelled = TRUE;
gst_uri_downloader_cancel (demux->downloader);
gst_task_stop (demux->updates_task);
g_mutex_lock (&demux->updates_timed_lock);
@@ -324,6 +325,7 @@ gst_hls_demux_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ demux->cancelled = TRUE;
gst_uri_downloader_cancel (demux->downloader);
gst_task_stop (demux->updates_task);
g_mutex_lock (&demux->updates_timed_lock);
@@ -331,6 +333,7 @@ gst_hls_demux_change_state (GstElement * element, GstStateChange transition)
g_mutex_unlock (&demux->updates_timed_lock);
g_rec_mutex_lock (&demux->updates_lock);
g_rec_mutex_unlock (&demux->updates_lock);
+ demux->cancelled = FALSE;
break;
case GST_STATE_CHANGE_PAUSED_TO_READY:
demux->cancelled = TRUE;
@@ -606,10 +609,9 @@ gst_hls_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
static void
gst_hls_demux_pause_tasks (GstHLSDemux * demux, gboolean caching)
{
- gst_uri_downloader_cancel (demux->downloader);
-
if (GST_TASK_STATE (demux->updates_task) != GST_TASK_STOPPED) {
- demux->stop_stream_task = TRUE;
+ demux->cancelled = TRUE;
+ gst_uri_downloader_cancel (demux->downloader);
gst_task_pause (demux->updates_task);
if (!caching)
g_mutex_lock (&demux->updates_timed_lock);
@@ -619,6 +621,7 @@ gst_hls_demux_pause_tasks (GstHLSDemux * demux, gboolean caching)
}
if (GST_TASK_STATE (demux->stream_task) != GST_TASK_STOPPED) {
+ demux->stop_stream_task = TRUE;
gst_task_pause (demux->stream_task);
}
}
@@ -629,7 +632,7 @@ gst_hls_demux_stop (GstHLSDemux * demux)
gst_uri_downloader_cancel (demux->downloader);
if (GST_TASK_STATE (demux->updates_task) != GST_TASK_STOPPED) {
- demux->stop_stream_task = TRUE;
+ demux->cancelled = TRUE;
gst_uri_downloader_cancel (demux->downloader);
gst_task_stop (demux->updates_task);
g_mutex_lock (&demux->updates_timed_lock);
@@ -640,6 +643,7 @@ gst_hls_demux_stop (GstHLSDemux * demux)
}
if (GST_TASK_STATE (demux->stream_task) != GST_TASK_STOPPED) {
+ demux->stop_stream_task = TRUE;
gst_task_stop (demux->stream_task);
g_rec_mutex_lock (&demux->stream_lock);
g_rec_mutex_unlock (&demux->stream_lock);
@@ -853,6 +857,9 @@ gst_hls_demux_updates_loop (GstHLSDemux * demux)
g_mutex_lock (&demux->updates_timed_lock);
GST_DEBUG_OBJECT (demux, "Started updates task");
while (TRUE) {
+ if (demux->cancelled)
+ goto quit;
+
/* schedule the next update */
gst_hls_demux_schedule (demux);
@@ -861,9 +868,15 @@ gst_hls_demux_updates_loop (GstHLSDemux * demux)
&demux->updates_timed_lock, &demux->next_update)) {
goto quit;
}
+
+ if (demux->cancelled)
+ goto quit;
+
/* update the playlist for live sources */
if (gst_m3u8_client_is_live (demux->client)) {
if (!gst_hls_demux_update_playlist (demux, TRUE)) {
+ if (demux->cancelled)
+ goto quit;
demux->client->update_failed_count++;
if (demux->client->update_failed_count < DEFAULT_FAILED_COUNT) {
GST_WARNING_OBJECT (demux, "Could not update the playlist");
@@ -887,10 +900,15 @@ gst_hls_demux_updates_loop (GstHLSDemux * demux)
continue;
}
+ if (demux->cancelled)
+ goto quit;
+
/* fetch the next fragment */
if (g_queue_is_empty (demux->queue)) {
if (!gst_hls_demux_get_next_fragment (demux, FALSE)) {
- if (!demux->end_of_playlist && !demux->cancelled) {
+ if (demux->cancelled) {
+ goto quit;
+ } else if (!demux->end_of_playlist && !demux->cancelled) {
demux->client->update_failed_count++;
if (demux->client->update_failed_count < DEFAULT_FAILED_COUNT) {
GST_WARNING_OBJECT (demux, "Could not fetch the next fragment");
@@ -904,6 +922,9 @@ gst_hls_demux_updates_loop (GstHLSDemux * demux)
} else {
demux->client->update_failed_count = 0;
+ if (demux->cancelled)
+ goto quit;
+
/* try to switch to another bitrate if needed */
gst_hls_demux_switch_playlist (demux);
}