On 2013-01-08 15:37:31 +0100, Anton Khirnov wrote:
> ---
> libavcodec/vmdav.c | 36 +++++++++++++++++-------------------
> 1 file changed, 17 insertions(+), 19 deletions(-)
>
> diff --git a/libavcodec/vmdav.c b/libavcodec/vmdav.c
> index cffc00a..f71a3da 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;
ok
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel