aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-08-27 20:11:08 +0000
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>2012-08-28 11:37:53 -0400
commit998f92d680554cbefb4d34c7b3a0a791f94e8f00 (patch)
treeb5ad0cde52fae76300b97156f16aacde3b0ce0b7
parent6af2480aa62e96fbfa4f2f99b80280ce77dafafd (diff)
downloadffmpeg-998f92d680554cbefb4d34c7b3a0a791f94e8f00.tar.gz
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@gmx.de> Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
-rw-r--r--libavcodec/cllc.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/libavcodec/cllc.c b/libavcodec/cllc.c
index d1beb7efa1..ebc466b4a5 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: