diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2016-03-31 13:01:00 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-07-01 14:10:31 +0200 |
commit | 3469104a47e63520cc57b3836544568bc4b1dd02 (patch) | |
tree | 0c7ad9a41437756ccf5ed0322e952f3f28796235 /ext/hls/gsthlsdemux.c | |
parent | ca9f62e1d062ac1e87f13c9ddddab9164a3cb892 (diff) | |
download | gstreamer-plugins-bad-3469104a47e63520cc57b3836544568bc4b1dd02.tar.gz |
hlsdemux: Clear pending data when needed
When switching fragments we don't want to keep any data around from the last
one, and also forget about all data when doing flushing seeks or selecting new
bitrates.
https://bugzilla.gnome.org/show_bug.cgi?id=764684
Diffstat (limited to 'ext/hls/gsthlsdemux.c')
-rw-r--r-- | ext/hls/gsthlsdemux.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c index fed487ae3..7afcfde5b 100644 --- a/ext/hls/gsthlsdemux.c +++ b/ext/hls/gsthlsdemux.c @@ -229,6 +229,15 @@ gst_hls_demux_get_bitrate (GstHLSDemux * hlsdemux) return 0; } +static void +gst_hls_demux_clear_pending_data (GstHLSDemux * hlsdemux) +{ + gst_hls_demux_decrypt_end (hlsdemux); + gst_adapter_clear (hlsdemux->pending_encrypted_data); + gst_buffer_replace (&hlsdemux->pending_decrypted_buffer, NULL); + gst_buffer_replace (&hlsdemux->pending_typefind_buffer, NULL); +} + static gboolean gst_hls_demux_seek (GstAdaptiveDemux * demux, GstEvent * seek) { @@ -253,7 +262,7 @@ gst_hls_demux_seek (GstAdaptiveDemux * demux, GstEvent * seek) /* properly cleanup pending decryption status */ if (flags & GST_SEEK_FLAG_FLUSH) { - gst_hls_demux_decrypt_end (hlsdemux); + gst_hls_demux_clear_pending_data (hlsdemux); } /* Use I-frame variants for trick modes */ @@ -382,6 +391,7 @@ gst_hls_demux_setup_streams (GstAdaptiveDemux * demux) GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux); /* only 1 output supported */ + gst_hls_demux_clear_pending_data (hlsdemux); gst_adaptive_demux_stream_new (demux, gst_hls_demux_create_pad (hlsdemux)); hlsdemux->reset_pts = TRUE; @@ -511,6 +521,8 @@ gst_hls_demux_start_fragment (GstAdaptiveDemux * demux, g_object_unref (key_fragment); } + gst_hls_demux_clear_pending_data (hlsdemux); + return TRUE; key_failed: @@ -610,10 +622,8 @@ gst_hls_demux_finish_fragment (GstAdaptiveDemux * demux, hlsdemux->pending_decrypted_buffer, TRUE); hlsdemux->pending_decrypted_buffer = NULL; } - } else { - gst_buffer_replace (&hlsdemux->pending_decrypted_buffer, NULL); - gst_adapter_clear (hlsdemux->pending_encrypted_data); } + gst_hls_demux_clear_pending_data (hlsdemux); if (ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED) return gst_adaptive_demux_stream_advance_fragment (demux, stream, @@ -773,8 +783,7 @@ gst_hls_demux_reset (GstAdaptiveDemux * ademux) demux->client = gst_m3u8_client_new ("", NULL); demux->srcpad_counter = 0; - gst_adapter_clear (demux->pending_encrypted_data); - gst_buffer_replace (&demux->pending_decrypted_buffer, NULL); + gst_hls_demux_clear_pending_data (demux); gst_buffer_replace (&demux->pending_typefind_buffer, NULL); if (demux->current_key) { g_free (demux->current_key); |