[vlc-devel] [PATCH] nvdec: fixed output chroma selection

Quentin Chateau quentin.chateau at deepskycorp.com
Wed Feb 26 12:07:14 CET 2020


Hi,

what happens is that a failed decoder_UpdateVideoOutput ends up calling 
vout_DisableWindow (at least in my case), which resets sys->dec_device. 
On the second call to decoder_UpdateVideoOutput, the assert line 1576 of 
the file src/video_output/video_output.c fails.

Was not sure what the VLC core behavior was supposed to be, so I assumed 
the bug came from the nvdec module, which is pretty new.

On 26/02/2020 11:03, Thomas Guillem wrote:
> Hello,
>
> Are you sure it's not a bug in VLC core ? A failing decoder_UpdateVideoOutput() should not invalidate the video context.
> Anyway, it need to be documented in vlc_codec.h
>
> I will wait for steve (that is AFK until Monday) before doing anything.
>
> On Wed, Feb 26, 2020, at 00:05, Quentin Chateau wrote:
>> The vlc_video_context needs to be re-created after
>> each call to decoder_UpdateVideoOutput.
>> ---
>>   modules/hw/nvdec/nvdec.c | 30 ++++++++++++++++--------------
>>   1 file changed, 16 insertions(+), 14 deletions(-)
>>
>> diff --git a/modules/hw/nvdec/nvdec.c b/modules/hw/nvdec/nvdec.c
>> index e5cda56ef3..7720da0201 100644
>> --- a/modules/hw/nvdec/nvdec.c
>> +++ b/modules/hw/nvdec/nvdec.c
>> @@ -912,20 +912,6 @@ static int OpenDecoder(vlc_object_t *p_this)
>>           goto error;
>>       }
>>   
>> -    vlc_decoder_device *dec_device = decoder_GetDecoderDevice( p_dec );
>> -    if (dec_device == NULL)
>> -        goto error;
>> -    if (dec_device->type == VLC_DECODER_DEVICE_NVDEC)
>> -    {
>> -        p_sys->vctx_out = vlc_video_context_Create( dec_device,
>> VLC_VIDEO_CONTEXT_NVDEC, 0, NULL );
>> -    }
>> -    vlc_decoder_device_Release(dec_device);
>> -    if (unlikely(p_sys->vctx_out == NULL))
>> -    {
>> -        msg_Err(p_dec, "failed to create a video context");
>> -        goto error;
>> -    }
>> -
>>       vlc_fourcc_t output_chromas[3];
>>       size_t chroma_idx = 0;
>>       if (cudaChroma == cudaVideoChromaFormat_420)
>> @@ -950,6 +936,20 @@ static int OpenDecoder(vlc_object_t *p_this)
>>   
>>       for (chroma_idx = 0; output_chromas[chroma_idx] != 0; chroma_idx++)
>>       {
>> +        vlc_decoder_device *dec_device =
>> decoder_GetDecoderDevice(p_dec);
>> +        if (dec_device == NULL)
>> +            goto error;
>> +        if (dec_device->type == VLC_DECODER_DEVICE_NVDEC)
>> +        {
>> +            p_sys->vctx_out = vlc_video_context_Create(dec_device,
>> VLC_VIDEO_CONTEXT_NVDEC, 0, NULL);
>> +        }
>> +        vlc_decoder_device_Release(dec_device);
>> +        if (unlikely(p_sys->vctx_out == NULL))
>> +        {
>> +            msg_Err(p_dec, "failed to create a video context");
>> +            goto error;
>> +        }
>> +
>>           p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma =
>> output_chromas[chroma_idx];
>>           result = decoder_UpdateVideoOutput(p_dec, p_sys->vctx_out);
>>           if (result == VLC_SUCCESS)
>> @@ -958,6 +958,8 @@ static int OpenDecoder(vlc_object_t *p_this)
>>               break;
>>           }
>>           msg_Warn(p_dec, "Failed to use output chroma %4.4s",
>> (char*)&p_dec->fmt_out.video.i_chroma);
>> +        vlc_video_context_Release(p_sys->vctx_out);
>> +        p_sys->vctx_out = NULL;
>>       }
>>       if (result != VLC_SUCCESS)
>>           goto error;
>> -- 
>> 2.20.1
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list