From 759001c534287a96dc96d1e274665feb7059145d Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 21 Nov 2012 21:34:46 +0100 Subject: lavc decoders: work with refcounted frames. --- libavcodec/vcr1.c | 39 +++++---------------------------------- 1 file changed, 5 insertions(+), 34 deletions(-) (limited to 'libavcodec/vcr1.c') diff --git a/libavcodec/vcr1.c b/libavcodec/vcr1.c index 499b1c75c6..c4b817ead8 100644 --- a/libavcodec/vcr1.c +++ b/libavcodec/vcr1.c @@ -29,55 +29,28 @@ #include "libavutil/internal.h" typedef struct VCR1Context { - AVFrame picture; int delta[16]; int offset[4]; } VCR1Context; -static av_cold int vcr1_common_init(AVCodecContext *avctx) -{ - VCR1Context *const a = avctx->priv_data; - - avctx->coded_frame = &a->picture; - - return 0; -} - static av_cold int vcr1_decode_init(AVCodecContext *avctx) { - vcr1_common_init(avctx); - avctx->pix_fmt = AV_PIX_FMT_YUV410P; return 0; } -static av_cold int vcr1_decode_end(AVCodecContext *avctx) -{ - VCR1Context *s = avctx->priv_data; - - if (s->picture.data[0]) - avctx->release_buffer(avctx, &s->picture); - - return 0; -} - static int vcr1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; VCR1Context *const a = avctx->priv_data; - AVFrame *picture = data; - AVFrame *const p = &a->picture; + AVFrame *const p = data; const uint8_t *bytestream = buf; int i, x, y, ret; - if (p->data[0]) - avctx->release_buffer(avctx, p); - - p->reference = 0; - if ((ret = ff_get_buffer(avctx, p)) < 0) { + if ((ret = ff_get_buffer(avctx, p, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } @@ -91,11 +64,11 @@ static int vcr1_decode_frame(AVCodecContext *avctx, void *data, for (y = 0; y < avctx->height; y++) { int offset; - uint8_t *luma = &a->picture.data[0][y * a->picture.linesize[0]]; + uint8_t *luma = &p->data[0][y * p->linesize[0]]; if ((y & 3) == 0) { - uint8_t *cb = &a->picture.data[1][(y >> 2) * a->picture.linesize[1]]; - uint8_t *cr = &a->picture.data[2][(y >> 2) * a->picture.linesize[2]]; + uint8_t *cb = &p->data[1][(y >> 2) * p->linesize[1]]; + uint8_t *cr = &p->data[2][(y >> 2) * p->linesize[2]]; for (i = 0; i < 4; i++) a->offset[i] = *bytestream++; @@ -131,7 +104,6 @@ static int vcr1_decode_frame(AVCodecContext *avctx, void *data, } } - *picture = a->picture; *got_frame = 1; return buf_size; @@ -143,7 +115,6 @@ AVCodec ff_vcr1_decoder = { .id = AV_CODEC_ID_VCR1, .priv_data_size = sizeof(VCR1Context), .init = vcr1_decode_init, - .close = vcr1_decode_end, .decode = vcr1_decode_frame, .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("ATI VCR1"), -- cgit v1.2.3