On 2013-02-16 10:50:33 +0100, Anton Khirnov wrote:
> ---
>  libavcodec/zerocodec.c |   36 ++++++++----------------------------
>  1 file changed, 8 insertions(+), 28 deletions(-)
> 
> diff --git a/libavcodec/zerocodec.c b/libavcodec/zerocodec.c
> index 8122cca..e503aa7 100644
> --- a/libavcodec/zerocodec.c
> +++ b/libavcodec/zerocodec.c
> @@ -31,14 +31,12 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, 
> void *data,
>                                    int *got_frame, AVPacket *avpkt)
>  {
>      ZeroCodecContext *zc = avctx->priv_data;
> -    AVFrame *pic         = avctx->coded_frame;
> +    AVFrame *pic         = data;
>      AVFrame *prev_pic    = &zc->previous_frame;
>      z_stream *zstream    = &zc->zstream;
>      uint8_t *prev        = prev_pic->data[0];
>      uint8_t *dst;
> -    int i, j, zret;
> -
> -    pic->reference = 3;
> +    int i, j, zret, ret;
>  
>      if (avpkt->flags & AV_PKT_FLAG_KEY) {
>          pic->key_frame = 1;
> @@ -61,7 +59,7 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, 
> void *data,
>          return AVERROR_INVALIDDATA;
>      }
>  
> -    if (ff_get_buffer(avctx, pic) < 0) {
> +    if (ff_get_buffer(avctx, pic, AV_GET_BUFFER_FLAG_REF) < 0) {
>          av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
>          return AVERROR(ENOMEM);
>      }
> @@ -82,7 +80,6 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, 
> void *data,
>  
>          zret = inflate(zstream, Z_SYNC_FLUSH);
>          if (zret != Z_OK && zret != Z_STREAM_END) {
> -            avctx->release_buffer(avctx, pic);
>              av_log(avctx, AV_LOG_ERROR,
>                     "Inflate failed with return code: %d.\n", zret);
>              return AVERROR_INVALIDDATA;

Don't we need to unref pic here or is user/util code expected to handle
frames with references even though decode() didn't set got_picture?

> @@ -96,16 +93,11 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, 
> void *data,
>          dst  -= pic->linesize[0];
>      }
>  
> -    /* Release the previous buffer if need be */
> -    if (prev_pic->data[0])
> -        avctx->release_buffer(avctx, prev_pic);
> +    av_frame_unref(&zc->previous_frame);
> +    if ((ret = av_frame_ref(&zc->previous_frame, pic)) < 0)
> +        return ret;
>  
>      *got_frame = 1;
> -    *(AVFrame *)data = *pic;
> -
> -    /* Store the previous frame for use later.
> -     * FFSWAP ensures that e.g. pic->data is NULLed. */
> -    FFSWAP(AVFrame, *pic, *prev_pic);
>  
>      return avpkt->size;
>  }
> @@ -113,15 +105,10 @@ static int zerocodec_decode_frame(AVCodecContext 
> *avctx, void *data,
>  static av_cold int zerocodec_decode_close(AVCodecContext *avctx)
>  {
>      ZeroCodecContext *zc = avctx->priv_data;
> -    AVFrame *prev_pic    = &zc->previous_frame;
> -
> -    inflateEnd(&zc->zstream);
>  
> -    /* Release last frame */
> -    if (prev_pic->data[0])
> -        avctx->release_buffer(avctx, prev_pic);
> +    av_frame_unref(&zc->previous_frame);
>  
> -    av_freep(&avctx->coded_frame);
> +    inflateEnd(&zc->zstream);
>  
>      return 0;
>  }
> @@ -145,13 +132,6 @@ static av_cold int zerocodec_decode_init(AVCodecContext 
> *avctx)
>          return AVERROR(ENOMEM);
>      }
>  
> -    avctx->coded_frame = avcodec_alloc_frame();
> -    if (!avctx->coded_frame) {
> -        av_log(avctx, AV_LOG_ERROR, "Could not allocate frame buffer.\n");
> -        zerocodec_decode_close(avctx);
> -        return AVERROR(ENOMEM);
> -    }
> -
>      return 0;
>  }

otherwise ok

Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to