我正在尝试开发基于NVIDIA GPU Computing SDK 4.2的cudaDecodeD3D9示例的多流H.264视频播放器。
应用程序可以正常使用几个流,但它会在cuvidCreateDecoder函数中为分辨率为800x600的12个流或分辨率为1920x1080的9个流引发断言(CUDA_ERROR_OUT_OF_MEMORY)。 cudaMemGetInfo返回387MB(适用于1GB的视频卡)和1.3Gb(适用于2GB的视频卡)可用内存。内存碎片会导致这种情况吗?我如何使用可用内存?
VideoDecoder::VideoDecoder(const CUVIDEOFORMAT & rVideoFormat,
CUcontext &rContext,
cudaVideoCreateFlags eCreateFlags,
CUvideoctxlock &vidCtxLock)
: m_VidCtxLock(vidCtxLock)
{
// get a copy of the CUDA context
m_Context = rContext;
m_VideoCreateFlags = eCreateFlags;
// Fill the decoder-create-info struct from the given video-format struct.
memset(&oVideoDecodeCreateInfo_, 0, sizeof(CUVIDDECODECREATEINFO));
// Create video decoder
oVideoDecodeCreateInfo_.CodecType = rVideoFormat.codec;
oVideoDecodeCreateInfo_.ulWidth = rVideoFormat.coded_width;
oVideoDecodeCreateInfo_.ulHeight = rVideoFormat.coded_height;
oVideoDecodeCreateInfo_.ulNumDecodeSurfaces = FrameQueue::cnMaximumSize;
// Limit decode memory to 24MB (16M pixels at 4:2:0 = 24M bytes)
while (oVideoDecodeCreateInfo_.ulNumDecodeSurfaces * rVideoFormat.coded_width * rVideoFormat.coded_height > 16*1024*1024)
{
oVideoDecodeCreateInfo_.ulNumDecodeSurfaces--;
}
oVideoDecodeCreateInfo_.ChromaFormat = rVideoFormat.chroma_format;
oVideoDecodeCreateInfo_.OutputFormat = cudaVideoSurfaceFormat_NV12;
oVideoDecodeCreateInfo_.DeinterlaceMode = cudaVideoDeinterlaceMode_Adaptive;
// No scaling
oVideoDecodeCreateInfo_.ulTargetWidth = oVideoDecodeCreateInfo_.ulWidth;
oVideoDecodeCreateInfo_.ulTargetHeight = oVideoDecodeCreateInfo_.ulHeight;
oVideoDecodeCreateInfo_.ulNumOutputSurfaces = MAX_FRAME_COUNT; // We won't simultaneously map more than 8 surfaces
oVideoDecodeCreateInfo_.ulCreationFlags = m_VideoCreateFlags;
oVideoDecodeCreateInfo_.vidLock = m_VidCtxLock;
size_t available, total;
cudaMemGetInfo(&available, &total);
// create the decoder
CUresult oResult = cuvidCreateDecoder(&oDecoder_, &oVideoDecodeCreateInfo_);
assert(CUDA_SUCCESS == oResult);
}
cuvidCreateDecoder能否在1920x1080分辨率下工作?当我尝试2560x1920流时,cuvidCreateDecoder断言CUDA_ERROR_INVALID_SOURCE。
答案 0 :(得分:1)
有关内存问题,请参阅this answer。
对于有关分辨率的问题,Compute Capability 2.0及更早版本的GPU不支持cudaDecodeD3D9
的高于HD分辨率。这就是您无法解码2560x1920流的原因。
Kepler GPU可支持更大的分辨率。