Skip to content

Commit 72721eb

Browse files
committed
Merge branch 4.x
2 parents 219eaec + d51add3 commit 72721eb

File tree

20 files changed

+507
-436
lines changed

20 files changed

+507
-436
lines changed

.github/workflows/PR-5.x.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,6 @@ jobs:
2626

2727
macOS-X64:
2828
uses: opencv/ci-gha-workflow/.github/workflows/OCV-Contrib-PR-5.x-macOS-x86_64.yaml@main
29+
30+
Linux-RISC-V-Clang:
31+
uses: opencv/ci-gha-workflow/.github/workflows/OCV-Contrib-PR-5.x-RISCV.yaml@main

modules/cudaarithm/test/test_event.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ CUDA_TEST_P(AsyncEvent, Timing)
9191
const double elTimeMs = Event::elapsedTime(startEvent, stopEvent);
9292
ASSERT_GT(elTimeMs, 0);
9393
}
94-
catch (cv::Exception ex) {
94+
catch (const cv::Exception& ex) {
9595
failed = true;
9696
}
9797
ASSERT_EQ(failed, shouldFail.at(i));

modules/cudacodec/include/opencv2/cudacodec.hpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,18 @@ struct CV_EXPORTS_W_SIMPLE EncoderParams
184184
public:
185185
CV_WRAP EncoderParams() : nvPreset(ENC_PRESET_P3), tuningInfo(ENC_TUNING_INFO_HIGH_QUALITY), encodingProfile(ENC_CODEC_PROFILE_AUTOSELECT),
186186
rateControlMode(ENC_PARAMS_RC_VBR), multiPassEncoding(ENC_MULTI_PASS_DISABLED), constQp({ 0,0,0 }), averageBitRate(0), maxBitRate(0),
187-
targetQuality(30), gopLength(0) {};
188-
187+
targetQuality(30), gopLength(250), idrPeriod(250) {};
189188
CV_PROP_RW EncodePreset nvPreset;
190189
CV_PROP_RW EncodeTuningInfo tuningInfo;
191190
CV_PROP_RW EncodeProfile encodingProfile;
192191
CV_PROP_RW EncodeParamsRcMode rateControlMode;
193192
CV_PROP_RW EncodeMultiPass multiPassEncoding;
194-
CV_PROP_RW EncodeQp constQp; //!< QP's for ENC_PARAMS_RC_CONSTQP.
195-
CV_PROP_RW int averageBitRate; //!< target bitrate for ENC_PARAMS_RC_VBR and ENC_PARAMS_RC_CBR.
196-
CV_PROP_RW int maxBitRate; //!< upper bound on bitrate for ENC_PARAMS_RC_VBR and ENC_PARAMS_RC_CONSTQP.
197-
CV_PROP_RW uint8_t targetQuality; //!< value 0 - 51 where video quality decreases as targetQuality increases, used with ENC_PARAMS_RC_VBR.
198-
CV_PROP_RW int gopLength;
193+
CV_PROP_RW EncodeQp constQp; //!< QP's for \ref ENC_PARAMS_RC_CONSTQP.
194+
CV_PROP_RW int averageBitRate; //!< target bitrate for \ref ENC_PARAMS_RC_VBR and \ref ENC_PARAMS_RC_CBR.
195+
CV_PROP_RW int maxBitRate; //!< upper bound on bitrate for \ref ENC_PARAMS_RC_VBR and \ref ENC_PARAMS_RC_CONSTQP.
196+
CV_PROP_RW uint8_t targetQuality; //!< value 0 - 51 where video quality decreases as targetQuality increases, used with \ref ENC_PARAMS_RC_VBR.
197+
CV_PROP_RW int gopLength; //!< the number of pictures in one GOP, ensuring \ref idrPeriod >= \ref gopLength.
198+
CV_PROP_RW int idrPeriod; //!< IDR interval, ensuring \ref idrPeriod >= \ref gopLength.
199199
};
200200
CV_EXPORTS bool operator==(const EncoderParams& lhs, const EncoderParams& rhs);
201201

