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
