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