From: Sebastian Dröge Date: Thu, 31 Mar 2016 10:01:00 +0000 (+0300) Subject: hlsdemux: Clear pending data when needed X-Git-Tag: 1.19.3~507^2~6374 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3469104a47e63520cc57b3836544568bc4b1dd02;p=platform%2Fupstream%2Fgstreamer.git 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 --- diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c index fed487a..7afcfde 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);