[FFmpeg-cvslog] cllc: simplify/fix swapped data buffer allocation.

Reimar Döffinger git at videolan.org
Wed Aug 29 18:09:24 CEST 2012


ffmpeg | branch: master | Reimar Döffinger <Reimar.Doeffinger at gmx.de> | Mon Aug 27 20:11:08 2012 +0000| [998f92d680554cbefb4d34c7b3a0a791f94e8f00] | committer: Derek Buitenhuis

cllc: simplify/fix swapped data buffer allocation.

Using the malloc variant avoids pointless memcpy on size
increase and simplifies handling allocation failure.
Also change code to ensure that allocation, bswap and bitstream
reader all use the same size, even when the packet size is odd
for example.

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
Signed-off-by: Derek Buitenhuis <derek.buitenhuis at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=998f92d680554cbefb4d34c7b3a0a791f94e8f00
---

 libavcodec/cllc.c |   30 +++++++++++++-----------------
 1 file changed, 13 insertions(+), 17 deletions(-)

diff --git a/libavcodec/cllc.c b/libavcodec/cllc.c
index d1beb7e..ebc466b4 100644
--- a/libavcodec/cllc.c
+++ b/libavcodec/cllc.c
@@ -272,8 +272,8 @@ static int cllc_decode_frame(AVCodecContext *avctx, void *data,
     CLLCContext *ctx = avctx->priv_data;
     AVFrame *pic = avctx->coded_frame;
     uint8_t *src = avpkt->data;
-    uint8_t *swapped_buf_new;
     uint32_t info_tag, info_offset;
+    int data_size;
     GetBitContext gb;
     int coding_type, ret;
 
@@ -282,16 +282,6 @@ static int cllc_decode_frame(AVCodecContext *avctx, void *data,
 
     pic->reference = 0;
 
-    /* Make sure our bswap16'd buffer is big enough */
-    swapped_buf_new = av_fast_realloc(ctx->swapped_buf,
-                                      &ctx->swapped_buf_size, avpkt->size +
-                                      FF_INPUT_BUFFER_PADDING_SIZE);
-    if (!swapped_buf_new) {
-        av_log(avctx, AV_LOG_ERROR, "Could not realloc swapped buffer.\n");
-        return AVERROR(ENOMEM);
-    }
-    ctx->swapped_buf = swapped_buf_new;
-
     /* Skip the INFO header if present */
     info_offset = 0;
     info_tag    = AV_RL32(src);
@@ -310,15 +300,21 @@ static int cllc_decode_frame(AVCodecContext *avctx, void *data,
         av_log(avctx, AV_LOG_DEBUG, "Skipping INFO chunk.\n");
     }
 
+    data_size = (avpkt->size - info_offset) & ~1;
+
+    /* Make sure our bswap16'd buffer is big enough */
+    av_fast_padded_malloc(&ctx->swapped_buf,
+                          &ctx->swapped_buf_size, data_size);
+    if (!ctx->swapped_buf) {
+        av_log(avctx, AV_LOG_ERROR, "Could not allocate swapped buffer.\n");
+        return AVERROR(ENOMEM);
+    }
+
     /* bswap16 the buffer since CLLC's bitreader works in 16-bit words */
     ctx->dsp.bswap16_buf((uint16_t *) ctx->swapped_buf, (uint16_t *) src,
-                         (avpkt->size - info_offset) / 2);
-
-    /* Initialize padding to 0 */
-    memset(ctx->swapped_buf + avpkt->size - info_offset,
-           0, FF_INPUT_BUFFER_PADDING_SIZE);
+                         data_size / 2);
 
-    init_get_bits(&gb, ctx->swapped_buf, (avpkt->size - info_offset) * 8);
+    init_get_bits(&gb, ctx->swapped_buf, data_size * 8);
 
     /*
      * Read in coding type. The types are as follows:



More information about the ffmpeg-cvslog mailing list