/**
- * @file vp56.c
+ * @file libavcodec/vp56.c
* VP5 and VP6 compatible video decoder (common features)
*
* Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
s->quantizer = quantizer;
s->dequant_dc = vp56_dc_dequant[quantizer] << 2;
s->dequant_ac = vp56_ac_dequant[quantizer] << 2;
+ memset(s->qscale_table, quantizer, s->mb_width);
}
static int vp56_get_vectors_predictors(VP56Context *s, int row, int col,
return -1;
}
+ s->qscale_table = av_realloc(s->qscale_table, s->mb_width);
s->above_blocks = av_realloc(s->above_blocks,
(4*s->mb_width+6) * sizeof(*s->above_blocks));
s->macroblocks = av_realloc(s->macroblocks,
}
int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
- const uint8_t *buf, int buf_size)
+ AVPacket *avpkt)
{
+ const uint8_t *buf = avpkt->data;
VP56Context *s = avctx->priv_data;
AVFrame *const p = s->framep[VP56_FRAME_CURRENT];
- int remaining_buf_size = buf_size;
- int is_alpha, alpha_offset;
+ int remaining_buf_size = avpkt->size;
+ int is_alpha, av_uninit(alpha_offset);
if (s->has_alpha) {
+ if (remaining_buf_size < 3)
+ return -1;
alpha_offset = bytestream_get_be24(&buf);
remaining_buf_size -= 3;
+ if (remaining_buf_size < alpha_offset)
+ return -1;
}
for (is_alpha=0; is_alpha < 1+s->has_alpha; is_alpha++) {
FFSWAP(AVFrame *, s->framep[VP56_FRAME_CURRENT],
s->framep[VP56_FRAME_PREVIOUS]);
+ p->qstride = 0;
+ p->qscale_table = s->qscale_table;
+ p->qscale_type = FF_QSCALE_TYPE_VP56;
*(AVFrame*)data = *p;
*data_size = sizeof(AVFrame);
- return buf_size;
+ return avpkt->size;
}
av_cold void vp56_init(AVCodecContext *avctx, int flip, int has_alpha)
dsputil_init(&s->dsp, avctx);
ff_init_scantable(s->dsp.idct_permutation, &s->scantable,ff_zigzag_direct);
- avcodec_set_dimensions(avctx, 0, 0);
-
for (i=0; i<4; i++)
s->framep[i] = &s->frames[i];
s->framep[VP56_FRAME_UNUSED] = s->framep[VP56_FRAME_GOLDEN];
{
VP56Context *s = avctx->priv_data;
- av_free(s->above_blocks);
- av_free(s->macroblocks);
- av_free(s->edge_emu_buffer_alloc);
+ av_freep(&s->qscale_table);
+ av_freep(&s->above_blocks);
+ av_freep(&s->macroblocks);
+ av_freep(&s->edge_emu_buffer_alloc);
if (s->framep[VP56_FRAME_GOLDEN]->data[0])
avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN]);
if (s->framep[VP56_FRAME_GOLDEN2]->data[0])