Skip to content

Commit e1bd434

Browse files
committed
Address cmake errors, build warnings and use codec supported by windows ffmpeg.dll in perf tests.
1 parent 22261ec commit e1bd434

File tree

7 files changed

+96
-67
lines changed

7 files changed

+96
-67
lines changed

modules/cudacodec/CMakeLists.txt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,30 @@ set(the_description "CUDA-accelerated Video Encoding/Decoding")
66

77
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127 /wd4324 /wd4512 -Wundef -Wshadow)
88

9-
ocv_add_module(cudacodec opencv_core opencv_videoio opencv_cudaarithm opencv_cudawarping OPTIONAL opencv_cudev WRAP python)
9+
set(required_dependencies opencv_core opencv_videoio opencv_cudaarithm opencv_cudawarping)
10+
if(HAVE_NVCUVENC)
11+
list(APPEND required_dependencies opencv_cudaimgproc)
12+
endif()
13+
14+
ocv_add_module(cudacodec ${required_dependencies} OPTIONAL opencv_cudev WRAP python)
1015

1116
ocv_module_include_directories()
1217
ocv_glob_module_sources()
1318

1419
set(extra_libs "")
1520

16-
if(HAVE_NVCUVID)
17-
list(APPEND extra_libs ${CUDA_CUDA_LIBRARY} ${CUDA_nvcuvid_LIBRARY})
18-
endif()
19-
20-
if(HAVE_NVCUVENC)
21-
list(APPEND extra_libs ${CUDA_CUDA_LIBRARY} ${CUDA_nvencodeapi_LIBRARY})
22-
ocv_add_module(cudacodec opencv_cudaimgproc)
21+
if(HAVE_NVCUVID OR HAVE_NVCUVENC)
22+
list(APPEND extra_libs ${CUDA_CUDA_LIBRARY})
23+
if(HAVE_NVCUVID)
24+
list(APPEND extra_libs ${CUDA_nvcuvid_LIBRARY})
25+
endif()
26+
if(HAVE_NVCUVENC)
27+
if(WIN32)
28+
list(APPEND extra_libs ${CUDA_nvencodeapi_LIBRARY})
29+
else()
30+
list(APPEND extra_libs ${CUDA_nvidia-encode_LIBRARY})
31+
endif()
32+
endif()
2333
endif()
2434

2535
ocv_create_module(${extra_libs})

