[vlc-devel] [PATCH] nvdec: removed CPU chroma fallback
Quentin Chateau
quentin.chateau at deepskycorp.com
Thu Mar 12 17:03:32 CET 2020
On 12/03/2020 16:34, Thomas Guillem wrote:
> On Thu, Mar 12, 2020, at 15:28, Quentin Chateau wrote:
>> Hi,
>>
>> Anyone had the courage to take a look at this patch ? It's big but half
>> of it is indentation changes.
> You could split this commit in 2, one commit that indent, and one commit that do the actual change.
Sure, if that helps, I'll do that !
>
> Example:
> https://git.videolan.org/?p=vlc.git;a=commitdiff;h=974070ed691436c0cda14461c3e1db3539f907bd
> https://git.videolan.org/?p=vlc.git;a=commitdiff;h=dfaad5464a99ddcb5aa843b776d016f0073ef838
>
>> This is not just a random patch, there has been a discussion about the
>> nvdec decoder a few days ago, and Jean-Baptiste Kempf confirmed the CPU
>> chroma output for nvdec must be removed.
> I agree too.
>
>> Let me know, I've got a few more patches for nvdec depending on this one.
>>
>> On 03/03/2020 11:46, quentin.chateau at deepskycorp.com wrote:
>>> From: Quentin Chateau <quentin.chateau at deepskycorp.com>
>>>
>>> A GPU to CPU video filter is available
>>> ---
>>> modules/hw/nvdec/nvdec.c | 379 +++++++++++++----------------------
>>> modules/hw/nvdec/nvdec_fmt.h | 9 -
>>> modules/hw/nvdec/nvdec_gl.c | 3 -
>>> 3 files changed, 144 insertions(+), 247 deletions(-)
>>>
>>> diff --git a/modules/hw/nvdec/nvdec.c b/modules/hw/nvdec/nvdec.c
>>> index e5cda56ef3..72875c5ac7 100644
>>> --- a/modules/hw/nvdec/nvdec.c
>>> +++ b/modules/hw/nvdec/nvdec.c
>>> @@ -113,14 +113,14 @@ static vlc_fourcc_t MapSurfaceChroma(cudaVideoChromaFormat chroma, unsigned bitD
>>> switch (chroma) {
>>> case cudaVideoChromaFormat_420:
>>> if (bitDepth <= 8)
>>> - return VLC_CODEC_NV12;
>>> + return VLC_CODEC_NVDEC_OPAQUE;
>>> if (bitDepth <= 10)
>>> - return VLC_CODEC_P010;
>>> - return VLC_CODEC_P016;
>>> + return VLC_CODEC_NVDEC_OPAQUE_10B;
>>> + return VLC_CODEC_NVDEC_OPAQUE_16B;
>>> case cudaVideoChromaFormat_444:
>>> if (bitDepth <= 8)
>>> - return VLC_CODEC_I444;
>>> - return VLC_CODEC_I444_16L;
>>> + return VLC_CODEC_NVDEC_OPAQUE_444;
>>> + return VLC_CODEC_NVDEC_OPAQUE_444_16B;
>>> default:
>>> return 0;
>>> }
>>> @@ -131,19 +131,15 @@ static cudaVideoSurfaceFormat MapSurfaceFmt(int i_vlc_fourcc)
>>> switch (i_vlc_fourcc) {
>>> case VLC_CODEC_NVDEC_OPAQUE_10B:
>>> case VLC_CODEC_NVDEC_OPAQUE_16B:
>>> - case VLC_CODEC_P010:
>>> - case VLC_CODEC_P016:
>>> return cudaVideoSurfaceFormat_P016;
>>> case VLC_CODEC_NVDEC_OPAQUE:
>>> - case VLC_CODEC_NV12:
>>> return cudaVideoSurfaceFormat_NV12;
>>> case VLC_CODEC_NVDEC_OPAQUE_444:
>>> - case VLC_CODEC_I444:
>>> return cudaVideoSurfaceFormat_YUV444;
>>> case VLC_CODEC_NVDEC_OPAQUE_444_16B:
>>> - case VLC_CODEC_I444_16L:
>>> - return cudaVideoSurfaceFormat_YUV444_16Bit;
>>> - default: vlc_assert_unreachable();
>>> + return cudaVideoSurfaceFormat_YUV444_16Bit;
>>> + default:
>>> + vlc_assert_unreachable();
>>> }
>>> }
>>>
>>> @@ -151,15 +147,6 @@ static int CUtoFMT(video_format_t *fmt, const CUVIDEOFORMAT *p_format)
>>> {
>>> // bit depth and chroma
>>> unsigned int i_bpp = p_format->bit_depth_luma_minus8 + 8;
>>> - vlc_fourcc_t i_chroma;
>>> - if (is_nvdec_opaque(fmt->i_chroma))
>>> - i_chroma = fmt->i_chroma;
>>> - else
>>> - i_chroma = MapSurfaceChroma(p_format->chroma_format, i_bpp);
>>> - if (i_chroma == 0)
>>> - return VLC_EGENERIC;
>>> -
>>> - fmt->i_chroma = i_chroma;
>>> // use the real padded size when we know it fmt->i_width = p_format->coded_width;
>>> fmt->i_height = p_format->coded_height;
>>> fmt->i_x_offset = p_format->display_area.left;
>>> @@ -179,19 +166,16 @@ static int CUDAAPI HandleVideoSequence(void *p_opaque, CUVIDEOFORMAT *p_format)
>>> nvdec_ctx_t *p_sys = p_dec->p_sys;
>>> int ret;
>>>
>>> - if ( is_nvdec_opaque(p_dec->fmt_out.video.i_chroma) )
>>> + for (size_t i=0; i < ARRAY_SIZE(p_sys->outputDevicePtr); i++)
>>> {
>>> - for (size_t i=0; i < ARRAY_SIZE(p_sys->outputDevicePtr); i++)
>>> - {
>>> - CALL_CUDA_DEC(cuMemFree, p_sys->outputDevicePtr[i]);
>>> - p_sys->outputDevicePtr[i] = 0;
>>> - }
>>> + CALL_CUDA_DEC(cuMemFree, p_sys->outputDevicePtr[i]);
>>> + p_sys->outputDevicePtr[i] = 0;
>>> + }
>>>
>>> - if (p_sys->out_pool)
>>> - {
>>> - picture_pool_Release(p_sys->out_pool);
>>> - p_sys->out_pool = NULL;
>>> - }
>>> + if (p_sys->out_pool)
>>> + {
>>> + picture_pool_Release(p_sys->out_pool);
>>> + p_sys->out_pool = NULL;
>>> }
>>>
>>> // update vlc's output format using NVDEC parser's output
>>> @@ -231,75 +215,71 @@ static int CUDAAPI HandleVideoSequence(void *p_opaque, CUVIDEOFORMAT *p_format)
>>> goto error;
>>>
>>> // ensure the output surfaces have the same pitch so copies can work properly
>>> - if ( is_nvdec_opaque(p_dec->fmt_out.video.i_chroma) )
>>> + // get the real decoder pitch
>>> + CUdeviceptr frameDevicePtr = 0;
>>> + CUVIDPROCPARAMS params = {
>>> + .progressive_frame = 1,
>>> + .top_field_first = 1,
>>> + };
>>> + ret = CALL_CUVID( cuvidMapVideoFrame, p_sys->cudecoder, 0, &frameDevicePtr, &p_sys->outputPitch, ¶ms );
>>> + if (ret != VLC_SUCCESS)
>>> + goto error;
>>> + CALL_CUVID(cuvidUnmapVideoFrame, p_sys->cudecoder, frameDevicePtr);
>>> +
>>> + unsigned int ByteWidth = p_sys->outputPitch;
>>> + unsigned int Height = p_dec->fmt_out.video.i_height;
>>> + switch (dparams.OutputFormat)
>>> {
>>> - // get the real decoder pitch
>>> - CUdeviceptr frameDevicePtr = 0;
>>> - CUVIDPROCPARAMS params = {
>>> - .progressive_frame = 1,
>>> - .top_field_first = 1,
>>> - };
>>> - ret = CALL_CUVID( cuvidMapVideoFrame, p_sys->cudecoder, 0, &frameDevicePtr, &p_sys->outputPitch, ¶ms );
>>> - if (ret != VLC_SUCCESS)
>>> - goto error;
>>> - CALL_CUVID(cuvidUnmapVideoFrame, p_sys->cudecoder, frameDevicePtr);
>>> + case cudaVideoSurfaceFormat_YUV444:
>>> + case cudaVideoSurfaceFormat_YUV444_16Bit:
>>> + Height += 2 * Height; // 3 planes
>>> + break;
>>> + case cudaVideoSurfaceFormat_NV12:
>>> + case cudaVideoSurfaceFormat_P016:
>>> + Height += Height / 2; // U and V at quarter resolution
>>> + break;
>>> + default:
>>> + vlc_assert_unreachable();
>>> + }
>>>
>>> - unsigned int ByteWidth = p_sys->outputPitch;
>>> - unsigned int Height = p_dec->fmt_out.video.i_height;
>>> - switch (dparams.OutputFormat)
>>> + picture_t *pics[ARRAY_SIZE(p_sys->outputDevicePtr)];
>>> + for (size_t i=0; i < ARRAY_SIZE(p_sys->outputDevicePtr); i++)
>>> + {
>>> + ret = CALL_CUDA_DEC(cuMemAlloc, &p_sys->outputDevicePtr[i], ByteWidth * Height);
>>> + if (ret != VLC_SUCCESS || p_sys->outputDevicePtr[i] == 0)
>>> + goto clean_pics;
>>> + picture_resource_t res = {
>>> + .p_sys = (void*)(uintptr_t)i,
>>> + };
>>> + pics[i] = picture_NewFromResource( &p_dec->fmt_out.video, &res );
>>> + if (unlikely(pics[i] == NULL))
>>> {
>>> - case cudaVideoSurfaceFormat_YUV444:
>>> - case cudaVideoSurfaceFormat_YUV444_16Bit:
>>> - Height += 2 * Height; // 3 planes
>>> - break;
>>> - case cudaVideoSurfaceFormat_NV12:
>>> - case cudaVideoSurfaceFormat_P016:
>>> - Height += Height / 2; // U and V at quarter resolution
>>> - break;
>>> - default:
>>> - vlc_assert_unreachable();
>>> + msg_Dbg(p_dec, "failed to get a picture for the buffer");
>>> + ret = VLC_ENOMEM;
>>> + goto clean_pics;
>>> }
>>> -
>>> - picture_t *pics[ARRAY_SIZE(p_sys->outputDevicePtr)];
>>> - for (size_t i=0; i < ARRAY_SIZE(p_sys->outputDevicePtr); i++)
>>> - {
>>> - ret = CALL_CUDA_DEC(cuMemAlloc, &p_sys->outputDevicePtr[i], ByteWidth * Height);
>>> - if (ret != VLC_SUCCESS || p_sys->outputDevicePtr[i] == 0)
>>> - goto clean_pics;
>>> - picture_resource_t res = {
>>> - .p_sys = (void*)(uintptr_t)i,
>>> - };
>>> - pics[i] = picture_NewFromResource( &p_dec->fmt_out.video, &res );
>>> - if (unlikely(pics[i] == NULL))
>>> - {
>>> - msg_Dbg(p_dec, "failed to get a picture for the buffer");
>>> - ret = VLC_ENOMEM;
>>> - goto clean_pics;
>>> - }
>>> - continue;
>>> + continue;
>>> clean_pics:
>>> - if (p_sys->outputDevicePtr[i])
>>> + if (p_sys->outputDevicePtr[i])
>>> + {
>>> + CALL_CUDA_DEC(cuMemFree, p_sys->outputDevicePtr[i]);
>>> + p_sys->outputDevicePtr[i] = 0;
>>> + }
>>> + if (i > 0)
>>> + {
>>> + while (i--)
>>> {
>>> + picture_Release(pics[i]);
>>> CALL_CUDA_DEC(cuMemFree, p_sys->outputDevicePtr[i]);
>>> p_sys->outputDevicePtr[i] = 0;
>>> }
>>> - if (i > 0)
>>> - {
>>> - while (i--)
>>> - {
>>> - picture_Release(pics[i]);
>>> - CALL_CUDA_DEC(cuMemFree, p_sys->outputDevicePtr[i]);
>>> - p_sys->outputDevicePtr[i] = 0;
>>> - }
>>> - }
>>> - break;
>>> }
>>> - if (ret != VLC_SUCCESS)
>>> - goto error;
>>> -
>>> - p_sys->out_pool = picture_pool_New( ARRAY_SIZE(p_sys->outputDevicePtr), pics );
>>> + break;
>>> }
>>> + if (ret != VLC_SUCCESS)
>>> + goto error;
>>>
>>> + p_sys->out_pool = picture_pool_New( ARRAY_SIZE(p_sys->outputDevicePtr), pics );
>>> p_sys->decoderHeight = p_format->coded_height;
>>>
>>> CALL_CUDA_DEC(cuCtxPopCurrent, NULL);
>>> @@ -360,140 +340,96 @@ static int CUDAAPI HandlePictureDisplay(void *p_opaque, CUVIDPARSERDISPINFO *p_d
>>> };
>>> int result;
>>>
>>> - if ( is_nvdec_opaque(p_dec->fmt_out.video.i_chroma) )
>>> - {
>>> - p_pic = picture_pool_Wait(p_sys->out_pool);
>>> - if (unlikely(p_pic == NULL))
>>> - return 0;
>>> + p_pic = picture_pool_Wait(p_sys->out_pool);
>>> + if (unlikely(p_pic == NULL))
>>> + return 0;
>>>
>>> - result = CALL_CUDA_DEC(cuCtxPushCurrent, p_sys->cuCtx);
>>> - if (unlikely(result != VLC_SUCCESS))
>>> - {
>>> - picture_Release(p_pic);
>>> - return 0;
>>> - }
>>> + result = CALL_CUDA_DEC(cuCtxPushCurrent, p_sys->cuCtx);
>>> + if (unlikely(result != VLC_SUCCESS))
>>> + {
>>> + picture_Release(p_pic);
>>> + return 0;
>>> + }
>>>
>>> - unsigned int i_pitch;
>>> + unsigned int i_pitch;
>>>
>>> - // Map decoded frame to a device pointer
>>> - result = CALL_CUVID( cuvidMapVideoFrame, p_sys->cudecoder, p_dispinfo->picture_index,
>>> - &frameDevicePtr, &i_pitch, ¶ms );
>>> - if (result != VLC_SUCCESS)
>>> - goto error;
>>> + // Map decoded frame to a device pointer
>>> + result = CALL_CUVID( cuvidMapVideoFrame, p_sys->cudecoder, p_dispinfo->picture_index,
>>> + &frameDevicePtr, &i_pitch, ¶ms );
>>> + if (result != VLC_SUCCESS)
>>> + goto error;
>>>
>>> - // put a new context in the output picture
>>> - pic_context_nvdec_t *picctx = malloc(sizeof(*picctx));
>>> - if (unlikely(picctx == NULL))
>>> - goto error;
>>> - picctx->ctx = (picture_context_t) {
>>> - NVDecCtxDestroy, NVDecCtxClone,
>>> - p_sys->vctx_out,
>>> - };
>>> - uintptr_t pool_idx = (uintptr_t)p_pic->p_sys;
>>> - picctx->devicePtr = p_sys->outputDevicePtr[pool_idx];
>>> - picctx->bufferPitch = p_sys->outputPitch;
>>> - picctx->bufferHeight = p_sys->decoderHeight;
>>> -
>>> - size_t srcY = 0;
>>> - size_t dstY = 0;
>>> - if (p_pic->format.i_chroma == VLC_CODEC_NVDEC_OPAQUE_444 || p_pic->format.i_chroma == VLC_CODEC_NVDEC_OPAQUE_444_16B)
>>> - {
>>> - for (int i_plane = 0; i_plane < 3; i_plane++) {
>>> - CUDA_MEMCPY2D cu_cpy = {
>>> - .srcMemoryType = CU_MEMORYTYPE_DEVICE,
>>> - .srcDevice = frameDevicePtr,
>>> - .srcY = srcY,
>>> - .srcPitch = i_pitch,
>>> - .dstMemoryType = CU_MEMORYTYPE_DEVICE,
>>> - .dstDevice = picctx->devicePtr,
>>> - .dstPitch = picctx->bufferPitch,
>>> - .dstY = dstY,
>>> - .WidthInBytes = i_pitch,
>>> - .Height = __MIN(picctx->bufferHeight, p_dec->fmt_out.video.i_y_offset + p_dec->fmt_out.video.i_visible_height),
>>> - };
>>> - result = CALL_CUDA_DEC(cuMemcpy2DAsync, &cu_cpy, 0);
>>> - if (unlikely(result != VLC_SUCCESS))
>>> - {
>>> - free(picctx);
>>> - goto error;
>>> - }
>>> - srcY += picctx->bufferHeight;
>>> - dstY += p_sys->decoderHeight;
>>> - }
>>> - }
>>> - else
>>> - {
>>> - for (int i_plane = 0; i_plane < 2; i_plane++) {
>>> - CUDA_MEMCPY2D cu_cpy = {
>>> - .srcMemoryType = CU_MEMORYTYPE_DEVICE,
>>> - .srcDevice = frameDevicePtr,
>>> - .srcY = srcY,
>>> - .srcPitch = i_pitch,
>>> - .dstMemoryType = CU_MEMORYTYPE_DEVICE,
>>> - .dstDevice = picctx->devicePtr,
>>> - .dstPitch = picctx->bufferPitch,
>>> - .dstY = dstY,
>>> - .WidthInBytes = i_pitch,
>>> - .Height = __MIN(picctx->bufferHeight, p_dec->fmt_out.video.i_y_offset + p_dec->fmt_out.video.i_visible_height),
>>> - };
>>> - if (i_plane == 1)
>>> - cu_cpy.Height >>= 1;
>>> - result = CALL_CUDA_DEC(cuMemcpy2DAsync, &cu_cpy, 0);
>>> - if (unlikely(result != VLC_SUCCESS))
>>> - {
>>> - free(picctx);
>>> - goto error;
>>> - }
>>> - srcY += picctx->bufferHeight;
>>> - dstY += p_sys->decoderHeight;
>>> + // put a new context in the output picture
>>> + pic_context_nvdec_t *picctx = malloc(sizeof(*picctx));
>>> + if (unlikely(picctx == NULL))
>>> + goto error;
>>> + picctx->ctx = (picture_context_t) {
>>> + NVDecCtxDestroy, NVDecCtxClone,
>>> + p_sys->vctx_out,
>>> + };
>>> + uintptr_t pool_idx = (uintptr_t)p_pic->p_sys;
>>> + picctx->devicePtr = p_sys->outputDevicePtr[pool_idx];
>>> + picctx->bufferPitch = p_sys->outputPitch;
>>> + picctx->bufferHeight = p_sys->decoderHeight;
>>> +
>>> + size_t srcY = 0;
>>> + size_t dstY = 0;
>>> + if (p_pic->format.i_chroma == VLC_CODEC_NVDEC_OPAQUE_444 || p_pic->format.i_chroma == VLC_CODEC_NVDEC_OPAQUE_444_16B)
>>> + {
>>> + for (int i_plane = 0; i_plane < 3; i_plane++) {
>>> + CUDA_MEMCPY2D cu_cpy = {
>>> + .srcMemoryType = CU_MEMORYTYPE_DEVICE,
>>> + .srcDevice = frameDevicePtr,
>>> + .srcY = srcY,
>>> + .srcPitch = i_pitch,
>>> + .dstMemoryType = CU_MEMORYTYPE_DEVICE,
>>> + .dstDevice = picctx->devicePtr,
>>> + .dstPitch = picctx->bufferPitch,
>>> + .dstY = dstY,
>>> + .WidthInBytes = i_pitch,
>>> + .Height = __MIN(picctx->bufferHeight, p_dec->fmt_out.video.i_y_offset + p_dec->fmt_out.video.i_visible_height),
>>> + };
>>> + result = CALL_CUDA_DEC(cuMemcpy2DAsync, &cu_cpy, 0);
>>> + if (unlikely(result != VLC_SUCCESS))
>>> + {
>>> + free(picctx);
>>> + goto error;
>>> }
>>> + srcY += picctx->bufferHeight;
>>> + dstY += p_sys->decoderHeight;
>>> }
>>> - p_pic->context = &picctx->ctx;
>>> - vlc_video_context_Hold(picctx->ctx.vctx);
>>> }
>>> else
>>> {
>>> - p_pic = decoder_NewPicture(p_dec);
>>> - if (unlikely(p_pic == NULL))
>>> - return 0;
>>> -
>>> - result = CALL_CUDA_DEC(cuCtxPushCurrent, p_sys->cuCtx);
>>> - if (unlikely(result != VLC_SUCCESS))
>>> - {
>>> - picture_Release(p_pic);
>>> - return 0;
>>> - }
>>> -
>>> - unsigned int i_pitch;
>>> -
>>> - // Map decoded frame to a device pointer
>>> - result = CALL_CUVID( cuvidMapVideoFrame, p_sys->cudecoder, p_dispinfo->picture_index,
>>> - &frameDevicePtr, &i_pitch, ¶ms );
>>> - if (result != VLC_SUCCESS)
>>> - goto error;
>>> -
>>> - // Copy decoded frame into a new VLC picture
>>> - size_t srcY = 0;
>>> - for (int i_plane = 0; i_plane < p_pic->i_planes; i_plane++) {
>>> - plane_t plane = p_pic->p[i_plane];
>>> + for (int i_plane = 0; i_plane < 2; i_plane++) {
>>> CUDA_MEMCPY2D cu_cpy = {
>>> .srcMemoryType = CU_MEMORYTYPE_DEVICE,
>>> .srcDevice = frameDevicePtr,
>>> .srcY = srcY,
>>> .srcPitch = i_pitch,
>>> - .dstMemoryType = CU_MEMORYTYPE_HOST,
>>> - .dstHost = plane.p_pixels,
>>> - .dstPitch = plane.i_pitch,
>>> + .dstMemoryType = CU_MEMORYTYPE_DEVICE,
>>> + .dstDevice = picctx->devicePtr,
>>> + .dstPitch = picctx->bufferPitch,
>>> + .dstY = dstY,
>>> .WidthInBytes = i_pitch,
>>> - .Height = plane.i_visible_lines,
>>> + .Height = __MIN(picctx->bufferHeight, p_dec->fmt_out.video.i_y_offset + p_dec->fmt_out.video.i_visible_height),
>>> };
>>> - result = CALL_CUDA_DEC(cuMemcpy2D, &cu_cpy);
>>> - if (result != VLC_SUCCESS)
>>> + if (i_plane == 1)
>>> + cu_cpy.Height >>= 1;
>>> + result = CALL_CUDA_DEC(cuMemcpy2DAsync, &cu_cpy, 0);
>>> + if (unlikely(result != VLC_SUCCESS))
>>> + {
>>> + free(picctx);
>>> goto error;
>>> - srcY += p_sys->decoderHeight;
>>> + }
>>> + srcY += picctx->bufferHeight;
>>> + dstY += p_sys->decoderHeight;
>>> }
>>> }
>>>
>>> + p_pic->context = &picctx->ctx;
>>> + vlc_video_context_Hold(picctx->ctx.vctx);
>>> +
>>> // Release surface on GPU
>>> result = CALL_CUVID(cuvidUnmapVideoFrame, p_sys->cudecoder, frameDevicePtr);
>>> if (unlikely(result != VLC_SUCCESS))
>>> @@ -926,41 +862,14 @@ static int OpenDecoder(vlc_object_t *p_this)
>>> goto error;
>>> }
>>>
>>> - vlc_fourcc_t output_chromas[3];
>>> - size_t chroma_idx = 0;
>>> - if (cudaChroma == cudaVideoChromaFormat_420)
>>> - {
>>> - if (i_depth_luma >= 16)
>>> - output_chromas[chroma_idx++] = VLC_CODEC_NVDEC_OPAQUE_16B;
>>> - else if (i_depth_luma > 8)
>>> - output_chromas[chroma_idx++] = VLC_CODEC_NVDEC_OPAQUE_10B;
>>> - else
>>> - output_chromas[chroma_idx++] = VLC_CODEC_NVDEC_OPAQUE;
>>> - }
>>> - else if (cudaChroma == cudaVideoChromaFormat_444)
>>> - {
>>> - if (i_depth_luma > 8)
>>> - output_chromas[chroma_idx++] = VLC_CODEC_NVDEC_OPAQUE_444_16B;
>>> - else
>>> - output_chromas[chroma_idx++] = VLC_CODEC_NVDEC_OPAQUE_444;
>>> - }
>>> -
>>> - output_chromas[chroma_idx++] = MapSurfaceChroma(cudaChroma, i_depth_luma);
>>> - output_chromas[chroma_idx++] = 0;
>>> -
>>> - for (chroma_idx = 0; output_chromas[chroma_idx] != 0; chroma_idx++)
>>> + p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma =
>>> + MapSurfaceChroma(cudaChroma, i_depth_luma);
>>> + result = decoder_UpdateVideoOutput(p_dec, p_sys->vctx_out);
>>> + if (result != VLC_SUCCESS)
>>> {
>>> - 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)
>>> - {
>>> - msg_Dbg(p_dec, "using chroma %4.4s", (char*)&p_dec->fmt_out.video.i_chroma);
>>> - break;
>>> - }
>>> msg_Warn(p_dec, "Failed to use output chroma %4.4s", (char*)&p_dec->fmt_out.video.i_chroma);
>>> - }
>>> - if (result != VLC_SUCCESS)
>>> goto error;
>>> + }
>>>
>>> int deinterlace_mode = var_InheritInteger(p_dec, "nvdec-deint");
>>> if (deinterlace_mode <= 0)
>>> diff --git a/modules/hw/nvdec/nvdec_fmt.h b/modules/hw/nvdec/nvdec_fmt.h
>>> index 25784cca6d..d84672d8fb 100644
>>> --- a/modules/hw/nvdec/nvdec_fmt.h
>>> +++ b/modules/hw/nvdec/nvdec_fmt.h
>>> @@ -51,15 +51,6 @@ static inline int CudaCheckErr(vlc_object_t *obj, CudaFunctions *cudaFunctions,
>>> return VLC_SUCCESS;
>>> }
>>>
>>> -static inline bool is_nvdec_opaque(vlc_fourcc_t fourcc)
>>> -{
>>> - return fourcc == VLC_CODEC_NVDEC_OPAQUE ||
>>> - fourcc == VLC_CODEC_NVDEC_OPAQUE_10B ||
>>> - fourcc == VLC_CODEC_NVDEC_OPAQUE_16B ||
>>> - fourcc == VLC_CODEC_NVDEC_OPAQUE_444 ||
>>> - fourcc == VLC_CODEC_NVDEC_OPAQUE_444_16B;
>>> -}
>>> -
>>> /* for VLC_CODEC_NVDEC_OPAQUE / VLC_CODEC_NVDEC_OPAQUE_16B */
>>> typedef struct
>>> {
>>> diff --git a/modules/hw/nvdec/nvdec_gl.c b/modules/hw/nvdec/nvdec_gl.c
>>> index 137e730028..62a503a8e8 100644
>>> --- a/modules/hw/nvdec/nvdec_gl.c
>>> +++ b/modules/hw/nvdec/nvdec_gl.c
>>> @@ -156,9 +156,6 @@ static void Close(vlc_object_t *obj)
>>> static int Open(vlc_object_t *obj)
>>> {
>>> struct vlc_gl_interop *interop = (void *) obj;
>>> - if (!is_nvdec_opaque(interop->fmt.i_chroma))
>>> - return VLC_EGENERIC;
>>> -
>>> vlc_decoder_device *device = vlc_video_context_HoldDevice(interop->vctx);
>>> if (device == NULL || device->type != VLC_DECODER_DEVICE_NVDEC)
>>> return VLC_EGENERIC;
>> _______________________________________________
>> 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