diff options
-rw-r--r-- | libavcodec/cllc.c | 30 |
1 files 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: |