On 24/03/14 10:20, Hendrik Leppkes wrote:
> 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.

I'll look at the codepath to make sure =) From what I saw in the past
days it is called that way but I hadn't checked exactly that.

lu




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

Reply via email to