modules/cudacodec/include/opencv2/cudacodec.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ struct CV_EXPORTS_W_SIMPLE EncoderParams
184184
CV_PROP_RW ENC_QP constQp; //!< QP's for ENC_PARAMS_RC_CONSTQP.
185185
CV_PROP_RW int averageBitRate; //!< target bitrate for ENC_PARAMS_RC_VBR and ENC_PARAMS_RC_CBR.
186186
CV_PROP_RW int maxBitRate; //!< upper bound on bitrate for ENC_PARAMS_RC_VBR and ENC_PARAMS_RC_CONSTQP.
187-
CV_PROP_RW float targetQuality; //!< value 0 - 51 where video quality decreases as targetQuality increases, used with ENC_PARAMS_RC_VBR.
187+
CV_PROP_RW uint8_t targetQuality; //!< value 0 - 51 where video quality decreases as targetQuality increases, used with ENC_PARAMS_RC_VBR.
188188
CV_PROP_RW int gopLength;
189189
};
190190
CV_EXPORTS bool operator==(const EncoderParams& lhs, const EncoderParams& rhs);
@@ -257,8 +257,8 @@ CV_EXPORTS_W Ptr<cudacodec::VideoWriter> createVideoWriter(const String& fileNam
257257
@param bufferFormat Nvidia Video Codec SDK buffer format of the frames to be encoded.
258258
@param stream Stream for frame pre-processing.
259259
*/
260-
CV_EXPORTS_W Ptr<cudacodec::VideoWriter> createVideoWriter(const String& fileName, const Size frameSize, const VideoWriterCodec codec = VideoWriterCodec::H264,
261-
const double fps = 25.0, const ENC_BUFFER_FORMAT bufferFormat = BF_ARGB, const Stream& stream = Stream::Null());
260+
CV_EXPORTS_W Ptr<cudacodec::VideoWriter> createVideoWriter(const String& fileName, const Size frameSize, const VideoWriterCodec codec,
261+
const double fps, const ENC_BUFFER_FORMAT bufferFormat, const Stream& stream = Stream::Null());
262262

263263
/** @brief Creates video writer.
264264
@@ -312,8 +312,8 @@ CV_EXPORTS_W Ptr<cudacodec::VideoWriter> createVideoWriter(const Ptr<EncoderCall
312312
313313
The constructors initialize video writer. User can implement their own multiplexing with cudacodec::EncoderCallback.
314314
*/
315-
CV_EXPORTS_W Ptr<cudacodec::VideoWriter> createVideoWriter(const Ptr<EncoderCallback>& encoderCallback, const Size frameSize, const VideoWriterCodec codec = VideoWriterCodec::H264,
316-
const double fps = 25.0, const ENC_BUFFER_FORMAT bufferFormat = BF_ARGB, const Stream& stream = Stream::Null());
315+
CV_EXPORTS_W Ptr<cudacodec::VideoWriter> createVideoWriter(const Ptr<EncoderCallback>& encoderCallback, const Size frameSize, const VideoWriterCodec codec,
316+
const double fps, const ENC_BUFFER_FORMAT bufferFormat, const Stream& stream = Stream::Null());
317317

318318
/** @brief Creates video writer.
319319

modules/cudacodec/perf/perf_video.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ PERF_TEST_P(WriteToFile, VideoWriter, Combine(VIDEO_SRC, COLOR_FORMAT, CODEC))
167167
reader >> frameBgr;
168168
ASSERT_FALSE(frameBgr.empty());
169169
if (!writer.isOpened())
170-
writer.open(outputFile, VideoWriter::fourcc('x', '2', '6', '4'), fps, frameBgr.size());
170+
writer.open(outputFile, VideoWriter::fourcc('X', 'V', 'I', 'D'), fps, frameBgr.size());
171171
startTimer();
172172
writer.write(frameBgr);
173173
stopTimer();

modules/cudacodec/src/NvEncoder.cpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ NvEncoder::NvEncoder(NV_ENC_DEVICE_TYPE eDeviceType, void* pDevice, uint32_t nWi
3838
NVENC_THROW_ERROR("EncodeAPI not found", NV_ENC_ERR_NO_ENCODE_DEVICE);
3939
}
4040

41-
NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS encodeSessionExParams = { NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER };
41+
NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS encodeSessionExParams = {};
42+
encodeSessionExParams.version = NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER;
4243
encodeSessionExParams.device = m_pDevice;
4344
encodeSessionExParams.deviceType = m_eDeviceType;
4445
encodeSessionExParams.apiVersion = NVENCAPI_VERSION;
@@ -58,8 +59,8 @@ void NvEncoder::LoadNvEncApi()
5859
NVENC_THROW_ERROR("Current Driver Version does not support this NvEncodeAPI version, please upgrade driver", NV_ENC_ERR_INVALID_VERSION);
5960
}
6061

61-
62-
m_nvenc = { NV_ENCODE_API_FUNCTION_LIST_VER };
62+
m_nvenc = {};
63+
m_nvenc.version = NV_ENCODE_API_FUNCTION_LIST_VER;
6364
NVENC_API_CALL(NvEncodeAPICreateInstance(&m_nvenc));
6465
}
6566

@@ -109,7 +110,9 @@ void NvEncoder::CreateDefaultEncoderParams(NV_ENC_INITIALIZE_PARAMS* pIntializeP
109110
pIntializeParams->enableEncodeAsync = GetCapabilityValue(codecGuid, NV_ENC_CAPS_ASYNC_ENCODE_SUPPORT);
110111
#endif
111112
pIntializeParams->tuningInfo = tuningInfo;
112-
NV_ENC_PRESET_CONFIG presetConfig = { NV_ENC_PRESET_CONFIG_VER, { NV_ENC_CONFIG_VER } };
113+
NV_ENC_PRESET_CONFIG presetConfig = {};
114+
presetConfig.version = NV_ENC_PRESET_CONFIG_VER;
115+
presetConfig.presetCfg.version = NV_ENC_CONFIG_VER;
113116
m_nvenc.nvEncGetEncodePresetConfigEx(m_hEncoder, codecGuid, presetGuid, tuningInfo, &presetConfig);
114117
memcpy(pIntializeParams->encodeConfig, &presetConfig.presetCfg, sizeof(NV_ENC_CONFIG));
115118

@@ -200,7 +203,9 @@ void NvEncoder::CreateEncoder(const NV_ENC_INITIALIZE_PARAMS* pEncoderParams)
200203
}
201204
else
202205
{
203-
NV_ENC_PRESET_CONFIG presetConfig = { NV_ENC_PRESET_CONFIG_VER, { NV_ENC_CONFIG_VER } };
206+
NV_ENC_PRESET_CONFIG presetConfig = {};
207+
presetConfig.version = NV_ENC_PRESET_CONFIG_VER;
208+
presetConfig.presetCfg.version = NV_ENC_CONFIG_VER;
204209
m_nvenc.nvEncGetEncodePresetConfigEx(m_hEncoder, pEncoderParams->encodeGUID, pEncoderParams->presetGUID, pEncoderParams->tuningInfo, &presetConfig);
205210
memcpy(&m_encodeConfig, &presetConfig.presetCfg, sizeof(NV_ENC_CONFIG));
206211
}
@@ -283,8 +288,8 @@ const NvEncInputFrame* NvEncoder::GetNextInputFrame()
283288

284289
void NvEncoder::MapResources(uint32_t bfrIdx)
285290
{
286-
NV_ENC_MAP_INPUT_RESOURCE mapInputResource = { NV_ENC_MAP_INPUT_RESOURCE_VER };
287-
291+
NV_ENC_MAP_INPUT_RESOURCE mapInputResource = {};
292+
mapInputResource.version = NV_ENC_MAP_INPUT_RESOURCE_VER;
288293
mapInputResource.registeredResource = m_vRegisteredResources[bfrIdx];
289294
NVENC_API_CALL(m_nvenc.nvEncMapInputResource(m_hEncoder, &mapInputResource));
290295
m_vMappedInputBuffers[bfrIdx] = mapInputResource.mappedResource;
@@ -319,7 +324,8 @@ void NvEncoder::GetSequenceParams(std::vector<uint8_t>& seqParams)
319324
{
320325
uint8_t spsppsData[1024]; // Assume maximum spspps data is 1KB or less
321326
memset(spsppsData, 0, sizeof(spsppsData));
322-
NV_ENC_SEQUENCE_PARAM_PAYLOAD payload = { NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER };
327+
NV_ENC_SEQUENCE_PARAM_PAYLOAD payload = {};
328+
payload.version = NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER;
323329
uint32_t spsppsSize = 0;
324330

325331
payload.spsppsBuffer = spsppsData;
@@ -352,7 +358,9 @@ NVENCSTATUS NvEncoder::DoEncode(NV_ENC_INPUT_PTR inputBuffer, NV_ENC_OUTPUT_PTR
352358

353359
void NvEncoder::SendEOS()
354360
{
355-
NV_ENC_PIC_PARAMS picParams = { NV_ENC_PIC_PARAMS_VER };
361+
NV_ENC_PIC_PARAMS picParams = {};
362+
picParams.version = NV_ENC_PIC_PARAMS_VER;
363+
356364
picParams.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
357365
picParams.completionEvent = GetCompletionEvent(m_iToSend % m_nEncoderBuffer);
358366
NVENC_API_CALL(m_nvenc.nvEncEncodePicture(m_hEncoder, &picParams));
@@ -378,7 +386,8 @@ void NvEncoder::GetEncodedPacket(std::vector<NV_ENC_OUTPUT_PTR>& vOutputBuffer,
378386
for (; m_iGot < iEnd; m_iGot++)
379387
{
380388
WaitForCompletionEvent(m_iGot % m_nEncoderBuffer);
381-
NV_ENC_LOCK_BITSTREAM lockBitstreamData = { NV_ENC_LOCK_BITSTREAM_VER };
389+
NV_ENC_LOCK_BITSTREAM lockBitstreamData = {};
390+
lockBitstreamData.version = NV_ENC_LOCK_BITSTREAM_VER;
382391
lockBitstreamData.outputBitstream = vOutputBuffer[m_iGot % m_nEncoderBuffer];
383392
lockBitstreamData.doNotWait = false;
384393
NVENC_API_CALL(m_nvenc.nvEncLockBitstream(m_hEncoder, &lockBitstreamData));
@@ -424,7 +433,8 @@ NV_ENC_REGISTERED_PTR NvEncoder::RegisterResource(void* pBuffer, NV_ENC_INPUT_RE
424433
int width, int height, int pitch, NV_ENC_BUFFER_FORMAT bufferFormat, NV_ENC_BUFFER_USAGE bufferUsage,
425434
NV_ENC_FENCE_POINT_D3D12* pInputFencePoint, NV_ENC_FENCE_POINT_D3D12* pOutputFencePoint)
426435
{
427-
NV_ENC_REGISTER_RESOURCE registerResource = { NV_ENC_REGISTER_RESOURCE_VER };
436+
NV_ENC_REGISTER_RESOURCE registerResource = {};
437+
registerResource.version = NV_ENC_REGISTER_RESOURCE_VER;
428438
registerResource.resourceType = eResourceType;
429439
registerResource.resourceToRegister = pBuffer;
430440
registerResource.width = width;
@@ -569,7 +579,6 @@ uint32_t NvEncoder::GetWidthInBytes(const NV_ENC_BUFFER_FORMAT bufferFormat, con
569579
return width * 4;
570580
default:
571581
NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM);
572-
return 0;
573582
}
574583
}
575584

@@ -646,7 +655,6 @@ void NvEncoder::GetChromaSubPlaneOffsets(const NV_ENC_BUFFER_FORMAT bufferFormat
646655
return;
647656
default:
648657
NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM);
649-
return;
650658
}
651659
}
652660

@@ -670,7 +678,6 @@ uint32_t NvEncoder::GetChromaHeight(const NV_ENC_BUFFER_FORMAT bufferFormat, con
670678
return 0;
671679
default:
672680
NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM);
673-
return 0;
674681
}
675682
}
676683

@@ -697,7 +704,6 @@ uint32_t NvEncoder::GetChromaWidthInBytes(const NV_ENC_BUFFER_FORMAT bufferForma
697704
return 0;
698705
default:
699706
NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM);
700-
return 0;
701707
}
702708
}
703709

@@ -708,7 +714,8 @@ int NvEncoder::GetCapabilityValue(GUID guidCodec, NV_ENC_CAPS capsToQuery)
708714
{
709715
return 0;
710716
}
711-
NV_ENC_CAPS_PARAM capsParam = { NV_ENC_CAPS_PARAM_VER };
717+
NV_ENC_CAPS_PARAM capsParam = {};
718+
capsParam.version = NV_ENC_CAPS_PARAM_VER;
712719
capsParam.capsToQuery = capsToQuery;
713720
int v;
714721
m_nvenc.nvEncGetEncodeCaps(m_hEncoder, guidCodec, &capsParam, &v);
@@ -737,7 +744,6 @@ int NvEncoder::GetFrameSize() const
737744
return 4 * GetEncodeWidth() * GetEncodeHeight();
738745
default:
739746
NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM);
740-
return 0;
741747
}
742748
}
743749

@@ -757,7 +763,8 @@ void NvEncoder::InitializeBitstreamBuffer()
757763
{
758764
for (int i = 0; i < m_nEncoderBuffer; i++)
759765
{
760-
NV_ENC_CREATE_BITSTREAM_BUFFER createBitstreamBuffer = { NV_ENC_CREATE_BITSTREAM_BUFFER_VER };
766+
NV_ENC_CREATE_BITSTREAM_BUFFER createBitstreamBuffer = {};
767+
createBitstreamBuffer.version = NV_ENC_CREATE_BITSTREAM_BUFFER_VER;
761768
NVENC_API_CALL(m_nvenc.nvEncCreateBitstreamBuffer(m_hEncoder, &createBitstreamBuffer));
762769
m_vBitstreamOutputBuffer[i] = createBitstreamBuffer.bitstreamBuffer;
763770
}

modules/cudacodec/src/NvEncoderCuda.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ void NvEncoderCuda::CopyToDeviceFrame(CUcontext device,
130130
cuSafeCall(cuCtxPushCurrent(device));
131131

132132
uint32_t srcPitch = nSrcPitch ? nSrcPitch : NvEncoder::GetWidthInBytes(pixelFormat, width);
133-
CUDA_MEMCPY2D m = { 0 };
133+
CUDA_MEMCPY2D m = {};
134134
m.srcMemoryType = srcMemoryType;
135135
if (srcMemoryType == CU_MEMORYTYPE_HOST)
136136
{

modules/cudacodec/src/video_writer.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ Ptr<cudacodec::VideoWriter> createVideoWriter(const Ptr<EncoderCallback>&, const
5959

6060
#else // !defined HAVE_NVCUVENC
6161

62+
ENC_BUFFER_FORMAT NvSurfaceFormat(const COLOR_FORMAT_CV format);
63+
int NChannels(const COLOR_FORMAT_CV format);
64+
int NChannels(const ENC_BUFFER_FORMAT format);
65+
GUID CodecGuid(const VideoWriterCodec codec);
66+
void FrameRate(const double fps, uint32_t& frameRateNum, uint32_t& frameRateDen);
67+
GUID EncodingProfileGuid(const ENC_PROFILE encodingProfile);
68+
GUID EncodingPresetGuid(const ENC_PRESET nvPreset);
69+
bool Equal(const GUID& g1, const GUID& g2);
70+
6271
EncoderParams::EncoderParams() : nvPreset(ENC_PRESET_P3), tuningInfo(ENC_TUNING_INFO_HIGH_QUALITY), encodingProfile(ENC_CODEC_PROFILE_AUTOSELECT),
6372
rateControlMode(ENC_PARAMS_RC_VBR), multiPassEncoding(ENC_MULTI_PASS_DISABLED), constQp({ 0,0,0 }), averageBitRate(0), maxBitRate(0),
6473
targetQuality(30), gopLength(0)
@@ -119,7 +128,7 @@ class VideoWriterImpl : public VideoWriter
119128
void close();
120129
private:
121130
void Init(const VideoWriterCodec codec, const double fps, const Size frameSz);
122-
void InitializeEncoder(NvEncoderCuda* const pEnc, const GUID codec, const double fps);
131+
void InitializeEncoder(const GUID codec, const double fps);
123132
void CopyToNvSurface(const InputArray src);
124133

125134
Ptr<EncoderCallback> encoderCallback;
@@ -225,7 +234,7 @@ void VideoWriterImpl::Init(const VideoWriterCodec codec, const double fps, const
225234
const GUID codecGuid = CodecGuid(codec);
226235
try {
227236
pEnc = new NvEncoderCuda(cuContext, frameSz.width, frameSz.height, (NV_ENC_BUFFER_FORMAT)surfaceFormatNv);
228-
InitializeEncoder(pEnc, codecGuid, fps);
237+
InitializeEncoder(codecGuid, fps);
229238
const cudaStream_t cudaStream = cuda::StreamAccessor::getStream(stream);
230239
pEnc->SetIOCudaStreams((NV_ENC_CUSTREAM_PTR)&cudaStream, (NV_ENC_CUSTREAM_PTR)&cudaStream);
231240
}
@@ -294,10 +303,12 @@ bool Equal(const GUID& g1, const GUID& g2) {
294303
return false;
295304
}
296305

297-
void VideoWriterImpl::InitializeEncoder(NvEncoderCuda* const pEnc, const GUID codec, const double fps)
306+
void VideoWriterImpl::InitializeEncoder(const GUID codec, const double fps)
298307
{
299-
NV_ENC_INITIALIZE_PARAMS initializeParams = { NV_ENC_INITIALIZE_PARAMS_VER };
300-
NV_ENC_CONFIG encodeConfig = { NV_ENC_CONFIG_VER };
308+
NV_ENC_INITIALIZE_PARAMS initializeParams = {};
309+
initializeParams.version = NV_ENC_INITIALIZE_PARAMS_VER;
310+
NV_ENC_CONFIG encodeConfig = {};
311+
encodeConfig.version = NV_ENC_CONFIG_VER;
301312
initializeParams.encodeConfig = &encodeConfig;
302313
pEnc->CreateDefaultEncoderParams(&initializeParams, codec, EncodingPresetGuid(encoderParams.nvPreset), (NV_ENC_TUNING_INFO)encoderParams.tuningInfo);
303314
FrameRate(fps, initializeParams.frameRateNum, initializeParams.frameRateDen);
@@ -332,8 +343,6 @@ void VideoWriterImpl::CopyToNvSurface(const InputArray src)
332343
else
333344
srcDevice.upload(src);
334345
}
335-
Npp8u* pDst[3] = { dst, &dst[encoderInputFrame->pitch * pEnc->GetEncodeHeight()], &dst[encoderInputFrame->pitch * pEnc->GetEncodeHeight() * 2] };
336-
const NppiSize oSizeROI = { pEnc->GetEncodeWidth(), pEnc->GetEncodeHeight() };
337346
if (surfaceFormatCv == COLOR_FORMAT_CV::BGR) {
338347
GpuMat dstGpuMat(pEnc->GetEncodeHeight(), pEnc->GetEncodeWidth(), CV_8UC4, dst, encoderInputFrame->pitch);
339348
cuda::cvtColor(srcDevice, dstGpuMat, COLOR_BGR2BGRA, 0, stream);
@@ -362,7 +371,7 @@ void VideoWriterImpl::CopyToNvSurface(const InputArray src)
362371
else {
363372
void* srcPtr = src.isGpuMat() ? src.getGpuMat().data : src.getMat().data;
364373
const CUmemorytype cuMemoryType = src.isGpuMat() ? CU_MEMORYTYPE_DEVICE : CU_MEMORYTYPE_HOST;
365-
NvEncoderCuda::CopyToDeviceFrame(cuContext, srcPtr, src.step(), (CUdeviceptr)encoderInputFrame->inputPtr, (int)encoderInputFrame->pitch, pEnc->GetEncodeWidth(),
374+
NvEncoderCuda::CopyToDeviceFrame(cuContext, srcPtr, static_cast<unsigned>(src.step()), (CUdeviceptr)encoderInputFrame->inputPtr, (int)encoderInputFrame->pitch, pEnc->GetEncodeWidth(),
366375
pEnc->GetEncodeHeight(), cuMemoryType, encoderInputFrame->bufferFormat, encoderInputFrame->chromaOffsets, encoderInputFrame->numChromaPlanes,
367376
false, cuda::StreamAccessor::getStream(stream));
368377
}

0 commit comments

Comments
 (0)