diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-11-21 21:34:46 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2013-03-08 07:38:30 +0100 |
commit | 759001c534287a96dc96d1e274665feb7059145d (patch) | |
tree | 6ace9560c20aa30db92067c5b45d7bd86e458d10 /libavcodec/cdxl.c | |
parent | 6e7b50b4270116ded8b874d76cb7c5b1a0341827 (diff) | |
download | ffmpeg-759001c534287a96dc96d1e274665feb7059145d.tar.gz |
lavc decoders: work with refcounted frames.
Diffstat (limited to 'libavcodec/cdxl.c')
-rw-r--r-- | libavcodec/cdxl.c | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/libavcodec/cdxl.c b/libavcodec/cdxl.c index 0b3d59cb80..465867c098 100644 --- a/libavcodec/cdxl.c +++ b/libavcodec/cdxl.c @@ -49,7 +49,6 @@ static av_cold int cdxl_decode_init(AVCodecContext *avctx) { CDXLVideoContext *c = avctx->priv_data; - avcodec_get_frame_defaults(&c->frame); c->new_video_size = 0; c->avctx = avctx; @@ -113,15 +112,15 @@ static void import_format(CDXLVideoContext *c, int linesize, uint8_t *out) } } -static void cdxl_decode_rgb(CDXLVideoContext *c) +static void cdxl_decode_rgb(CDXLVideoContext *c, AVFrame *frame) { - uint32_t *new_palette = (uint32_t *)c->frame.data[1]; + uint32_t *new_palette = (uint32_t *)frame->data[1]; import_palette(c, new_palette); - import_format(c, c->frame.linesize[0], c->frame.data[0]); + import_format(c, frame->linesize[0], frame->data[0]); } -static void cdxl_decode_ham6(CDXLVideoContext *c) +static void cdxl_decode_ham6(CDXLVideoContext *c, AVFrame *frame) { AVCodecContext *avctx = c->avctx; uint32_t new_palette[16], r, g, b; @@ -129,7 +128,7 @@ static void cdxl_decode_ham6(CDXLVideoContext *c) int x, y; ptr = c->new_video; - out = c->frame.data[0]; + out = frame->data[0]; import_palette(c, new_palette); import_format(c, avctx->width, c->new_video); @@ -160,11 +159,11 @@ static void cdxl_decode_ham6(CDXLVideoContext *c) } AV_WL24(out + x * 3, r | g | b); } - out += c->frame.linesize[0]; + out += frame->linesize[0]; } } -static void cdxl_decode_ham8(CDXLVideoContext *c) +static void cdxl_decode_ham8(CDXLVideoContext *c, AVFrame *frame) { AVCodecContext *avctx = c->avctx; uint32_t new_palette[64], r, g, b; @@ -172,7 +171,7 @@ static void cdxl_decode_ham8(CDXLVideoContext *c) int x, y; ptr = c->new_video; - out = c->frame.data[0]; + out = frame->data[0]; import_palette(c, new_palette); import_format(c, avctx->width, c->new_video); @@ -203,7 +202,7 @@ static void cdxl_decode_ham8(CDXLVideoContext *c) } AV_WL24(out + x * 3, r | g | b); } - out += c->frame.linesize[0]; + out += frame->linesize[0]; } } @@ -211,7 +210,7 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *pkt) { CDXLVideoContext *c = avctx->priv_data; - AVFrame * const p = &c->frame; + AVFrame * const p = data; int ret, w, h, encoding, aligned_width, buf_size = pkt->size; const uint8_t *buf = pkt->data; @@ -259,11 +258,7 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, return AVERROR_PATCHWELCOME; } - 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; } @@ -275,14 +270,13 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, if (!c->new_video) return AVERROR(ENOMEM); if (c->bpp == 8) - cdxl_decode_ham8(c); + cdxl_decode_ham8(c, p); else - cdxl_decode_ham6(c); + cdxl_decode_ham6(c, p); } else { - cdxl_decode_rgb(c); + cdxl_decode_rgb(c, p); } *got_frame = 1; - *(AVFrame*)data = c->frame; return buf_size; } @@ -292,8 +286,6 @@ static av_cold int cdxl_decode_end(AVCodecContext *avctx) CDXLVideoContext *c = avctx->priv_data; av_free(c->new_video); - if (c->frame.data[0]) - avctx->release_buffer(avctx, &c->frame); return 0; } |