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.

lu
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to