@@ -209,7 +209,7 @@ class CV_EXPORTS_W EncoderCallback {
209209
210210
@param vPacket The raw bitstream for one or more frames.
211211
*/
212-
virtual void onEncoded(std::vector<std::vector<uint8_t>> vPacket) = 0;
212+
virtual void onEncoded(const std::vector<std::vector<uint8_t>>& vPacket) = 0;
213213

214214
/** @brief Callback function to that the encoding has finished.
215215
* */
@@ -218,14 +218,14 @@ class CV_EXPORTS_W EncoderCallback {
218218
virtual ~EncoderCallback() {}
219219
};
220220

221-
/** @brief Video writer interface.
221+
/** @brief Video writer interface, see createVideoWriter().
222222
223-
Available when built with WITH_NVCUVENC=ON while Nvidia's Video Codec SDK is installed.
223+
Available if Nvidia's Video Codec SDK is installed.
224224
225-
Encoding support is dependent on the GPU, refer to the Nvidia Video Codec SDK Video Encode and Decode GPU Support Matrix for details.
225+
Only Codec::H264 and Codec::HEVC are supported with encoding support dependent on the GPU, refer to the Nvidia Video Codec SDK Video Encode and Decode GPU Support Matrix for details.
226226
227227
@note
228-
- An example on how to use the videoWriter class can be found at
228+
- An example on how to use the VideoWriter class can be found at
229229
opencv_source_code/samples/gpu/video_writer.cpp
230230
*/
231231
class CV_EXPORTS_W VideoWriter
@@ -253,9 +253,9 @@ class CV_EXPORTS_W VideoWriter
253253

254254
/** @brief Creates video writer.
255255
256-
@param fileName Name of the output video file. Only raw h264 or hevc files are supported.
256+
@param fileName Name of the output video file.
257257
@param frameSize Size of the input video frames.
258-
@param codec Codec.
258+
@param codec Supports Codec::H264 and Codec::HEVC.
259259
@param fps Framerate of the created video stream.
260260
@param colorFormat OpenCv color format of the frames to be encoded.
261261
@param encoderCallback Callbacks for video encoder. See cudacodec::EncoderCallback. Required for working with the encoded video stream.
@@ -266,9 +266,9 @@ CV_EXPORTS_W Ptr<cudacodec::VideoWriter> createVideoWriter(const String& fileNam
266266

267267
/** @brief Creates video writer.
268268
269-
@param fileName Name of the output video file. Only raw h264 or hevc files are supported.
269+
@param fileName Name of the output video file.
270270
@param frameSize Size of the input video frames.
271-
@param codec Codec.
271+
@param codec Supports Codec::H264 and Codec::HEVC.
272272
@param fps Framerate of the created video stream.
273273
@param colorFormat OpenCv color format of the frames to be encoded.
274274
@param params Additional encoding parameters.
@@ -361,14 +361,14 @@ enum class VideoReaderProps {
361361
#endif
362362
};
363363

364-
/** @brief Video reader interface.
364+
/** @brief Video reader interface, see createVideoReader().
365365
366-
Available when built with WITH_NVCUVID=ON while Nvidia's Video Codec SDK is installed.
366+
Available if Nvidia's Video Codec SDK is installed.
367367
368368
Decoding support is dependent on the GPU, refer to the Nvidia Video Codec SDK Video Encode and Decode GPU Support Matrix for details.
369369
370370
@note
371-
- An example on how to use the videoReader class can be found at
371+
- An example on how to use the VideoReader interface can be found at
372372
opencv_source_code/samples/gpu/video_reader.cpp
373373
*/
374374
class CV_EXPORTS_W VideoReader

modules/cudacodec/src/NvEncoder.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,6 @@
77
#include "NvEncoder.h"
88

99
namespace cv { namespace cudacodec {
10-
#ifndef _WIN32
11-
#include <cstring>
12-
static inline bool operator==(const GUID& guid1, const GUID& guid2) {
13-
return !memcmp(&guid1, &guid2, sizeof(GUID));
14-
}
15-
16-
static inline bool operator!=(const GUID& guid1, const GUID& guid2) {
17-
return !(guid1 == guid2);
18-
}
19-
#endif
2010

2111
NvEncoder::NvEncoder(NV_ENC_DEVICE_TYPE eDeviceType, void* pDevice, uint32_t nWidth, uint32_t nHeight, NV_ENC_BUFFER_FORMAT eBufferFormat,
2212
uint32_t nExtraOutputDelay) :

modules/cudacodec/src/NvEncoder.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@
1515

1616
namespace cv { namespace cudacodec {
1717

18+
#ifndef _WIN32
19+
#include <cstring>
20+
static inline bool operator==(const GUID& guid1, const GUID& guid2) {
21+
return !memcmp(&guid1, &guid2, sizeof(GUID));
22+
}
23+
24+
static inline bool operator!=(const GUID& guid1, const GUID& guid2) {
25+
return !(guid1 == guid2);
26+
}
27+
#endif
28+
1829
#define NVENC_THROW_ERROR( errorStr, errorCode ) \
1930
do \
2031
{ \

modules/cudacodec/src/video_writer.cpp

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ GUID CodecGuid(const Codec codec);
5959
void FrameRate(const double fps, uint32_t& frameRateNum, uint32_t& frameRateDen);
6060
GUID EncodingProfileGuid(const EncodeProfile encodingProfile);
6161
GUID EncodingPresetGuid(const EncodePreset nvPreset);
62-
bool Equal(const GUID& g1, const GUID& g2);
6362

6463
bool operator==(const EncoderParams& lhs, const EncoderParams& rhs)
6564
{
@@ -68,12 +67,48 @@ bool operator==(const EncoderParams& lhs, const EncoderParams& rhs)
6867
rhs.averageBitRate, rhs.maxBitRate, rhs.targetQuality, rhs.gopLength);
6968
};
7069

70+
class FFmpegVideoWriter : public EncoderCallback
71+
{
72+
public:
73+
FFmpegVideoWriter(const String& fileName, const Codec codec, const int fps, const Size sz, const int idrPeriod);
74+
~FFmpegVideoWriter();
75+
void onEncoded(const std::vector<std::vector<uint8_t>>& vPacket);
76+
void onEncodingFinished();
77+
private:
78+
cv::VideoWriter writer;
79+
};
80+
81+
FFmpegVideoWriter::FFmpegVideoWriter(const String& fileName, const Codec codec, const int fps, const Size sz, const int idrPeriod) {
82+
if (!videoio_registry::hasBackend(CAP_FFMPEG))
83+
CV_Error(Error::StsNotImplemented, "FFmpeg backend not found");
84+
const int fourcc = codec == Codec::H264 ? cv::VideoWriter::fourcc('a', 'v', 'c', '1') : cv::VideoWriter::fourcc('h', 'e', 'v', '1');
85+
writer.open(fileName, fourcc, fps, sz, { VideoWriterProperties::VIDEOWRITER_PROP_RAW_VIDEO, 1, VideoWriterProperties::VIDEOWRITER_PROP_KEY_INTERVAL, idrPeriod });
86+
if (!writer.isOpened())
87+
CV_Error(Error::StsUnsupportedFormat, "Unsupported video sink");
88+
}
89+
90+
void FFmpegVideoWriter::onEncodingFinished() {
91+
writer.release();
92+
}
93+
94+
FFmpegVideoWriter::~FFmpegVideoWriter() {
95+
onEncodingFinished();
96+
}
97+
98+
void FFmpegVideoWriter::onEncoded(const std::vector<std::vector<uint8_t>>& vPacket) {
99+
for (auto& packet : vPacket) {
100+
Mat wrappedPacket(1, packet.size(), CV_8UC1, (void*)packet.data());
101+
writer.write(wrappedPacket);
102+
}
103+
}
104+
105+
71106
class RawVideoWriter : public EncoderCallback
72107
{
73108
public:
74-
RawVideoWriter(String fileName);
109+
RawVideoWriter(const String fileName);
75110
~RawVideoWriter();
76-
void onEncoded(std::vector<std::vector<uint8_t>> vPacket);
111+
void onEncoded(const std::vector<std::vector<uint8_t>>& vPacket);
77112
void onEncodingFinished();
78113
private:
79114
std::ofstream fpOut;
@@ -93,9 +128,9 @@ RawVideoWriter::~RawVideoWriter() {
93128
onEncodingFinished();
94129
}
95130

96-
void RawVideoWriter::onEncoded(std::vector<std::vector<uint8_t>> vPacket) {
131+
void RawVideoWriter::onEncoded(const std::vector<std::vector<uint8_t>>& vPacket) {
97132
for (auto& packet : vPacket)
98-
fpOut.write(reinterpret_cast<char*>(packet.data()), packet.size());
133+
fpOut.write(reinterpret_cast<const char*>(packet.data()), packet.size());
99134
}
100135

101136
class VideoWriterImpl : public VideoWriter
@@ -172,12 +207,6 @@ VideoWriterImpl::VideoWriterImpl(const Ptr<EncoderCallback>& encoderCallBack_, c
172207
Init(codec, fps, frameSz);
173208
}
174209

175-
VideoWriterImpl::VideoWriterImpl(const Ptr<EncoderCallback>& encoderCallback, const Size frameSz, const Codec codec, const double fps,
176-
const ColorFormat colorFormat, const Stream& stream) :
177-
VideoWriterImpl(encoderCallback, frameSz, codec, fps, colorFormat, EncoderParams(), stream)
178-
{
179-
}
180-
181210
void VideoWriterImpl::release() {
182211
pEnc->EndEncode(vPacket);
183212
encoderCallback->onEncoded(vPacket);
@@ -271,12 +300,6 @@ GUID EncodingPresetGuid(const EncodePreset nvPreset) {
271300
CV_Error(Error::StsUnsupportedFormat, msg);
272301
}
273302

274-
bool Equal(const GUID& g1, const GUID& g2) {
275-
if (std::tie(g1.Data1, g1.Data2, g1.Data3, g1.Data4) == std::tie(g2.Data1, g2.Data2, g2.Data3, g2.Data4))
276-
return true;
277-
return false;
278-
}
279-
280303
void VideoWriterImpl::InitializeEncoder(const GUID codec, const double fps)
281304
{
282305
NV_ENC_INITIALIZE_PARAMS initializeParams = {};
@@ -293,10 +316,10 @@ void VideoWriterImpl::InitializeEncoder(const GUID codec, const double fps)
293316
initializeParams.encodeConfig->rcParams.maxBitRate = encoderParams.maxBitRate;
294317
initializeParams.encodeConfig->rcParams.targetQuality = encoderParams.targetQuality;
295318
initializeParams.encodeConfig->gopLength = encoderParams.gopLength;
296-
if (Equal(codec, NV_ENC_CODEC_H264_GUID))
297-
initializeParams.encodeConfig->encodeCodecConfig.h264Config.idrPeriod = encoderParams.gopLength;
298-
else if (Equal(codec, NV_ENC_CODEC_HEVC_GUID))
299-
initializeParams.encodeConfig->encodeCodecConfig.hevcConfig.idrPeriod = encoderParams.gopLength;
319+
if (codec == NV_ENC_CODEC_H264_GUID)
320+
initializeParams.encodeConfig->encodeCodecConfig.h264Config.idrPeriod = encoderParams.idrPeriod;
321+
else if (codec == NV_ENC_CODEC_HEVC_GUID)
322+
initializeParams.encodeConfig->encodeCodecConfig.hevcConfig.idrPeriod = encoderParams.idrPeriod;
300323
pEnc->CreateEncoder(&initializeParams);
301324
}
302325

@@ -371,14 +394,25 @@ EncoderParams VideoWriterImpl::getEncoderParams() const {
371394
Ptr<VideoWriter> createVideoWriter(const String& fileName, const Size frameSize, const Codec codec, const double fps, const ColorFormat colorFormat,
372395
Ptr<EncoderCallback> encoderCallback, const Stream& stream)
373396
{
374-
encoderCallback = encoderCallback ? encoderCallback : new RawVideoWriter(fileName);
375-
return makePtr<VideoWriterImpl>(encoderCallback, frameSize, codec, fps, colorFormat, stream);
397+
return createVideoWriter(fileName, frameSize, codec, fps, colorFormat, EncoderParams(), encoderCallback, stream);
376398
}
377399

378400
Ptr<VideoWriter> createVideoWriter(const String& fileName, const Size frameSize, const Codec codec, const double fps, const ColorFormat colorFormat,
379401
const EncoderParams& params, Ptr<EncoderCallback> encoderCallback, const Stream& stream)
380402
{
381-
encoderCallback = encoderCallback ? encoderCallback : new RawVideoWriter(fileName);
403+
CV_Assert(params.idrPeriod >= params.gopLength);
404+
if (!encoderCallback) {
405+
// required until PR for raw video encapsulation is merged and windows dll is updated
406+
#ifndef WIN32 // remove #define and keep code once merged
407+
try {
408+
encoderCallback = new FFmpegVideoWriter(fileName, codec, fps, frameSize, params.idrPeriod);
409+
}
410+
catch (...)
411+
#endif
412+
{
413+
encoderCallback = new RawVideoWriter(fileName);
414+
}
415+
}
382416
return makePtr<VideoWriterImpl>(encoderCallback, frameSize, codec, fps, colorFormat, params, stream);
383417
}
384418

0 commit comments

Comments
 (0)