From bc42a18f921c15e30b4d8104dcbfeffb5e9de748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 12 Feb 2014 10:59:38 +0100 Subject: [PATCH] hlsdemux: Cache the key fragment instead of downloading it over and over again --- ext/hls/gsthlsdemux.c | 28 ++++++++++++++++++++++++---- ext/hls/gsthlsdemux.h | 4 ++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c index 7d92f7fd61..60bad40699 100644 --- a/ext/hls/gsthlsdemux.c +++ b/ext/hls/gsthlsdemux.c @@ -823,6 +823,13 @@ gst_hls_demux_reset (GstHLSDemux * demux, gboolean dispose) demux->cancelled = FALSE; demux->do_typefind = TRUE; + g_free (demux->key_url); + demux->key_url = NULL; + + if (demux->key_fragment) + g_object_unref (demux->key_fragment); + demux->key_fragment = NULL; + if (demux->input_caps) { gst_caps_unref (demux->input_caps); demux->input_caps = NULL; @@ -1332,10 +1339,23 @@ gst_hls_demux_decrypt_fragment (GstHLSDemux * demux, GstMapInfo key_info, encrypted_info, decrypted_info; gsize unpadded_size; - GST_INFO_OBJECT (demux, "Fetching key %s", key); - key_fragment = gst_uri_downloader_fetch_uri (demux->downloader, key, err); - if (key_fragment == NULL) - goto key_failed; + if (demux->key_url && strcmp (demux->key_url, key) == 0) { + key_fragment = g_object_ref (demux->key_fragment); + } else { + g_free (demux->key_url); + demux->key_url = NULL; + + if (demux->key_fragment) + g_object_unref (demux->key_fragment); + demux->key_fragment = NULL; + + GST_INFO_OBJECT (demux, "Fetching key %s", key); + key_fragment = gst_uri_downloader_fetch_uri (demux->downloader, key, err); + if (key_fragment == NULL) + goto key_failed; + demux->key_url = g_strdup (key); + demux->key_fragment = g_object_ref (key_fragment); + } key_buffer = gst_fragment_get_buffer (key_fragment); encrypted_buffer = gst_fragment_get_buffer (encrypted_fragment); diff --git a/ext/hls/gsthlsdemux.h b/ext/hls/gsthlsdemux.h index 1e57ccb9fd..6536218987 100644 --- a/ext/hls/gsthlsdemux.h +++ b/ext/hls/gsthlsdemux.h @@ -90,6 +90,10 @@ struct _GstHLSDemux /* Position in the stream */ GstClockTime position_shift; gboolean need_segment; + + /* Cache for the last key */ + gchar *key_url; + GstFragment *key_fragment; }; struct _GstHLSDemuxClass