From 940576244cbb8857fcceace1d92934018e20a8d4 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Tue, 29 Apr 2014 18:15:05 -0300 Subject: hlsdemux: Do not push last buffer after error In decryption scenario, a buffer is always stored to be sent later to wait for more data or EOS to be able to strip the final bytes if requested. In case an error hapenned this buffer can be ignored and not pushed downstream. --- ext/hls/gsthlsdemux.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c index b7ef8ac92..080a39baa 100644 --- a/ext/hls/gsthlsdemux.c +++ b/ext/hls/gsthlsdemux.c @@ -951,23 +951,28 @@ _src_event (GstPad * pad, GstObject * parent, GstEvent * event) gst_adapter_clear (demux->adapter); /* pending buffer is only used for encrypted streams */ - if (demux->pending_buffer) { - GstMapInfo info; - gsize unpadded_size; - - /* Handle pkcs7 unpadding here */ - gst_buffer_map (demux->pending_buffer, &info, GST_MAP_READ); - unpadded_size = info.size - info.data[info.size - 1]; - gst_buffer_unmap (demux->pending_buffer, &info); - - gst_buffer_resize (demux->pending_buffer, 0, unpadded_size); - - /* TODO check return */ - demux->download_total_time += - g_get_monotonic_time () - demux->download_start_time; - demux->download_total_bytes += - gst_buffer_get_size (demux->pending_buffer); - gst_pad_push (demux->srcpad, demux->pending_buffer); + if (demux->last_ret == GST_FLOW_OK) { + if (demux->pending_buffer) { + GstMapInfo info; + gsize unpadded_size; + + /* Handle pkcs7 unpadding here */ + gst_buffer_map (demux->pending_buffer, &info, GST_MAP_READ); + unpadded_size = info.size - info.data[info.size - 1]; + gst_buffer_unmap (demux->pending_buffer, &info); + + gst_buffer_resize (demux->pending_buffer, 0, unpadded_size); + + demux->download_total_time += + g_get_monotonic_time () - demux->download_start_time; + demux->download_total_bytes += + gst_buffer_get_size (demux->pending_buffer); + demux->last_ret = gst_pad_push (demux->srcpad, demux->pending_buffer); + + demux->pending_buffer = NULL; + } + } else { + gst_buffer_unref (demux->pending_buffer); demux->pending_buffer = NULL; } -- cgit v1.2.1