On Mon, 18 Feb 2013 13:47:10 +0100, Janne Grunau <[email protected]> wrote:
> 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?
> 

Both changed locally.

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

Reply via email to