[vlc-devel] [BUG] nvdec: use after free

Quentin Chateau quentin.chateau at deepskycorp.com
Tue Mar 24 09:29:57 CET 2020


Thank, I'll take a look at va_surface

On 24/03/2020 09:10, Steve Lhomme wrote:
> Hi,
>
> On 2020-03-23 19:02, Quentin Chateau wrote:
>> Hi,
>>
>> I've identified a bug in the nvdec decoder but I have absolutely no 
>> idea as to what is the correct way of fixing it. I've already sent an 
>> email about this but as nobody answered it, I'm trying again.
>>
>> The decoder contains a pool of CUDA memory:
>>
>> CUdeviceptr                 outputDevicePtr[MAX_POOL_SIZE];
>>
>> This memory is allocated and freed by the decoder. Pictured decoded 
>> by the decoder contain a pointer to this resource:
>>
>> picctx->devicePtr = p_sys->outputDevicePtr[pool_idx];
>>
>> The issue is that when a video ends, the decoder can be released 
>> before all decoded pictures have been consumed by the rest of the 
>> video pipeline. This results in other plugins using already freed 
>> CUDA memory. A visible cause of this is: when using the GPU/CPU 
>> conversion filter, the last frame of the video often logs:
>>
>> [00007f0280a3c570] chroma filter error: cuMemcpy2DAsync failed: 
>> invalid argument (CUDA_ERROR_INVALID_VALUE)
>> [00007f0280a3c570] chroma filter error: cuMemcpy2DAsync failed: 
>> invalid argument (CUDA_ERROR_INVALID_VALUE)
>> [00007f0280a3c570] chroma filter error: cuMemcpy2DAsync failed: 
>> invalid argument (CUDA_ERROR_INVALID_VALUE)
>> [00007f0280a3c570] chroma filter error: cuMemcpy2DAsync failed: 
>> invalid argument (CUDA_ERROR_INVALID_VALUE)
>> [00007f0280a3c570] chroma filter error: cuMemcpy2DAsync failed: 
>> invalid argument (CUDA_ERROR_INVALID_VALUE)
>> [00007f0280a3c570] chroma filter error: cuMemcpy2DAsync failed: 
>> invalid argument (CUDA_ERROR_INVALID_VALUE)
>> [00007f0280a3c570] chroma filter error: cuMemcpy2DAsync failed: 
>> invalid argument (CUDA_ERROR_INVALID_VALUE)
>>
>> My problem is that I can't figure out how to resolve this. It feels 
>> to me that the CUDA memory pool lifetime management does no belong to 
>> the decoder, and yet it needs to allocate/reallocate it depending on 
>> the frame format.
>>
>> Any help would be welcome.
>
> This was designed before we had the whole push system done. The 
> problem you describe indeed exists and was fixed in other decoders. 
> The general solution is not to pre-allocate pictures in the decoders, 
> only the surfaces. Then when you output a picture you allocate it 
> there and set the picture->context which will have a release callback. 
> The last picture displayed should release the last reference to the 
> surface(s) and release everything. There is a va_surface helper/API 
> that helps handle the refcounting.
> _______________________________________________
> 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