diff --git a/modules/cudacodec/include/opencv2/cudacodec.hpp b/modules/cudacodec/include/opencv2/cudacodec.hpp index 46e699a47..a28a3c593 100644 --- a/modules/cudacodec/include/opencv2/cudacodec.hpp +++ b/modules/cudacodec/include/opencv2/cudacodec.hpp @@ -231,10 +231,11 @@ public: @param codec Codec. @param fps Framerate of the created video stream. @param colorFormat OpenCv color format of the frames to be encoded. +@param encoderCallback Callbacks for video encoder. See cudacodec::EncoderCallback. Required for working with the encoded video stream. @param stream Stream for frame pre-processing. */ -CV_EXPORTS_W Ptr createVideoWriter(const String& fileName, const Size frameSize, const CODEC_VW codec = CODEC_VW::H264, - const double fps = 25.0, const COLOR_FORMAT_VW colorFormat = BGR, const Stream& stream = Stream::Null()); +CV_EXPORTS_W Ptr createVideoWriter(const String& fileName, const Size frameSize, const CODEC_VW codec = CODEC_VW::H264, const double fps = 25.0, + const COLOR_FORMAT_VW colorFormat = BGR, Ptr encoderCallback = 0, const Stream& stream = Stream::Null()); /** @brief Creates video writer. @@ -244,39 +245,11 @@ CV_EXPORTS_W Ptr createVideoWriter(const String& fileNam @param fps Framerate of the created video stream. @param colorFormat OpenCv color format of the frames to be encoded. @param params Additional encoding parameters. +@param encoderCallback Callbacks for video encoder. See cudacodec::EncoderCallback. Required for working with the encoded video stream. @param stream Stream for frame pre-processing. */ -CV_EXPORTS_W Ptr createVideoWriter(const String& fileName, const Size frameSize, const CODEC_VW codec, - const double fps, const COLOR_FORMAT_VW colorFormat, const EncoderParams& params, const Stream& stream = Stream::Null()); - -/** @brief Creates video writer. - -@param encoderCallback Callbacks for video encoder. See cudacodec::EncoderCallback . Use it if you want to work with the raw video stream. -@param frameSize Size of the input video frames. -@param codec Codec. -@param fps Framerate of the created video stream. -@param colorFormat OpenCv color format of the frames to be encoded. -@param stream Stream for frame pre-processing. - -The constructors initialize video writer. User can implement their own multiplexing with cudacodec::EncoderCallback. -*/ -CV_EXPORTS_W Ptr createVideoWriter(const Ptr& encoderCallback, const Size frameSize, const CODEC_VW codec = CODEC_VW::H264, - const double fps = 25.0, const COLOR_FORMAT_VW colorFormat = BGR, const Stream& stream = Stream::Null()); - -/** @brief Creates video writer. - -@param encoderCallback Callbacks for video encoder. See cudacodec::EncoderCallback . Use it if you want to work with the raw video stream. -@param frameSize Size of the input video frames. -@param codec Codec. -@param fps Framerate of the created video stream. -@param colorFormat OpenCv color format of the frames to be encoded. -@param params Additional encoding parameters. -@param stream Stream for frame pre-processing. - -The constructors initialize video writer. User can implement their own multiplexing with cudacodec::EncoderCallback. -*/ -CV_EXPORTS_W Ptr createVideoWriter(const Ptr& encoderCallback, const Size frameSize, const CODEC_VW codec, - const double fps, const COLOR_FORMAT_VW colorFormat, const EncoderParams& params, const Stream& stream = Stream::Null()); +CV_EXPORTS_W Ptr createVideoWriter(const String& fileName, const Size frameSize, const CODEC_VW codec, const double fps, const COLOR_FORMAT_VW colorFormat, + const EncoderParams& params, Ptr encoderCallback = 0, const Stream& stream = Stream::Null()); ////////////////////////////////// Video Decoding ////////////////////////////////////////// diff --git a/modules/cudacodec/perf/perf_video.cpp b/modules/cudacodec/perf/perf_video.cpp index f89370673..713a6062f 100644 --- a/modules/cudacodec/perf/perf_video.cpp +++ b/modules/cudacodec/perf/perf_video.cpp @@ -147,7 +147,7 @@ PERF_TEST_P(WriteToFile, VideoWriter, Combine(VIDEO_SRC, COLOR_FORMAT, CODEC)) frames.push_back(frame); } stream.waitForCompletion(); - cv::Ptr d_writer = cv::cudacodec::createVideoWriter(outputFile, frameBgr.size(), codec, fps, surfaceFormat, stream); + cv::Ptr d_writer = cv::cudacodec::createVideoWriter(outputFile, frameBgr.size(), codec, fps, surfaceFormat, 0, stream); for (int i = 0; i < nFrames - 1; ++i) { startTimer(); d_writer->write(frames[i]); diff --git a/modules/cudacodec/src/video_writer.cpp b/modules/cudacodec/src/video_writer.cpp index 3076881c1..6e2b82f8b 100644 --- a/modules/cudacodec/src/video_writer.cpp +++ b/modules/cudacodec/src/video_writer.cpp @@ -48,10 +48,8 @@ using namespace cv::cuda; #if !defined(HAVE_NVCUVENC) -Ptr createVideoWriter(const String&, const Size, const CODEC_VW, const double, const COLOR_FORMAT_VW, const cv::cuda::Stream&) { throw_no_cuda(); return Ptr(); } -Ptr createVideoWriter(const String&, const Size, const CODEC_VW, const double, const COLOR_FORMAT_VW, const EncoderParams&, const cv::cuda::Stream&) { throw_no_cuda(); return Ptr(); } -Ptr createVideoWriter(const Ptr&, const Size, const CODEC_VW codec, const double, const COLOR_FORMAT_VW, const cv::cuda::Stream&) { throw_no_cuda(); return Ptr(); } -Ptr createVideoWriter(const Ptr&, const Size, const CODEC_VW, const double, const COLOR_FORMAT_VW, const EncoderParams&, const cv::cuda::Stream&) { throw_no_cuda(); return Ptr(); } +Ptr createVideoWriter(const String&, const Size, const CODEC_VW, const double, const COLOR_FORMAT_VW, const Ptr, const cv::cuda::Stream&) { throw_no_cuda(); return Ptr(); } +Ptr createVideoWriter(const String&, const Size, const CODEC_VW, const double, const COLOR_FORMAT_VW, const EncoderParams&, const Ptr, const cv::cuda::Stream&) { throw_no_cuda(); return Ptr(); } #else // !defined HAVE_NVCUVENC @@ -376,29 +374,17 @@ EncoderParams VideoWriterImpl::getEncoderParams() const { return encoderParams; }; -Ptr createVideoWriter(const String& fileName, const Size frameSize, const CODEC_VW codec, const double fps, - const COLOR_FORMAT_VW colorFormat, const Stream& stream) -{ - Ptr rawVideoWriter = new RawVideoWriter(fileName); - return createVideoWriter(rawVideoWriter, frameSize, codec, fps, colorFormat, stream); -} - -Ptr createVideoWriter(const String& fileName, const Size frameSize, const CODEC_VW codec, const double fps, - const COLOR_FORMAT_VW colorFormat, const EncoderParams& params, const Stream& stream) -{ - Ptr rawVideoWriter = new RawVideoWriter(fileName); - return createVideoWriter(rawVideoWriter, frameSize, codec, fps, colorFormat, params, stream); -} - -Ptr createVideoWriter(const Ptr& encoderCallback, const Size frameSize, const CODEC_VW codec, const double fps, - const COLOR_FORMAT_VW colorFormat, const Stream& stream) +Ptr createVideoWriter(const String& fileName, const Size frameSize, const CODEC_VW codec, const double fps, const COLOR_FORMAT_VW colorFormat, + Ptr encoderCallback, const Stream& stream) { + encoderCallback = encoderCallback ? encoderCallback : new RawVideoWriter(fileName); return makePtr(encoderCallback, frameSize, codec, fps, colorFormat, stream); } -Ptr createVideoWriter(const Ptr& encoderCallback, const Size frameSize, const CODEC_VW codec, const double fps, - const COLOR_FORMAT_VW colorFormat, const EncoderParams& params, const Stream& stream) +Ptr createVideoWriter(const String& fileName, const Size frameSize, const CODEC_VW codec, const double fps, const COLOR_FORMAT_VW colorFormat, + const EncoderParams& params, Ptr encoderCallback, const Stream& stream) { + encoderCallback = encoderCallback ? encoderCallback : new RawVideoWriter(fileName); return makePtr(encoderCallback, frameSize, codec, fps, colorFormat, params, stream); } diff --git a/modules/cudacodec/test/test_video.cpp b/modules/cudacodec/test/test_video.cpp index 1d61e9fc7..a1260a6da 100644 --- a/modules/cudacodec/test/test_video.cpp +++ b/modules/cudacodec/test/test_video.cpp @@ -463,7 +463,7 @@ CUDA_TEST_P(TransCode, H264ToH265) Mat tst; frame.download(tst); if (writer.empty()) { frameSz = Size(fmt.width, fmt.height); - writer = cv::cudacodec::createVideoWriter(outputFile, frameSz, codec, fps, colorFormat, stream); + writer = cv::cudacodec::createVideoWriter(outputFile, frameSz, codec, fps, colorFormat, 0, stream); } writer->write(frame); } @@ -537,7 +537,7 @@ CUDA_TEST_P(Write, Writer) ASSERT_FALSE(frame.empty()); if (writer.empty()) { frameSz = frame.size(); - writer = cv::cudacodec::createVideoWriter(outputFile, frameSz, codec, fps, colorFormat, stream); + writer = cv::cudacodec::createVideoWriter(outputFile, frameSz, codec, fps, colorFormat, 0, stream); } CvtColor(frame, frameNewSf, colorFormat); if (deviceSrc) { @@ -618,7 +618,7 @@ CUDA_TEST_P(EncoderParams, Writer) dFrame.upload(frame); if (writer.empty()) { frameSz = frame.size(); - writer = cv::cudacodec::createVideoWriter(outputFile, frameSz, codec, fps, colorFormat, params, stream); + writer = cv::cudacodec::createVideoWriter(outputFile, frameSz, codec, fps, colorFormat, params, 0, stream); cv::cudacodec::EncoderParams paramsOut = writer->getEncoderParams(); ASSERT_EQ(params, paramsOut); }