From e1bd43452860badc19cfd2771a1a92c7bb27b5d9 Mon Sep 17 00:00:00 2001 From: James Bowley <12133430+cudawarped@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:36:23 +0300 Subject: [PATCH] Address cmake errors, build warnings and use codec supported by windows ffmpeg.dll in perf tests. --- modules/cudacodec/CMakeLists.txt | 26 ++++++--- .../cudacodec/include/opencv2/cudacodec.hpp | 10 ++-- modules/cudacodec/perf/perf_video.cpp | 2 +- modules/cudacodec/src/NvEncoder.cpp | 43 +++++++++------ modules/cudacodec/src/NvEncoderCuda.cpp | 2 +- modules/cudacodec/src/video_writer.cpp | 25 ++++++--- modules/cudacodec/test/test_video.cpp | 55 ++++++++++--------- 7 files changed, 96 insertions(+), 67 deletions(-) diff --git a/modules/cudacodec/CMakeLists.txt b/modules/cudacodec/CMakeLists.txt index 1720d9c7c..6ff9f1ae9 100644 --- a/modules/cudacodec/CMakeLists.txt +++ b/modules/cudacodec/CMakeLists.txt @@ -6,20 +6,30 @@ set(the_description "CUDA-accelerated Video Encoding/Decoding") ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127 /wd4324 /wd4512 -Wundef -Wshadow) -ocv_add_module(cudacodec opencv_core opencv_videoio opencv_cudaarithm opencv_cudawarping OPTIONAL opencv_cudev WRAP python) +set(required_dependencies opencv_core opencv_videoio opencv_cudaarithm opencv_cudawarping) +if(HAVE_NVCUVENC) + list(APPEND required_dependencies opencv_cudaimgproc) +endif() + +ocv_add_module(cudacodec ${required_dependencies} OPTIONAL opencv_cudev WRAP python) ocv_module_include_directories() ocv_glob_module_sources() set(extra_libs "") -if(HAVE_NVCUVID) - list(APPEND extra_libs ${CUDA_CUDA_LIBRARY} ${CUDA_nvcuvid_LIBRARY}) -endif() - -if(HAVE_NVCUVENC) - list(APPEND extra_libs ${CUDA_CUDA_LIBRARY} ${CUDA_nvencodeapi_LIBRARY}) - ocv_add_module(cudacodec opencv_cudaimgproc) +if(HAVE_NVCUVID OR HAVE_NVCUVENC) + list(APPEND extra_libs ${CUDA_CUDA_LIBRARY}) + if(HAVE_NVCUVID) + list(APPEND extra_libs ${CUDA_nvcuvid_LIBRARY}) + endif() + if(HAVE_NVCUVENC) + if(WIN32) + list(APPEND extra_libs ${CUDA_nvencodeapi_LIBRARY}) + else() + list(APPEND extra_libs ${CUDA_nvidia-encode_LIBRARY}) + endif() + endif() endif() ocv_create_module(${extra_libs}) diff --git a/modules/cudacodec/include/opencv2/cudacodec.hpp b/modules/cudacodec/include/opencv2/cudacodec.hpp index cb8b725dd..7a17e0292 100644 --- a/modules/cudacodec/include/opencv2/cudacodec.hpp +++ b/modules/cudacodec/include/opencv2/cudacodec.hpp @@ -184,7 +184,7 @@ public: CV_PROP_RW ENC_QP constQp; //!< QP's for ENC_PARAMS_RC_CONSTQP. CV_PROP_RW int averageBitRate; //!< target bitrate for ENC_PARAMS_RC_VBR and ENC_PARAMS_RC_CBR. CV_PROP_RW int maxBitRate; //!< upper bound on bitrate for ENC_PARAMS_RC_VBR and ENC_PARAMS_RC_CONSTQP. - CV_PROP_RW float targetQuality; //!< value 0 - 51 where video quality decreases as targetQuality increases, used with ENC_PARAMS_RC_VBR. + CV_PROP_RW uint8_t targetQuality; //!< value 0 - 51 where video quality decreases as targetQuality increases, used with ENC_PARAMS_RC_VBR. CV_PROP_RW int gopLength; }; CV_EXPORTS bool operator==(const EncoderParams& lhs, const EncoderParams& rhs); @@ -257,8 +257,8 @@ CV_EXPORTS_W Ptr createVideoWriter(const String& fileNam @param bufferFormat Nvidia Video Codec SDK buffer format of the frames to be encoded. @param stream Stream for frame pre-processing. */ -CV_EXPORTS_W Ptr createVideoWriter(const String& fileName, const Size frameSize, const VideoWriterCodec codec = VideoWriterCodec::H264, - const double fps = 25.0, const ENC_BUFFER_FORMAT bufferFormat = BF_ARGB, const Stream& stream = Stream::Null()); +CV_EXPORTS_W Ptr createVideoWriter(const String& fileName, const Size frameSize, const VideoWriterCodec codec, + const double fps, const ENC_BUFFER_FORMAT bufferFormat, const Stream& stream = Stream::Null()); /** @brief Creates video writer. @@ -312,8 +312,8 @@ CV_EXPORTS_W Ptr createVideoWriter(const Ptr createVideoWriter(const Ptr& encoderCallback, const Size frameSize, const VideoWriterCodec codec = VideoWriterCodec::H264, - const double fps = 25.0, const ENC_BUFFER_FORMAT bufferFormat = BF_ARGB, const Stream& stream = Stream::Null()); +CV_EXPORTS_W Ptr createVideoWriter(const Ptr& encoderCallback, const Size frameSize, const VideoWriterCodec codec, + const double fps, const ENC_BUFFER_FORMAT bufferFormat, const Stream& stream = Stream::Null()); /** @brief Creates video writer. diff --git a/modules/cudacodec/perf/perf_video.cpp b/modules/cudacodec/perf/perf_video.cpp index ba0f7b7d2..992760630 100644 --- a/modules/cudacodec/perf/perf_video.cpp +++ b/modules/cudacodec/perf/perf_video.cpp @@ -167,7 +167,7 @@ PERF_TEST_P(WriteToFile, VideoWriter, Combine(VIDEO_SRC, COLOR_FORMAT, CODEC)) reader >> frameBgr; ASSERT_FALSE(frameBgr.empty()); if (!writer.isOpened()) - writer.open(outputFile, VideoWriter::fourcc('x', '2', '6', '4'), fps, frameBgr.size()); + writer.open(outputFile, VideoWriter::fourcc('X', 'V', 'I', 'D'), fps, frameBgr.size()); startTimer(); writer.write(frameBgr); stopTimer(); diff --git a/modules/cudacodec/src/NvEncoder.cpp b/modules/cudacodec/src/NvEncoder.cpp index 0a3f12079..78b76c78e 100644 --- a/modules/cudacodec/src/NvEncoder.cpp +++ b/modules/cudacodec/src/NvEncoder.cpp @@ -38,7 +38,8 @@ NvEncoder::NvEncoder(NV_ENC_DEVICE_TYPE eDeviceType, void* pDevice, uint32_t nWi NVENC_THROW_ERROR("EncodeAPI not found", NV_ENC_ERR_NO_ENCODE_DEVICE); } - NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS encodeSessionExParams = { NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER }; + NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS encodeSessionExParams = {}; + encodeSessionExParams.version = NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER; encodeSessionExParams.device = m_pDevice; encodeSessionExParams.deviceType = m_eDeviceType; encodeSessionExParams.apiVersion = NVENCAPI_VERSION; @@ -58,8 +59,8 @@ void NvEncoder::LoadNvEncApi() NVENC_THROW_ERROR("Current Driver Version does not support this NvEncodeAPI version, please upgrade driver", NV_ENC_ERR_INVALID_VERSION); } - - m_nvenc = { NV_ENCODE_API_FUNCTION_LIST_VER }; + m_nvenc = {}; + m_nvenc.version = NV_ENCODE_API_FUNCTION_LIST_VER; NVENC_API_CALL(NvEncodeAPICreateInstance(&m_nvenc)); } @@ -109,7 +110,9 @@ void NvEncoder::CreateDefaultEncoderParams(NV_ENC_INITIALIZE_PARAMS* pIntializeP pIntializeParams->enableEncodeAsync = GetCapabilityValue(codecGuid, NV_ENC_CAPS_ASYNC_ENCODE_SUPPORT); #endif pIntializeParams->tuningInfo = tuningInfo; - NV_ENC_PRESET_CONFIG presetConfig = { NV_ENC_PRESET_CONFIG_VER, { NV_ENC_CONFIG_VER } }; + NV_ENC_PRESET_CONFIG presetConfig = {}; + presetConfig.version = NV_ENC_PRESET_CONFIG_VER; + presetConfig.presetCfg.version = NV_ENC_CONFIG_VER; m_nvenc.nvEncGetEncodePresetConfigEx(m_hEncoder, codecGuid, presetGuid, tuningInfo, &presetConfig); memcpy(pIntializeParams->encodeConfig, &presetConfig.presetCfg, sizeof(NV_ENC_CONFIG)); @@ -200,7 +203,9 @@ void NvEncoder::CreateEncoder(const NV_ENC_INITIALIZE_PARAMS* pEncoderParams) } else { - NV_ENC_PRESET_CONFIG presetConfig = { NV_ENC_PRESET_CONFIG_VER, { NV_ENC_CONFIG_VER } }; + NV_ENC_PRESET_CONFIG presetConfig = {}; + presetConfig.version = NV_ENC_PRESET_CONFIG_VER; + presetConfig.presetCfg.version = NV_ENC_CONFIG_VER; m_nvenc.nvEncGetEncodePresetConfigEx(m_hEncoder, pEncoderParams->encodeGUID, pEncoderParams->presetGUID, pEncoderParams->tuningInfo, &presetConfig); memcpy(&m_encodeConfig, &presetConfig.presetCfg, sizeof(NV_ENC_CONFIG)); } @@ -283,8 +288,8 @@ const NvEncInputFrame* NvEncoder::GetNextInputFrame() void NvEncoder::MapResources(uint32_t bfrIdx) { - NV_ENC_MAP_INPUT_RESOURCE mapInputResource = { NV_ENC_MAP_INPUT_RESOURCE_VER }; - + NV_ENC_MAP_INPUT_RESOURCE mapInputResource = {}; + mapInputResource.version = NV_ENC_MAP_INPUT_RESOURCE_VER; mapInputResource.registeredResource = m_vRegisteredResources[bfrIdx]; NVENC_API_CALL(m_nvenc.nvEncMapInputResource(m_hEncoder, &mapInputResource)); m_vMappedInputBuffers[bfrIdx] = mapInputResource.mappedResource; @@ -319,7 +324,8 @@ void NvEncoder::GetSequenceParams(std::vector& seqParams) { uint8_t spsppsData[1024]; // Assume maximum spspps data is 1KB or less memset(spsppsData, 0, sizeof(spsppsData)); - NV_ENC_SEQUENCE_PARAM_PAYLOAD payload = { NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER }; + NV_ENC_SEQUENCE_PARAM_PAYLOAD payload = {}; + payload.version = NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER; uint32_t spsppsSize = 0; payload.spsppsBuffer = spsppsData; @@ -352,7 +358,9 @@ NVENCSTATUS NvEncoder::DoEncode(NV_ENC_INPUT_PTR inputBuffer, NV_ENC_OUTPUT_PTR void NvEncoder::SendEOS() { - NV_ENC_PIC_PARAMS picParams = { NV_ENC_PIC_PARAMS_VER }; + NV_ENC_PIC_PARAMS picParams = {}; + picParams.version = NV_ENC_PIC_PARAMS_VER; + picParams.encodePicFlags = NV_ENC_PIC_FLAG_EOS; picParams.completionEvent = GetCompletionEvent(m_iToSend % m_nEncoderBuffer); NVENC_API_CALL(m_nvenc.nvEncEncodePicture(m_hEncoder, &picParams)); @@ -378,7 +386,8 @@ void NvEncoder::GetEncodedPacket(std::vector& vOutputBuffer, for (; m_iGot < iEnd; m_iGot++) { WaitForCompletionEvent(m_iGot % m_nEncoderBuffer); - NV_ENC_LOCK_BITSTREAM lockBitstreamData = { NV_ENC_LOCK_BITSTREAM_VER }; + NV_ENC_LOCK_BITSTREAM lockBitstreamData = {}; + lockBitstreamData.version = NV_ENC_LOCK_BITSTREAM_VER; lockBitstreamData.outputBitstream = vOutputBuffer[m_iGot % m_nEncoderBuffer]; lockBitstreamData.doNotWait = false; 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 int width, int height, int pitch, NV_ENC_BUFFER_FORMAT bufferFormat, NV_ENC_BUFFER_USAGE bufferUsage, NV_ENC_FENCE_POINT_D3D12* pInputFencePoint, NV_ENC_FENCE_POINT_D3D12* pOutputFencePoint) { - NV_ENC_REGISTER_RESOURCE registerResource = { NV_ENC_REGISTER_RESOURCE_VER }; + NV_ENC_REGISTER_RESOURCE registerResource = {}; + registerResource.version = NV_ENC_REGISTER_RESOURCE_VER; registerResource.resourceType = eResourceType; registerResource.resourceToRegister = pBuffer; registerResource.width = width; @@ -569,7 +579,6 @@ uint32_t NvEncoder::GetWidthInBytes(const NV_ENC_BUFFER_FORMAT bufferFormat, con return width * 4; default: NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM); - return 0; } } @@ -646,7 +655,6 @@ void NvEncoder::GetChromaSubPlaneOffsets(const NV_ENC_BUFFER_FORMAT bufferFormat return; default: NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM); - return; } } @@ -670,7 +678,6 @@ uint32_t NvEncoder::GetChromaHeight(const NV_ENC_BUFFER_FORMAT bufferFormat, con return 0; default: NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM); - return 0; } } @@ -697,7 +704,6 @@ uint32_t NvEncoder::GetChromaWidthInBytes(const NV_ENC_BUFFER_FORMAT bufferForma return 0; default: NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM); - return 0; } } @@ -708,7 +714,8 @@ int NvEncoder::GetCapabilityValue(GUID guidCodec, NV_ENC_CAPS capsToQuery) { return 0; } - NV_ENC_CAPS_PARAM capsParam = { NV_ENC_CAPS_PARAM_VER }; + NV_ENC_CAPS_PARAM capsParam = {}; + capsParam.version = NV_ENC_CAPS_PARAM_VER; capsParam.capsToQuery = capsToQuery; int v; m_nvenc.nvEncGetEncodeCaps(m_hEncoder, guidCodec, &capsParam, &v); @@ -737,7 +744,6 @@ int NvEncoder::GetFrameSize() const return 4 * GetEncodeWidth() * GetEncodeHeight(); default: NVENC_THROW_ERROR("Invalid Buffer format", NV_ENC_ERR_INVALID_PARAM); - return 0; } } @@ -757,7 +763,8 @@ void NvEncoder::InitializeBitstreamBuffer() { for (int i = 0; i < m_nEncoderBuffer; i++) { - NV_ENC_CREATE_BITSTREAM_BUFFER createBitstreamBuffer = { NV_ENC_CREATE_BITSTREAM_BUFFER_VER }; + NV_ENC_CREATE_BITSTREAM_BUFFER createBitstreamBuffer = {}; + createBitstreamBuffer.version = NV_ENC_CREATE_BITSTREAM_BUFFER_VER; NVENC_API_CALL(m_nvenc.nvEncCreateBitstreamBuffer(m_hEncoder, &createBitstreamBuffer)); m_vBitstreamOutputBuffer[i] = createBitstreamBuffer.bitstreamBuffer; } diff --git a/modules/cudacodec/src/NvEncoderCuda.cpp b/modules/cudacodec/src/NvEncoderCuda.cpp index 195ffde15..9aae90c27 100644 --- a/modules/cudacodec/src/NvEncoderCuda.cpp +++ b/modules/cudacodec/src/NvEncoderCuda.cpp @@ -130,7 +130,7 @@ void NvEncoderCuda::CopyToDeviceFrame(CUcontext device, cuSafeCall(cuCtxPushCurrent(device)); uint32_t srcPitch = nSrcPitch ? nSrcPitch : NvEncoder::GetWidthInBytes(pixelFormat, width); - CUDA_MEMCPY2D m = { 0 }; + CUDA_MEMCPY2D m = {}; m.srcMemoryType = srcMemoryType; if (srcMemoryType == CU_MEMORYTYPE_HOST) { diff --git a/modules/cudacodec/src/video_writer.cpp b/modules/cudacodec/src/video_writer.cpp index ecf07445b..9ac3b57ad 100644 --- a/modules/cudacodec/src/video_writer.cpp +++ b/modules/cudacodec/src/video_writer.cpp @@ -59,6 +59,15 @@ Ptr createVideoWriter(const Ptr&, const #else // !defined HAVE_NVCUVENC +ENC_BUFFER_FORMAT NvSurfaceFormat(const COLOR_FORMAT_CV format); +int NChannels(const COLOR_FORMAT_CV format); +int NChannels(const ENC_BUFFER_FORMAT format); +GUID CodecGuid(const VideoWriterCodec codec); +void FrameRate(const double fps, uint32_t& frameRateNum, uint32_t& frameRateDen); +GUID EncodingProfileGuid(const ENC_PROFILE encodingProfile); +GUID EncodingPresetGuid(const ENC_PRESET nvPreset); +bool Equal(const GUID& g1, const GUID& g2); + EncoderParams::EncoderParams() : nvPreset(ENC_PRESET_P3), tuningInfo(ENC_TUNING_INFO_HIGH_QUALITY), encodingProfile(ENC_CODEC_PROFILE_AUTOSELECT), rateControlMode(ENC_PARAMS_RC_VBR), multiPassEncoding(ENC_MULTI_PASS_DISABLED), constQp({ 0,0,0 }), averageBitRate(0), maxBitRate(0), targetQuality(30), gopLength(0) @@ -119,7 +128,7 @@ public: void close(); private: void Init(const VideoWriterCodec codec, const double fps, const Size frameSz); - void InitializeEncoder(NvEncoderCuda* const pEnc, const GUID codec, const double fps); + void InitializeEncoder(const GUID codec, const double fps); void CopyToNvSurface(const InputArray src); Ptr encoderCallback; @@ -225,7 +234,7 @@ void VideoWriterImpl::Init(const VideoWriterCodec codec, const double fps, const const GUID codecGuid = CodecGuid(codec); try { pEnc = new NvEncoderCuda(cuContext, frameSz.width, frameSz.height, (NV_ENC_BUFFER_FORMAT)surfaceFormatNv); - InitializeEncoder(pEnc, codecGuid, fps); + InitializeEncoder(codecGuid, fps); const cudaStream_t cudaStream = cuda::StreamAccessor::getStream(stream); pEnc->SetIOCudaStreams((NV_ENC_CUSTREAM_PTR)&cudaStream, (NV_ENC_CUSTREAM_PTR)&cudaStream); } @@ -294,10 +303,12 @@ bool Equal(const GUID& g1, const GUID& g2) { return false; } -void VideoWriterImpl::InitializeEncoder(NvEncoderCuda* const pEnc, const GUID codec, const double fps) +void VideoWriterImpl::InitializeEncoder(const GUID codec, const double fps) { - NV_ENC_INITIALIZE_PARAMS initializeParams = { NV_ENC_INITIALIZE_PARAMS_VER }; - NV_ENC_CONFIG encodeConfig = { NV_ENC_CONFIG_VER }; + NV_ENC_INITIALIZE_PARAMS initializeParams = {}; + initializeParams.version = NV_ENC_INITIALIZE_PARAMS_VER; + NV_ENC_CONFIG encodeConfig = {}; + encodeConfig.version = NV_ENC_CONFIG_VER; initializeParams.encodeConfig = &encodeConfig; pEnc->CreateDefaultEncoderParams(&initializeParams, codec, EncodingPresetGuid(encoderParams.nvPreset), (NV_ENC_TUNING_INFO)encoderParams.tuningInfo); FrameRate(fps, initializeParams.frameRateNum, initializeParams.frameRateDen); @@ -332,8 +343,6 @@ void VideoWriterImpl::CopyToNvSurface(const InputArray src) else srcDevice.upload(src); } - Npp8u* pDst[3] = { dst, &dst[encoderInputFrame->pitch * pEnc->GetEncodeHeight()], &dst[encoderInputFrame->pitch * pEnc->GetEncodeHeight() * 2] }; - const NppiSize oSizeROI = { pEnc->GetEncodeWidth(), pEnc->GetEncodeHeight() }; if (surfaceFormatCv == COLOR_FORMAT_CV::BGR) { GpuMat dstGpuMat(pEnc->GetEncodeHeight(), pEnc->GetEncodeWidth(), CV_8UC4, dst, encoderInputFrame->pitch); cuda::cvtColor(srcDevice, dstGpuMat, COLOR_BGR2BGRA, 0, stream); @@ -362,7 +371,7 @@ void VideoWriterImpl::CopyToNvSurface(const InputArray src) else { void* srcPtr = src.isGpuMat() ? src.getGpuMat().data : src.getMat().data; const CUmemorytype cuMemoryType = src.isGpuMat() ? CU_MEMORYTYPE_DEVICE : CU_MEMORYTYPE_HOST; - NvEncoderCuda::CopyToDeviceFrame(cuContext, srcPtr, src.step(), (CUdeviceptr)encoderInputFrame->inputPtr, (int)encoderInputFrame->pitch, pEnc->GetEncodeWidth(), + NvEncoderCuda::CopyToDeviceFrame(cuContext, srcPtr, static_cast(src.step()), (CUdeviceptr)encoderInputFrame->inputPtr, (int)encoderInputFrame->pitch, pEnc->GetEncodeWidth(), pEnc->GetEncodeHeight(), cuMemoryType, encoderInputFrame->bufferFormat, encoderInputFrame->chromaOffsets, encoderInputFrame->numChromaPlanes, false, cuda::StreamAccessor::getStream(stream)); } diff --git a/modules/cudacodec/test/test_video.cpp b/modules/cudacodec/test/test_video.cpp index 6271243f5..39a243d5e 100644 --- a/modules/cudacodec/test/test_video.cpp +++ b/modules/cudacodec/test/test_video.cpp @@ -143,7 +143,7 @@ CUDA_TEST_P(CheckExtraData, Reader) ASSERT_EQ(extraDataIdx, 1 ); ASSERT_TRUE(reader->grab()); cv::Mat extraData; - const bool newData = reader->retrieve(extraData, extraDataIdx); + const bool newData = reader->retrieve(extraData, static_cast(extraDataIdx)); ASSERT_TRUE((newData && sz) || (!newData && !sz)); ASSERT_EQ(extraData.total(), sz); } @@ -170,7 +170,7 @@ CUDA_TEST_P(CheckKeyFrame, Reader) ASSERT_TRUE(reader->grab()); double N = -1; ASSERT_TRUE(reader->get(cv::cudacodec::VideoReaderProps::PROP_NUMBER_OF_RAW_PACKAGES_SINCE_LAST_GRAB,N)); - for (int i = rawIdxBase; i < N + rawIdxBase; i++) { + for (int i = static_cast(rawIdxBase); i < static_cast(N + rawIdxBase); i++) { nPackages++; double containsKeyFrame = i; ASSERT_TRUE(reader->get(cv::cudacodec::VideoReaderProps::PROP_LRF_HAS_KEY_FRAME, containsKeyFrame)); @@ -197,10 +197,11 @@ CUDA_TEST_P(Scaling, Reader) } cudacodec::VideoReaderInitParams params; - params.targetSz = Size(frameOr.cols * targetSzIn.width, frameOr.rows * targetSzIn.height); - params.srcRoi = Rect(frameOr.cols * srcRoiIn.x, frameOr.rows * srcRoiIn.y, frameOr.cols * srcRoiIn.width, frameOr.rows * srcRoiIn.height); - params.targetRoi = Rect(params.targetSz.width * targetRoiIn.x, params.targetSz.height * targetRoiIn.y, params.targetSz.width * targetRoiIn.width, - params.targetSz.height * targetRoiIn.height); + params.targetSz = Size(static_cast(frameOr.cols * targetSzIn.width), static_cast(frameOr.rows * targetSzIn.height)); + params.srcRoi = Rect(static_cast(frameOr.cols * srcRoiIn.x), static_cast(frameOr.rows * srcRoiIn.y), static_cast(frameOr.cols * srcRoiIn.width), + static_cast(frameOr.rows * srcRoiIn.height)); + params.targetRoi = Rect(static_cast(params.targetSz.width * targetRoiIn.x), static_cast(params.targetSz.height * targetRoiIn.y), + static_cast(params.targetSz.width * targetRoiIn.width), static_cast(params.targetSz.height * targetRoiIn.height)); cv::Ptr reader = cv::cudacodec::createVideoReader(inputFile, {}, params); reader->set(cudacodec::ColorFormat::GRAY); GpuMat frame; @@ -256,7 +257,7 @@ CUDA_TEST_P(Video, Reader) ASSERT_TRUE(reader->nextFrame(frame)); if(!fmt.valid) fmt = reader->format(); - const int height = formatToChannels.first == cudacodec::ColorFormat::YUV ? 1.5 * fmt.height : fmt.height; + const int height = formatToChannels.first == cudacodec::ColorFormat::YUV ? static_cast(1.5 * fmt.height) : fmt.height; ASSERT_TRUE(frame.cols == fmt.width && frame.rows == height); ASSERT_FALSE(frame.empty()); ASSERT_TRUE(frame.channels() == formatToChannels.second); @@ -291,9 +292,9 @@ CUDA_TEST_P(VideoReadRaw, Reader) double N = -1; ASSERT_TRUE(reader->get(cv::cudacodec::VideoReaderProps::PROP_NUMBER_OF_RAW_PACKAGES_SINCE_LAST_GRAB,N)); ASSERT_TRUE(N >= 0) << N << " < 0"; - for (int i = rawIdxBase; i <= N + rawIdxBase; i++) { + for (int j = static_cast(rawIdxBase); j <= static_cast(N + rawIdxBase); j++) { Mat rawPackets; - reader->retrieve(rawPackets, i); + reader->retrieve(rawPackets, j); file.write((char*)rawPackets.data, rawPackets.total()); } } @@ -315,7 +316,7 @@ CUDA_TEST_P(VideoReadRaw, Reader) { ASSERT_TRUE(readerReference->nextFrame(reference)); ASSERT_TRUE(readerActual->grab()); - ASSERT_TRUE(readerActual->retrieve(actual, decodedFrameIdx)); + ASSERT_TRUE(readerActual->retrieve(actual, static_cast(decodedFrameIdx))); actual.download(actualHost); reference.download(referenceHost); ASSERT_TRUE(cvtest::norm(actualHost, referenceHost, NORM_INF) == 0); @@ -471,8 +472,8 @@ CUDA_TEST_P(TransCode, H264ToH265) { cv::VideoCapture cap(outputFile); ASSERT_TRUE(cap.isOpened()); - const int width = cap.get(CAP_PROP_FRAME_WIDTH); - const int height = cap.get(CAP_PROP_FRAME_HEIGHT); + const int width = static_cast(cap.get(CAP_PROP_FRAME_WIDTH)); + const int height = static_cast(cap.get(CAP_PROP_FRAME_HEIGHT)); ASSERT_EQ(frameSz, Size(width, height)); ASSERT_EQ(fps, cap.get(CAP_PROP_FPS)); Mat frame; @@ -550,8 +551,8 @@ CUDA_TEST_P(WriteNv, Writer) { cv::VideoCapture cap(outputFile); ASSERT_TRUE(cap.isOpened()); - const int width = cap.get(CAP_PROP_FRAME_WIDTH); - const int height = cap.get(CAP_PROP_FRAME_HEIGHT); + const int width = static_cast(cap.get(CAP_PROP_FRAME_WIDTH)); + const int height = static_cast(cap.get(CAP_PROP_FRAME_HEIGHT)); ASSERT_EQ(frameSz, Size(width, height)); ASSERT_EQ(fps, cap.get(CAP_PROP_FPS)); Mat frame; @@ -624,8 +625,8 @@ CUDA_TEST_P(WriteCv, Writer) { cv::VideoCapture cap(outputFile); ASSERT_TRUE(cap.isOpened()); - const int width = cap.get(CAP_PROP_FRAME_WIDTH); - const int height = cap.get(CAP_PROP_FRAME_HEIGHT); + const int width = static_cast(cap.get(CAP_PROP_FRAME_WIDTH)); + const int height = static_cast(cap.get(CAP_PROP_FRAME_HEIGHT)); ASSERT_EQ(frameSz, Size(width, height)); ASSERT_TRUE(abs(fps - cap.get(CAP_PROP_FPS)) < 0.5); Mat frame; @@ -659,7 +660,7 @@ struct EncoderParamsBase : testing::TestWithParam params.encodingProfile = cv::cudacodec::ENC_PROFILE::ENC_H264_PROFILE_MAIN; params.rateControlMode = cv::cudacodec::ENC_PARAMS_RC_MODE::ENC_PARAMS_RC_CBR; params.multiPassEncoding = cv::cudacodec::ENC_MULTI_PASS::ENC_TWO_PASS_FULL_RESOLUTION; - params.averageBitRate = 1e6; + params.averageBitRate = 1000000; params.maxBitRate = 0; params.targetQuality = 0; params.gopLength = 5; @@ -704,8 +705,8 @@ CUDA_TEST_P(EncoderParamsCv, Writer) { cv::VideoCapture cap(outputFile); ASSERT_TRUE(cap.isOpened()); - const int width = cap.get(CAP_PROP_FRAME_WIDTH); - const int height = cap.get(CAP_PROP_FRAME_HEIGHT); + const int width = static_cast(cap.get(CAP_PROP_FRAME_WIDTH)); + const int height = static_cast(cap.get(CAP_PROP_FRAME_HEIGHT)); ASSERT_EQ(frameSz, Size(width, height)); ASSERT_EQ(fps, cap.get(CAP_PROP_FPS)); const bool checkGop = videoio_registry::hasBackend(CAP_FFMPEG); @@ -713,8 +714,9 @@ CUDA_TEST_P(EncoderParamsCv, Writer) for (int i = 0; i < nFrames; ++i) { cap >> frame; ASSERT_FALSE(frame.empty()); - if (checkGop && (cap.get(CAP_PROP_FRAME_TYPE) == 73)) + if (checkGop && (cap.get(CAP_PROP_FRAME_TYPE) == 73)) { ASSERT_TRUE(i % params.gopLength == 0); + } } } } @@ -760,8 +762,8 @@ CUDA_TEST_P(EncoderParamsNv, Writer) { cv::VideoCapture cap(outputFile); ASSERT_TRUE(cap.isOpened()); - const int width = cap.get(CAP_PROP_FRAME_WIDTH); - const int height = cap.get(CAP_PROP_FRAME_HEIGHT); + const int width = static_cast(cap.get(CAP_PROP_FRAME_WIDTH)); + const int height = static_cast(cap.get(CAP_PROP_FRAME_HEIGHT)); ASSERT_EQ(frameSz, Size(width, height)); ASSERT_EQ(fps, cap.get(CAP_PROP_FPS)); const bool checkGop = videoio_registry::hasBackend(CAP_FFMPEG); @@ -769,8 +771,9 @@ CUDA_TEST_P(EncoderParamsNv, Writer) for (int i = 0; i < nFrames; ++i) { cap >> frame; ASSERT_FALSE(frame.empty()); - if (checkGop && (cap.get(CAP_PROP_FRAME_TYPE) == 73)) + if (checkGop && (cap.get(CAP_PROP_FRAME_TYPE) == 73)) { ASSERT_TRUE(i % params.gopLength == 0); + } } } } @@ -784,9 +787,9 @@ INSTANTIATE_TEST_CASE_P(CUDA_Codec, CheckSet, testing::Combine( testing::Values("highgui/video/big_buck_bunny.mp4"))); #define VIDEO_SRC_SCALING "highgui/video/big_buck_bunny.mp4" -#define TARGET_SZ Size2f(1,1), Size2f(0.8,0.9), Size2f(2.3,1.8) -#define SRC_ROI Rect2f(0,0,1,1), Rect2f(0.25,0.25,0.5,0.5) -#define TARGET_ROI Rect2f(0,0,1,1), Rect2f(0.2,0.3,0.6,0.7) +#define TARGET_SZ Size2f(1,1), Size2f(0.8f,0.9f), Size2f(2.3f,1.8f) +#define SRC_ROI Rect2f(0,0,1,1), Rect2f(0.25f,0.25f,0.5f,0.5f) +#define TARGET_ROI Rect2f(0,0,1,1), Rect2f(0.2f,0.3f,0.6f,0.7f) INSTANTIATE_TEST_CASE_P(CUDA_Codec, Scaling, testing::Combine( ALL_DEVICES, testing::Values(VIDEO_SRC_SCALING), testing::Values(TARGET_SZ), testing::Values(SRC_ROI), testing::Values(TARGET_ROI)));