diff options
Diffstat (limited to 'libavcodec/vcr1.c')
-rw-r--r-- | libavcodec/vcr1.c | 40 |
1 files changed, 5 insertions, 35 deletions
diff --git a/libavcodec/vcr1.c b/libavcodec/vcr1.c index e9b1a7b795..6ef7165c8d 100644 --- a/libavcodec/vcr1.c +++ b/libavcodec/vcr1.c @@ -29,25 +29,12 @@ #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; - avcodec_get_frame_defaults(&a->picture); - - return 0; -} - static av_cold int vcr1_decode_init(AVCodecContext *avctx) { - vcr1_common_init(avctx); - avctx->pix_fmt = AV_PIX_FMT_YUV410P; if (avctx->width % 8 || avctx->height%4) { @@ -57,37 +44,22 @@ static av_cold int vcr1_decode_init(AVCodecContext *avctx) 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); - if(buf_size < 16 + avctx->height + avctx->width*avctx->height*5/8){ av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n"); return AVERROR(EINVAL); } - 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; } @@ -101,11 +73,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++; @@ -141,7 +113,6 @@ static int vcr1_decode_frame(AVCodecContext *avctx, void *data, } } - *picture = a->picture; *got_frame = 1; return buf_size; @@ -153,7 +124,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"), |