[FFmpeg-devel] [PATCH] libavcodec/vp9: Fix VP9 dynamic resolution changing decoding on VAAPI.

Mark Thompson sw at jkqxz.net
Thu May 30 02:39:04 EEST 2019


On 28/05/2019 08:46, Yan Wang wrote:
> 
> On 5/28/2019 3:16 PM, Hendrik Leppkes wrote:
>> On Tue, May 28, 2019 at 8:57 AM Yan Wang <yan.wang at linux.intel.com> wrote:
>>> When the format change, the VAAPI context cannot be destroyed.
>>> Otherwise, the reference frame surface will lost.
>>>
>>> Signed-off-by: Yan Wang <yan.wang at linux.intel.com>
>>> ---
>>>   libavcodec/decode.c | 6 ++++++
>>>   1 file changed, 6 insertions(+)
>>>
>>> diff --git a/libavcodec/decode.c b/libavcodec/decode.c
>>> index 6c31166ec2..3eda1dc42c 100644
>>> --- a/libavcodec/decode.c
>>> +++ b/libavcodec/decode.c
>>> @@ -1397,7 +1397,9 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
>>>
>>>       for (;;) {
>>>           // Remove the previous hwaccel, if there was one.
>>> +#if !CONFIG_VP9_VAAPI_HWACCEL
>>>           hwaccel_uninit(avctx);
>>> +#endif
>>>
>>>           user_choice = avctx->get_format(avctx, choices);
>>>           if (user_choice == AV_PIX_FMT_NONE) {
>>> @@ -1479,7 +1481,11 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
>>>                      "missing configuration.\n", desc->name);
>>>               goto try_again;
>>>           }
>>> +#if CONFIG_VP9_VAAPI_HWACCEL
>>> +        if (hw_config->hwaccel && !avctx->hwaccel) {
>>> +#else
>>>           if (hw_config->hwaccel) {
>>> +#endif
>>>               av_log(avctx, AV_LOG_DEBUG, "Format %s requires hwaccel "
>>>                      "initialisation.\n", desc->name);
>>>               err = hwaccel_init(avctx, hw_config);
>>> -- 
>>> 2.17.2
>>>
>> This change feels just wrong. First of all, preprocessors are
>> absolutely the wrong way to go about this.
> 
> Sorry for this. I am new guy for ffmpeg development. What way should be
> 
> better? I can refine it.
> 
>> Secondly, if the frames need to change size, or surface format, then
>> this absolutely needs to be called, doesn't it?
> 
> Based on VP9 spec, the frame resolution can be changed per frame. But current
> 
> frame will need refer to previous frame still. So if destroy the VAAPI context, it
> 
> will cause reference frame surface in VAAPI driver lost.
> 
> In fact, this patch is for the issue:
> 
> https://github.com/intel/media-driver/issues/629
> 
> its 2nd frame (128x128) will refer to the 1st frame (256x256).

Can you explain exactly what is going wrong here?  The surface is definitely still present - the reference frame list entry holds a reference to it.

- Mark


More information about the ffmpeg-devel mailing list