On Mon, Mar 24, 2014 at 3:01 AM, Luca Barbato <[email protected]> wrote:
> From: Anton Khirnov <[email protected]>
>
> ---
> libavcodec/avcodec.h | 23 +++++++++++++++++++++++
> libavcodec/internal.h | 5 +++++
> libavcodec/utils.c | 34 ++++++++++++++++++++++++++++++----
> 3 files changed, 58 insertions(+), 4 deletions(-)
I think there should be another minor bump here.
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 264305d..a1d0ae5 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -2945,6 +2945,29 @@ typedef struct AVHWAccel {
> * AVCodecContext.release_buffer().
> */
> int frame_priv_data_size;
> +
> + /**
> + * Initialize the hwaccel private data.
> + *
> + * This will be called from ff_get_format(), after hwaccel and
> + * hwaccel_context are set and the hwaccel private data in
> AVCodecInternal
> + * is allocated.
> + */
> + int (*init)(AVCodecContext *avctx);
> +
> + /**
> + * Uninitialize the hwaccel private data.
> + *
> + * This will be called from get_format() or avcodec_close(), after
> hwaccel
> + * and hwaccel_context are already uninitialized.
> + */
> + int (*uninit)(AVCodecContext *avctx);
> +
> + /**
> + * Size of the private data to allocate in
> + * AVCodecInternal.hwaccel_priv_data.
> + */
> + int priv_data_size;
> } AVHWAccel;
>
> /**
> diff --git a/libavcodec/internal.h b/libavcodec/internal.h
> index 64765a2..17de2d5 100644
> --- a/libavcodec/internal.h
> +++ b/libavcodec/internal.h
> @@ -95,6 +95,11 @@ typedef struct AVCodecInternal {
> * packet into every function.
> */
> AVPacket *pkt;
> +
> + /**
> + * hwaccel-specific private data
> + */
> + void *hwaccel_priv_data;
> } AVCodecInternal;
>
> struct AVCodecDefault {
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index e52d915..5ca7534 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -858,16 +858,37 @@ int ff_get_format(AVCodecContext *avctx, const enum
> AVPixelFormat *fmt)
> if (!desc)
> return AV_PIX_FMT_NONE;
>
> + if (avctx->hwaccel && avctx->hwaccel->uninit)
> + avctx->hwaccel->uninit(avctx);
> + av_freep(&avctx->internal->hwaccel_priv_data);
> + avctx->hwaccel = NULL;
> +
> if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
> - avctx->hwaccel = find_hwaccel(avctx->codec_id, ret);
> - if (!avctx->hwaccel) {
> + AVHWAccel *hwaccel;
> + int err;
> +
> + hwaccel = find_hwaccel(avctx->codec_id, ret);
> + if (!hwaccel) {
> av_log(avctx, AV_LOG_ERROR,
> "Could not find an AVHWAccel for the pixel format: %s",
> desc->name);
> return AV_PIX_FMT_NONE;
> }
> - } else {
> - avctx->hwaccel = NULL;
> +
> + if (hwaccel->priv_data_size) {
> + avctx->internal->hwaccel_priv_data =
> av_mallocz(hwaccel->priv_data_size);
> + if (!avctx->internal->hwaccel_priv_data)
> + return AV_PIX_FMT_NONE;
> + }
> +
> + if (hwaccel->init) {
> + err = hwaccel->init(avctx);
> + if (err < 0) {
> + av_freep(&avctx->internal->hwaccel_priv_data);
> + return AV_PIX_FMT_NONE;
> + }
> + }
> + avctx->hwaccel = hwaccel;
> }
>
> return ret;
> @@ -1653,6 +1674,11 @@ av_cold int avcodec_close(AVCodecContext *avctx)
> for (i = 0; i < FF_ARRAY_ELEMS(pool->pools); i++)
> av_buffer_pool_uninit(&pool->pools[i]);
> av_freep(&avctx->internal->pool);
> +
> + if (avctx->hwaccel && avctx->hwaccel->uninit)
> + avctx->hwaccel->uninit(avctx);
> + av_freep(&avctx->internal->hwaccel_priv_data);
> +
> av_freep(&avctx->internal);
> }
>
Looks ok, but I wouldn't mind a second opinion.
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel