blob: b617f314a50754b18f26ffd3a3db19e65294d3fe [file] [log] [blame]
From 4c21593e5fcd1337b433119b8c7800dc5565f514 Mon Sep 17 00:00:00 2001
From: Charlie Turner <cturner@igalia.com>
Date: Tue, 2 Jul 2019 12:27:40 +0100
Subject: [PATCH] WIP: adaptivedemux: do not retry downloads during shutdown.
---
ext/hls/gsthlsdemux.c | 15 +++++++++++++--
ext/hls/gsthlsdemux.h | 4 ++++
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c
index 4317d65c3..f9583ad1a 100644
--- a/ext/hls/gsthlsdemux.c
+++ b/ext/hls/gsthlsdemux.c
@@ -73,6 +73,7 @@ static gboolean gst_hls_demux_update_playlist (GstHLSDemux * demux,
gboolean update, GError ** err);
static gchar *gst_hls_src_buf_to_utf8_playlist (GstBuffer * buf);
+/* FIXME: the return value is never used? */
static gboolean gst_hls_demux_change_playlist (GstHLSDemux * demux,
guint max_bitrate, gboolean * changed);
static GstBuffer *gst_hls_demux_decrypt_fragment (GstHLSDemux * demux,
@@ -193,6 +194,8 @@ gst_hls_demux_init (GstHLSDemux * demux)
demux->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
g_mutex_init (&demux->keys_lock);
+
+ demux->cancelling_downloads = FALSE;
}
static GstStateChangeReturn
@@ -205,6 +208,11 @@ gst_hls_demux_change_state (GstElement * element, GstStateChange transition)
case GST_STATE_CHANGE_READY_TO_PAUSED:
gst_hls_demux_reset (GST_ADAPTIVE_DEMUX_CAST (demux));
break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_DEBUG_OBJECT (demux, "PAUSED->READY cancelling downloads");
+ demux->cancelling_downloads = TRUE;
+ gst_uri_downloader_cancel (GST_ADAPTIVE_DEMUX (demux)->downloader);
+ break;
default:
break;
}
@@ -1158,6 +1166,8 @@ gst_hls_demux_reset (GstAdaptiveDemux * ademux)
{
GstHLSDemux *demux = GST_HLS_DEMUX_CAST (ademux);
+ GST_DEBUG_OBJECT (demux, "resetting");
+
GST_M3U8_CLIENT_LOCK (hlsdemux->client);
if (demux->master) {
gst_hls_master_playlist_unref (demux->master);
@@ -1379,7 +1389,8 @@ retry:
if (download == NULL) {
gchar *base_uri;
- if (!update || main_checked || demux->master->is_simple) {
+ if (!update || main_checked || demux->master->is_simple
+ || demux->cancelling_downloads) {
g_free (uri);
return FALSE;
}
@@ -1612,7 +1623,7 @@ retry_failover_protection:
if (changed)
*changed = TRUE;
stream->discont = TRUE;
- } else {
+ } else if (!demux->cancelling_downloads) {
GstHLSVariantStream *failover_variant = NULL;
GList *failover;
diff --git a/ext/hls/gsthlsdemux.h b/ext/hls/gsthlsdemux.h
index 0cab19627..9c0decabf 100644
--- a/ext/hls/gsthlsdemux.h
+++ b/ext/hls/gsthlsdemux.h
@@ -147,6 +147,10 @@ struct _GstHLSDemux
GstHLSMasterPlaylist *master;
GstHLSVariantStream *current_variant;
+
+ /* Set when the parent is state-changing down from PAUSED to avoid
+ making further network requests. */
+ gboolean cancelling_downloads;
};
struct _GstHLSDemuxClass
--
2.17.1