On Mon, Mar 24, 2014 at 10:12 AM, Luca Barbato <[email protected]> wrote: > On 24/03/14 10:07, Hendrik Leppkes wrote: >> 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(-) >>> >>> 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; >>> } >>> >> >> The seems to unconditionally call uninit/init everytime get_format is >> called, is this really required? AFAIK its called more often then >> really required. >> Maybe check if you actually switch a hwaccel on or off, instead of >> just re-initing it all the time? > > The get_format should be called only when there is a dimension/format > change. >
"should" is fine, but in my experience it isn't. _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
