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

Reply via email to