summaryrefslogtreecommitdiff
path: root/libavcodec/vcr1.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-11-21 21:34:46 +0100
committerAnton Khirnov <anton@khirnov.net>2013-03-08 07:38:30 +0100
commit759001c534287a96dc96d1e274665feb7059145d (patch)
tree6ace9560c20aa30db92067c5b45d7bd86e458d10 /libavcodec/vcr1.c
parent6e7b50b4270116ded8b874d76cb7c5b1a0341827 (diff)
lavc decoders: work with refcounted frames.
Diffstat (limited to 'libavcodec/vcr1.c')
-rw-r--r--libavcodec/vcr1.c39
1 files changed, 5 insertions, 34 deletions
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"),