From f63d36ade8fffc4a480d4637cf6649cee3dbac77 Mon Sep 17 00:00:00 2001 From: Miguel Angel Cabrera Moya Date: Mon, 4 Apr 2011 16:37:42 +0200 Subject: [PATCH] ffmpegdec: do buffer padding before parsing and before decoding FFMpeg parsing and decoding calls require to additionally allocate bytes at the end of the input bitstream and this padding must be initialized to zero. https://bugzilla.gnome.org/show_bug.cgi?id=595590 --- ext/ffmpeg/gstffmpegdec.c | 42 +++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c index 5704baa9e1..2b86b6604e 100644 --- a/ext/ffmpeg/gstffmpegdec.c +++ b/ext/ffmpeg/gstffmpegdec.c @@ -2450,7 +2450,7 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf) { GstFFMpegDec *ffmpegdec; GstFFMpegDecClass *oclass; - guint8 *data, *bdata, *pdata; + guint8 *data, *bdata; gint size, bsize, len, have_data; GstFlowReturn ret = GST_FLOW_OK; GstClockTime in_timestamp; @@ -2557,7 +2557,23 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf) bdata = GST_BUFFER_DATA (inbuf); bsize = GST_BUFFER_SIZE (inbuf); + if (ffmpegdec->do_padding) { + /* add padding */ + if (ffmpegdec->padded_size < bsize + FF_INPUT_BUFFER_PADDING_SIZE) { + ffmpegdec->padded_size = bsize + FF_INPUT_BUFFER_PADDING_SIZE; + ffmpegdec->padded = g_realloc (ffmpegdec->padded, ffmpegdec->padded_size); + GST_LOG_OBJECT (ffmpegdec, "resized padding buffer to %d", + ffmpegdec->padded_size); + } + memcpy (ffmpegdec->padded, bdata, bsize); + memset (ffmpegdec->padded + bsize, 0, FF_INPUT_BUFFER_PADDING_SIZE); + + bdata = ffmpegdec->padded; + } + do { + guint8 tmp_padding[FF_INPUT_BUFFER_PADDING_SIZE]; + /* parse, if at all possible */ if (ffmpegdec->pctx) { gint res; @@ -2616,26 +2632,18 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf) } if (ffmpegdec->do_padding) { - /* add padding */ - if (ffmpegdec->padded_size < size + FF_INPUT_BUFFER_PADDING_SIZE) { - ffmpegdec->padded_size = size + FF_INPUT_BUFFER_PADDING_SIZE; - ffmpegdec->padded = - g_realloc (ffmpegdec->padded, ffmpegdec->padded_size); - GST_LOG_OBJECT (ffmpegdec, "resized padding buffer to %d", - ffmpegdec->padded_size); - } - memcpy (ffmpegdec->padded, data, size); - memset (ffmpegdec->padded + size, 0, FF_INPUT_BUFFER_PADDING_SIZE); - - pdata = ffmpegdec->padded; - } else { - pdata = data; + /* add temporary padding */ + memcpy (tmp_padding, data + size, FF_INPUT_BUFFER_PADDING_SIZE); + memset (data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE); } /* decode a frame of audio/video now */ len = - gst_ffmpegdec_frame (ffmpegdec, pdata, size, &have_data, dec_info, - &ret); + gst_ffmpegdec_frame (ffmpegdec, data, size, &have_data, dec_info, &ret); + + if (ffmpegdec->do_padding) { + memcpy (data + size, tmp_padding, FF_INPUT_BUFFER_PADDING_SIZE); + } if (ret != GST_FLOW_OK) { GST_LOG_OBJECT (ffmpegdec, "breaking because of flow ret %s",