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/vmdav.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) (limited to 'libavcodec/vmdav.c') diff --git a/libavcodec/vmdav.c b/libavcodec/vmdav.c index 88cd167659..b5b5524919 100644 --- a/libavcodec/vmdav.c +++ b/libavcodec/vmdav.c @@ -59,7 +59,6 @@ typedef struct VmdVideoContext { AVCodecContext *avctx; - AVFrame frame; AVFrame prev_frame; const unsigned char *buf; @@ -207,7 +206,7 @@ static int rle_unpack(const unsigned char *src, unsigned char *dest, return ps - src; } -static void vmd_decode(VmdVideoContext *s) +static void vmd_decode(VmdVideoContext *s, AVFrame *frame) { int i; unsigned int *palette32; @@ -257,8 +256,8 @@ static void vmd_decode(VmdVideoContext *s) (frame_x || frame_y || (frame_width != s->avctx->width) || (frame_height != s->avctx->height))) { - memcpy(s->frame.data[0], s->prev_frame.data[0], - s->avctx->height * s->frame.linesize[0]); + memcpy(frame->data[0], s->prev_frame.data[0], + s->avctx->height * frame->linesize[0]); } /* check if there is a new palette */ @@ -288,7 +287,7 @@ static void vmd_decode(VmdVideoContext *s) pb_size = s->unpack_buffer_size; } - dp = &s->frame.data[0][frame_y * s->frame.linesize[0] + frame_x]; + dp = &frame->data[0][frame_y * frame->linesize[0] + frame_x]; pp = &s->prev_frame.data[0][frame_y * s->prev_frame.linesize[0] + frame_x]; switch (meth) { case 1: @@ -320,7 +319,7 @@ static void vmd_decode(VmdVideoContext *s) ofs, frame_width); break; } - dp += s->frame.linesize[0]; + dp += frame->linesize[0]; pp += s->prev_frame.linesize[0]; } break; @@ -332,7 +331,7 @@ static void vmd_decode(VmdVideoContext *s) memcpy(dp, pb, frame_width); pb += frame_width; pb_size -= frame_width; - dp += s->frame.linesize[0]; + dp += frame->linesize[0]; pp += s->prev_frame.linesize[0]; } break; @@ -371,7 +370,7 @@ static void vmd_decode(VmdVideoContext *s) av_log(s->avctx, AV_LOG_ERROR, "VMD video: offset > width (%d > %d)\n", ofs, frame_width); } - dp += s->frame.linesize[0]; + dp += frame->linesize[0]; pp += s->prev_frame.linesize[0]; } break; @@ -425,6 +424,8 @@ static int vmdvideo_decode_frame(AVCodecContext *avctx, const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; VmdVideoContext *s = avctx->priv_data; + AVFrame *frame = data; + int ret; s->buf = buf; s->size = buf_size; @@ -432,24 +433,22 @@ static int vmdvideo_decode_frame(AVCodecContext *avctx, if (buf_size < 16) return buf_size; - s->frame.reference = 1; - if (ff_get_buffer(avctx, &s->frame)) { + if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0) { av_log(s->avctx, AV_LOG_ERROR, "VMD Video: get_buffer() failed\n"); - return -1; + return ret; } - vmd_decode(s); + vmd_decode(s, frame); /* make the palette available on the way out */ - memcpy(s->frame.data[1], s->palette, PALETTE_COUNT * 4); + memcpy(frame->data[1], s->palette, PALETTE_COUNT * 4); /* shuffle frames */ - FFSWAP(AVFrame, s->frame, s->prev_frame); - if (s->frame.data[0]) - avctx->release_buffer(avctx, &s->frame); + av_frame_unref(&s->prev_frame); + if ((ret = av_frame_ref(&s->prev_frame, frame)) < 0) + return ret; *got_frame = 1; - *(AVFrame*)data = s->prev_frame; /* report that the buffer was completely consumed */ return buf_size; @@ -459,8 +458,7 @@ static av_cold int vmdvideo_decode_end(AVCodecContext *avctx) { VmdVideoContext *s = avctx->priv_data; - if (s->prev_frame.data[0]) - avctx->release_buffer(avctx, &s->prev_frame); + av_frame_unref(&s->prev_frame); av_free(s->unpack_buffer); return 0; @@ -607,7 +605,7 @@ static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data, /* get output buffer */ frame->nb_samples = ((silent_chunks + audio_chunks) * avctx->block_align) / avctx->channels; - if ((ret = ff_get_buffer(avctx, frame)) < 0) { + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } -- cgit v1.2.3