我测试了nv编解码器SDK项目" NvDecodeD3D11"来自Video_Codec_SDK_8.0.14。当我编译它时,错误发生在cuvidCtxLockCreate(& g_CtxLock,g_oContext);
它表示访问冲突执行位置0x0000000000000000意味着g_CtxLock为NULL。我该如何解决?
您可以从此处下载源代码:https://developer.nvidia.com/designworks/video_codec_sdk/downloads/v8.0
我使用VS 2013在x64平台上编译和配置它。
void initCudaVideo()
{
// bind the context lock to the CUDA context
CUresult result = cuvidCtxLockCreate(&g_CtxLock, g_oContext);
CUVIDEOFORMATEX oFormatEx;
memset(&oFormatEx, 0, sizeof(CUVIDEOFORMATEX));
oFormatEx.format = g_stFormat;
if (result != CUDA_SUCCESS)
{
printf("cuvidCtxLockCreate failed: %d\n", result);
assert(0);
}
CUVIDEOFORMAT videoFormat = g_pVideoSource->format();
CUVIDDECODECAPS videoDecodeCaps = {};
videoDecodeCaps.eCodecType = videoFormat.codec;
videoDecodeCaps.eChromaFormat = videoFormat.chroma_format;
videoDecodeCaps.nBitDepthMinus8 = videoFormat.bit_depth_luma_minus8;
if (cuvidGetDecoderCaps(&videoDecodeCaps) != CUDA_SUCCESS)
{
printf("cuvidGetDecoderCaps failed: %d\n", result);
return;
}
if (!videoDecodeCaps.bIsSupported) {
printf("Error: This video format isn't supported on the selected GPU.");
exit(1);;
}
// If XxY is max supported resolution for a codec on a GPU and YxX resolution
// is also supported then Max Supported width is Max(X, Y) and Max supported height is Max(X, Y)
// But Max supported MBCount is XxY / 256.
// E.g. 4096x2304 is max supported resolution and 2304x4096 is also supported then
// Max Width = 4096, Max Height = 4096, But Max supported MB Count = 4096*2304 / 256 = 36864
printf("This video format is supported on the selected GPU. \n"
" Min resolution supported : %dx%d\n"
" Max width supported : %d\n"
" Max height supported : %d\n"
" Max macroblocks supported: %d\n", videoDecodeCaps.nMinWidth, videoDecodeCaps.nMinHeight,
videoDecodeCaps.nMaxWidth, videoDecodeCaps.nMaxHeight, videoDecodeCaps.nMaxMBCount);
std::unique_ptr<VideoDecoder> apVideoDecoder(new VideoDecoder(g_pVideoSource->format(), g_oContext, g_eVideoCreateFlags, g_CtxLock));
std::unique_ptr<VideoParser> apVideoParser(new VideoParser(apVideoDecoder.get(), g_pFrameQueue, &oFormatEx));
g_pVideoSource->setParser(*apVideoParser.get());
g_pVideoParser = apVideoParser.release();
g_pVideoDecoder = apVideoDecoder.release();
// Create a Stream ID for handling Readback
if (g_bReadback)
{
checkCudaErrors(cuStreamCreate(&g_ReadbackSID, 0));
checkCudaErrors(cuStreamCreate(&g_KernelSID, 0));
printf("> initCudaVideo()\n");
printf(" CUDA Streams (%s) <g_ReadbackSID = %p>\n", ((g_ReadbackSID == 0) ? "Disabled" : "Enabled"), g_ReadbackSID);
printf(" CUDA Streams (%s) <g_KernelSID = %p>\n", ((g_KernelSID == 0) ? "Disabled" : "Enabled"), g_KernelSID);
}
}