From d40ca8814ca6c4d1014c4558f69110150c2e539c Mon Sep 17 00:00:00 2001 From: dijunkun Date: Thu, 10 Apr 2025 17:10:40 +0800 Subject: [PATCH] [fix] fix nvcodec crash due to cuda context not being released --- .../decode/nvcodec/nvidia_video_decoder.cpp | 23 +++++++++++-------- .../decode/nvcodec/nvidia_video_decoder.h | 2 ++ .../video/decode/video_decoder_factory.cpp | 3 +-- .../encode/nvcodec/nvidia_video_encoder.cpp | 6 ++++- .../video/encode/video_encoder_factory.cpp | 5 ++-- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/media/video/decode/nvcodec/nvidia_video_decoder.cpp b/src/media/video/decode/nvcodec/nvidia_video_decoder.cpp index 3dfd3b0..5b1d0d9 100644 --- a/src/media/video/decode/nvcodec/nvidia_video_decoder.cpp +++ b/src/media/video/decode/nvcodec/nvidia_video_decoder.cpp @@ -1,7 +1,6 @@ #include "nvidia_video_decoder.h" #include "log.h" -#include "nvcodec_api.h" // #define SAVE_DECODED_NV12_STREAM // #define SAVE_RECEIVED_H264_STREAM @@ -24,29 +23,33 @@ NvidiaVideoDecoder::~NvidiaVideoDecoder() { file_h264_ = nullptr; } #endif + + if (cuda_context_) { + cuCtxDestroy(cuda_context_); + cuda_context_ = nullptr; + } } int NvidiaVideoDecoder::Init() { - ck(cuInit_ld(0)); + ck(cuInit(0)); int nGpu = 0; int iGpu = 0; - ck(cuDeviceGetCount_ld(&nGpu)); + ck(cuDeviceGetCount(&nGpu)); if (nGpu < 1) { return -1; } - CUdevice cuDevice; - cuDeviceGet_ld(&cuDevice, iGpu); + cuDeviceGet(&cuda_device_, iGpu); - CUcontext cuContext = NULL; - cuCtxCreate_ld(&cuContext, 0, cuDevice); - if (!cuContext) { + cuCtxCreate(&cuda_context_, 0, cuda_device_); + if (!cuda_context_) { return -1; } - decoder = new NvDecoder(cuContext, false, cudaVideoCodec_H264, true, false, - nullptr, nullptr, false, 4096, 2160, 1000, false); + decoder = + new NvDecoder(cuda_context_, false, cudaVideoCodec_H264, true, false, + nullptr, nullptr, false, 4096, 2160, 1000, false); #ifdef SAVE_DECODED_NV12_STREAM file_nv12_ = fopen("decoded_nv12_stream.yuv", "w+b"); diff --git a/src/media/video/decode/nvcodec/nvidia_video_decoder.h b/src/media/video/decode/nvcodec/nvidia_video_decoder.h index 354426d..ef9c4f1 100644 --- a/src/media/video/decode/nvcodec/nvidia_video_decoder.h +++ b/src/media/video/decode/nvcodec/nvidia_video_decoder.h @@ -22,6 +22,8 @@ class NvidiaVideoDecoder : public VideoDecoder { private: std::shared_ptr clock_ = nullptr; NvDecoder* decoder = nullptr; + CUcontext cuda_context_ = NULL; + CUdevice cuda_device_ = 0; bool get_first_keyframe_ = false; bool skip_frame_ = false; diff --git a/src/media/video/decode/video_decoder_factory.cpp b/src/media/video/decode/video_decoder_factory.cpp index 382610d..a32a399 100644 --- a/src/media/video/decode/video_decoder_factory.cpp +++ b/src/media/video/decode/video_decoder_factory.cpp @@ -7,7 +7,6 @@ #if __APPLE__ #else #include "nvcodec/nvidia_video_decoder.h" -#include "nvcodec_api.h" #endif #include "log.h" @@ -49,7 +48,7 @@ bool VideoDecoderFactory::CheckIsHardwareAccerlerationSupported() { #else CUresult cuResult; CUvideoctxlock cudaCtxLock; - cuResult = cuvidCtxLockCreate_ld(&cudaCtxLock, 0); + cuResult = cuvidCtxLockCreate(&cudaCtxLock, 0); if (cuResult != CUDA_SUCCESS) { LOG_WARN( "System not support hardware accelerated decode, use default software " diff --git a/src/media/video/encode/nvcodec/nvidia_video_encoder.cpp b/src/media/video/encode/nvcodec/nvidia_video_encoder.cpp index 6c692ad..9cc65eb 100644 --- a/src/media/video/encode/nvcodec/nvidia_video_encoder.cpp +++ b/src/media/video/encode/nvcodec/nvidia_video_encoder.cpp @@ -3,7 +3,6 @@ #include #include "log.h" -#include "nvcodec_api.h" #include "nvcodec_common.h" // #define SAVE_RECEIVED_NV12_STREAM @@ -36,6 +35,11 @@ NvidiaVideoEncoder::~NvidiaVideoEncoder() { if (encoder_) { encoder_->DestroyEncoder(); } + + if (cuda_context_) { + cuCtxDestroy(cuda_context_); + cuda_context_ = nullptr; + } } int NvidiaVideoEncoder::Init() { diff --git a/src/media/video/encode/video_encoder_factory.cpp b/src/media/video/encode/video_encoder_factory.cpp index 36d2019..dd44027 100644 --- a/src/media/video/encode/video_encoder_factory.cpp +++ b/src/media/video/encode/video_encoder_factory.cpp @@ -6,7 +6,6 @@ #else #include "aom/aom_av1_encoder.h" #include "nvcodec/nvidia_video_encoder.h" -#include "nvcodec_api.h" #include "openh264/openh264_encoder.h" #endif @@ -49,7 +48,7 @@ bool VideoEncoderFactory::CheckIsHardwareAccerlerationSupported() { CUresult cuResult; NV_ENCODE_API_FUNCTION_LIST functionList = {NV_ENCODE_API_FUNCTION_LIST_VER}; - cuResult = cuInit_ld(0); + cuResult = cuInit(0); if (cuResult != CUDA_SUCCESS) { LOG_WARN( "System not support hardware accelerated encode, use default software " @@ -57,7 +56,7 @@ bool VideoEncoderFactory::CheckIsHardwareAccerlerationSupported() { return false; } - NVENCSTATUS nvEncStatus = NvEncodeAPICreateInstance_ld(&functionList); + NVENCSTATUS nvEncStatus = NvEncodeAPICreateInstance(&functionList); if (nvEncStatus != NV_ENC_SUCCESS) { LOG_WARN( "System not support hardware accelerated encode, use default software "