On 2013-01-08 15:37:57 +0100, Anton Khirnov wrote:
> ---
>  libavcodec/cavs.c    |   18 ++++++------------
>  libavcodec/cavsdec.c |   37 ++++++++++++++++++-------------------
>  2 files changed, 24 insertions(+), 31 deletions(-)
> 
> diff --git a/libavcodec/cavs.c b/libavcodec/cavs.c
> index c110882..4755981 100644
> --- a/libavcodec/cavs.c
> +++ b/libavcodec/cavs.c
> @@ -729,9 +729,9 @@ av_cold int ff_cavs_init(AVCodecContext *avctx) {
>      h->avctx = avctx;
>      avctx->pix_fmt= AV_PIX_FMT_YUV420P;
>  
> -    h->cur.f    = avcodec_alloc_frame();
> -    h->DPB[0].f = avcodec_alloc_frame();
> -    h->DPB[1].f = avcodec_alloc_frame();
> +    h->cur.f    = av_frame_alloc();
> +    h->DPB[0].f = av_frame_alloc();
> +    h->DPB[1].f = av_frame_alloc();
>      if (!h->cur.f || !h->DPB[0].f || !h->DPB[1].f) {
>          ff_cavs_end(avctx);
>          return AVERROR(ENOMEM);
> @@ -762,15 +762,9 @@ av_cold int ff_cavs_init(AVCodecContext *avctx) {
>  av_cold int ff_cavs_end(AVCodecContext *avctx) {
>      AVSContext *h = avctx->priv_data;
>  
> -    if (h->cur.f->data[0])
> -        avctx->release_buffer(avctx, h->cur.f);
> -    if (h->DPB[0].f->data[0])
> -        avctx->release_buffer(avctx, h->DPB[0].f);
> -    if (h->DPB[1].f->data[0])
> -        avctx->release_buffer(avctx, h->DPB[1].f);
> -    avcodec_free_frame(&h->cur.f);
> -    avcodec_free_frame(&h->DPB[0].f);
> -    avcodec_free_frame(&h->DPB[1].f);
> +    av_frame_free(&h->cur.f);
> +    av_frame_free(&h->DPB[0].f);
> +    av_frame_free(&h->DPB[1].f);
>  
>      av_free(h->top_qp);
>      av_free(h->top_mv[0]);
> diff --git a/libavcodec/cavsdec.c b/libavcodec/cavsdec.c
> index cef6b95..c18f527 100644
> --- a/libavcodec/cavsdec.c
> +++ b/libavcodec/cavsdec.c
> @@ -931,6 +931,8 @@ static int decode_pic(AVSContext *h)
>      int skip_count    = -1;
>      enum cavs_mb mb_type;
>  
> +    av_frame_unref(h->cur.f);
> +
>      skip_bits(&h->gb, 16);//bbv_dwlay
>      if (h->stc == PIC_PB_START_CODE) {
>          h->cur.f->pict_type = get_bits(&h->gb, 2) + AV_PICTURE_TYPE_I;
> @@ -956,11 +958,9 @@ static int decode_pic(AVSContext *h)
>          if (h->stream_revision > 0)
>              skip_bits(&h->gb, 1); //marker_bit
>      }
> -    /* release last B frame */
> -    if (h->cur.f->data[0])
> -        h->avctx->release_buffer(h->avctx, h->cur.f);
>  
> -    ff_get_buffer(h->avctx, h->cur.f);
> +    ff_get_buffer(h->avctx, h->cur.f, h->cur.f->pict_type == 
> AV_PICTURE_TYPE_B ?
> +                  0 : AV_GET_BUFFER_FLAG_REF);
>  
>      if (!h->edge_emu_buffer) {
>          int alloc_size = FFALIGN(FFABS(h->cur.f->linesize[0]) + 32, 32);
> @@ -1056,8 +1056,7 @@ static int decode_pic(AVSContext *h)
>          } while (ff_cavs_next_mb(h));
>      }
>      if (h->cur.f->pict_type != AV_PICTURE_TYPE_B) {
> -        if (h->DPB[1].f->data[0])
> -            h->avctx->release_buffer(h->avctx, h->DPB[1].f);
> +        av_frame_unref(h->DPB[1].f);
>          FFSWAP(AVSFrame, h->cur, h->DPB[1]);
>          FFSWAP(AVSFrame, h->DPB[0], h->DPB[1]);
>      }
> @@ -1119,19 +1118,17 @@ static int cavs_decode_frame(AVCodecContext *avctx, 
> void *data, int *got_frame,
>      AVSContext *h      = avctx->priv_data;
>      const uint8_t *buf = avpkt->data;
>      int buf_size       = avpkt->size;
> -    AVFrame *picture   = data;
>      uint32_t stc       = -1;
> -    int input_size;
> +    int input_size, ret;
>      const uint8_t *buf_end;
>      const uint8_t *buf_ptr;
>  
>      if (buf_size == 0) {
>          if (!h->low_delay && h->DPB[0].f->data[0]) {
>              *got_frame = 1;
> -            *picture = *h->DPB[0].f;
> -            if (h->cur.f->data[0])
> -                avctx->release_buffer(avctx, h->cur.f);
> -            FFSWAP(AVSFrame, h->cur, h->DPB[0]);
> +            if ((ret = av_frame_ref(data, h->DPB[0].f)) < 0)
> +                return ret;
> +            av_frame_unref(h->DPB[0].f);

av_frame_move_ref?

>          }
>          return 0;
>      }
> @@ -1150,10 +1147,8 @@ static int cavs_decode_frame(AVCodecContext *avctx, 
> void *data, int *got_frame,
>              break;
>          case PIC_I_START_CODE:
>              if (!h->got_keyframe) {
> -                if(h->DPB[0].f->data[0])
> -                    avctx->release_buffer(avctx, h->DPB[0].f);
> -                if(h->DPB[1].f->data[0])
> -                    avctx->release_buffer(avctx, h->DPB[1].f);
> +                av_frame_unref(h->DPB[0].f);
> +                av_frame_unref(h->DPB[1].f);
>                  h->got_keyframe = 1;
>              }
>          case PIC_PB_START_CODE:
> @@ -1167,12 +1162,16 @@ static int cavs_decode_frame(AVCodecContext *avctx, 
> void *data, int *got_frame,
>              *got_frame = 1;
>              if (h->cur.f->pict_type != AV_PICTURE_TYPE_B) {
>                  if (h->DPB[1].f->data[0]) {
> -                    *picture = *h->DPB[1].f;
> +                    if ((ret = av_frame_ref(data, h->DPB[1].f)) < 0)
> +                        return ret;
>                  } else {
>                      *got_frame = 0;
>                  }
> -            } else
> -                *picture = *h->cur.f;
> +            } else {
> +                if ((ret = av_frame_ref(data, h->cur.f)) < 0)
> +                    return ret;
> +                av_frame_unref(h->cur.f);

av_frame_move_ref?

> +            }
>              break;
>          case EXT_START_CODE:
>              //mpeg_decode_extension(avctx, buf_ptr, input_size);

ok

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

Reply via email to