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? - Hendrik _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
