[FFmpeg-devel] [PATCH 2/2] vda: use hwaccel custom callback for releasing private picture context.
Hendrik Leppkes
h.leppkes at gmail.com
Thu May 23 08:22:49 CEST 2013
On Wed, May 22, 2013 at 9:53 PM, Sebastien Zwickert <dilaroga at gmail.com> wrote:
> Note: it is recommended to use AVCodecContext.get_buffer2() to
> release correctly the dropped buffers and fix memory leaks.
> ---
> libavcodec/vda.h | 12 +++++++++++-
> libavcodec/vda_h264.c | 18 ++++++++++++++++++
> 2 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/vda.h b/libavcodec/vda.h
> index 281785f..5539baa 100644
> --- a/libavcodec/vda.h
> +++ b/libavcodec/vda.h
> @@ -67,11 +67,21 @@ struct vda_context {
> * The Core Video pixel buffer that contains the current image data.
> *
> * encoding: unused
> - * decoding: Set by libavcodec. Unset by user.
> + * decoding: Set by libavcodec. Unset by libavcodec or user.
> */
> CVPixelBufferRef cv_buffer;
>
> /**
> + * If this property is set the core video buffer is released by the decoder, otherwise
> + * the user is responsible itself for releasing the core video buffer in AVFrame.data[3]
> + * with CVPixelBufferRelease().
> + *
> + * encoding: unused
> + * decoding: Set by user.
> + */
> + int autorelease_buffer;
> +
> + /**
> * Use the hardware decoder in synchronous mode.
> *
> * encoding: unused
Adding this in the middle of the struct breaks ABI.
> diff --git a/libavcodec/vda_h264.c b/libavcodec/vda_h264.c
> index d0237c2..5516b48 100644
> --- a/libavcodec/vda_h264.c
> +++ b/libavcodec/vda_h264.c
> @@ -28,6 +28,9 @@
> #include "libavutil/avutil.h"
> #include "h264.h"
>
> +struct vda_picture_context {
> + CVPixelBufferRef cv_buffer;
> +};
>
> /* Decoder callback that adds the vda frame to the queue in display order. */
> static void vda_decoder_callback (void *vda_hw_ctx,
> @@ -113,6 +116,7 @@ static int vda_h264_end_frame(AVCodecContext *avctx)
> H264Context *h = avctx->priv_data;
> struct vda_context *vda_ctx = avctx->hwaccel_context;
> AVFrame *frame = &h->cur_pic_ptr->f;
> + struct vda_picture_context *pic_ctx = h->cur_pic_ptr->hwaccel_picture_private;
> int status;
>
> if (!vda_ctx->decoder || !vda_ctx->priv_bitstream)
> @@ -120,6 +124,10 @@ static int vda_h264_end_frame(AVCodecContext *avctx)
>
> status = vda_sync_decode(vda_ctx);
> frame->data[3] = (void*)vda_ctx->cv_buffer;
> + pic_ctx->cv_buffer = vda_ctx->cv_buffer;
> +
> + if (!vda_ctx->autorelease_buffer)
> + CVPixelBufferRetain(pic_ctx->cv_buffer);
>
> if (status)
> av_log(avctx, AV_LOG_ERROR, "Failed to decode frame (%d)\n", status);
> @@ -127,6 +135,14 @@ static int vda_h264_end_frame(AVCodecContext *avctx)
> return status;
> }
>
> +static void vda_h264_release_buffer(void *opaque, uint8_t *data)
> +{
> + struct vda_picture_context *pic_ctx = opaque;
> +
> + CVPixelBufferRelease(pic_ctx->cv_buffer);
> + av_free(pic_ctx);
> +}
> +
> int ff_vda_create_decoder(struct vda_context *vda_ctx,
> uint8_t *extradata,
> int extradata_size)
> @@ -234,4 +250,6 @@ AVHWAccel ff_h264_vda_hwaccel = {
> .start_frame = vda_h264_start_frame,
> .decode_slice = vda_h264_decode_slice,
> .end_frame = vda_h264_end_frame,
> + .release_buffer = vda_h264_release_buffer,
> + .priv_data_size = sizeof(struct vda_picture_context),
> };
> --
> 1.7.9.6 (Apple Git-31.1)
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list