45
45
46
46
namespace opencv_test { namespace {
47
47
48
- #if defined(HAVE_NVCUVID)
48
+ #if defined(HAVE_NVCUVID) || defined(HAVE_NVCUVENC)
49
49
50
50
#if defined(HAVE_FFMPEG_WRAPPER) // should this be set in preprocessor or in cvconfig.h
51
51
#define VIDEO_SRC Values (" cv/video/768x576.avi" , " cv/video/1920x1080.avi" )
@@ -54,6 +54,8 @@ namespace opencv_test { namespace {
54
54
#define VIDEO_SRC Values ( " cv/video/1920x1080.avi" )
55
55
#endif
56
56
57
+ #if defined(HAVE_NVCUVID)
58
+
57
59
DEF_PARAM_TEST_1 (FileName, string);
58
60
59
61
// ////////////////////////////////////////////////////
@@ -93,63 +95,93 @@ PERF_TEST_P(FileName, VideoReader, VIDEO_SRC)
93
95
// ////////////////////////////////////////////////////
94
96
// VideoWriter
95
97
96
- #if defined(HAVE_NVCUVID) && defined(_WIN32 )
98
+ #if defined(HAVE_NVCUVENC )
97
99
98
- PERF_TEST_P (FileName, VideoWriter, VIDEO_SRC)
99
- {
100
- declare.time (30 );
101
-
102
- const string inputFile = perf::TestBase::getDataPath (GetParam ());
103
- const string outputFile = cv::tempfile (" .avi" );
100
+ DEF_PARAM_TEST (WriteToFile, string, cv::cudacodec::COLOR_FORMAT_CV, cv::cudacodec::VideoWriterCodec);
104
101
105
- const double FPS = 25.0 ;
102
+ #define COLOR_FORMAT Values (cv::cudacodec::COLOR_FORMAT_CV::BGR, cv::cudacodec::COLOR_FORMAT_CV::RGB, cv::cudacodec::COLOR_FORMAT_CV::BGRA, \
103
+ cv::cudacodec::COLOR_FORMAT_CV::RGBA, cv::cudacodec::COLOR_FORMAT_CV::GRAY)
104
+ #define CODEC Values (cv::cudacodec::VideoWriterCodec::H264, cv::cudacodec::VideoWriterCodec::HEVC)
106
105
106
+ PERF_TEST_P(WriteToFile, VideoWriter, Combine(VIDEO_SRC, COLOR_FORMAT, CODEC))
107
+ {
108
+ declare.time (30 );
109
+ const string inputFile = perf::TestBase::getDataPath (GET_PARAM (0 ));
110
+ const cv::cudacodec::COLOR_FORMAT_CV surfaceFormat = GET_PARAM (1 );
111
+ const cudacodec::VideoWriterCodec codec = GET_PARAM (2 );
112
+ const double fps = 25 ;
113
+ const int nFrames = 20 ;
107
114
cv::VideoCapture reader (inputFile);
108
- ASSERT_TRUE ( reader.isOpened () );
109
-
110
- cv::Mat frame;
111
-
112
- if (PERF_RUN_CUDA ())
113
- {
114
- cv::Ptr<cv::cudacodec::VideoWriter> d_writer;
115
-
116
- cv::cuda::GpuMat d_frame;
117
-
118
- for (int i = 0 ; i < 10 ; ++i)
119
- {
120
- reader >> frame;
121
- ASSERT_FALSE (frame.empty ());
122
-
123
- d_frame.upload (frame);
124
-
125
- if (d_writer.empty ())
126
- d_writer = cv::cudacodec::createVideoWriter (outputFile, frame.size (), FPS);
127
-
128
- startTimer (); next ();
129
- d_writer->write (d_frame);
115
+ ASSERT_TRUE (reader.isOpened ());
116
+ Mat frameBgr;
117
+ if (PERF_RUN_CUDA ()) {
118
+ const std::string ext = codec == cudacodec::VideoWriterCodec::H264 ? " .h264" : " .hevc" ;
119
+ const string outputFile = cv::tempfile (ext.c_str ());
120
+ std::vector<GpuMat> frames;
121
+ cv::Mat frameNewSf;
122
+ cuda::Stream stream;
123
+ ColorConversionCodes conversionCode = COLOR_COLORCVT_MAX;
124
+ switch (surfaceFormat) {
125
+ case cudacodec::COLOR_FORMAT_CV::RGB:
126
+ conversionCode = COLOR_BGR2RGB;
127
+ break ;
128
+ case cudacodec::COLOR_FORMAT_CV::BGRA:
129
+ conversionCode = COLOR_BGR2BGRA;
130
+ break ;
131
+ case cudacodec::COLOR_FORMAT_CV::RGBA:
132
+ conversionCode = COLOR_BGR2RGBA;
133
+ break ;
134
+ case cudacodec::COLOR_FORMAT_CV::GRAY:
135
+ conversionCode = COLOR_BGR2GRAY;
136
+ default :
137
+ break ;
138
+ }
139
+ for (int i = 0 ; i < nFrames; i++) {
140
+ reader >> frameBgr;
141
+ ASSERT_FALSE (frameBgr.empty ());
142
+ if (conversionCode == COLOR_COLORCVT_MAX)
143
+ frameNewSf = frameBgr;
144
+ else
145
+ cv::cvtColor (frameBgr, frameNewSf, conversionCode);
146
+ GpuMat frame; frame.upload (frameNewSf, stream);
147
+ frames.push_back (frame);
148
+ }
149
+ stream.waitForCompletion ();
150
+ cv::Ptr<cv::cudacodec::VideoWriter> d_writer = cv::cudacodec::createVideoWriter (outputFile, frameBgr.size (), codec, fps, surfaceFormat, stream);
151
+ for (int i = 0 ; i < nFrames - 1 ; ++i) {
152
+ startTimer ();
153
+ d_writer->write (frames[i]);
130
154
stopTimer ();
131
155
}
156
+ startTimer ();
157
+ d_writer->write (frames[nFrames - 1 ]);
158
+ d_writer->close ();
159
+ stopTimer ();
132
160
}
133
- else
134
- {
161
+ else {
162
+ if (surfaceFormat != cv::cudacodec::COLOR_FORMAT_CV::BGR || codec != cv::cudacodec::VideoWriterCodec::H264)
163
+ throw PerfSkipTestException ();
135
164
cv::VideoWriter writer;
136
-
137
- for (int i = 0 ; i < 10 ; ++i)
138
- {
139
- reader >> frame;
140
- ASSERT_FALSE (frame.empty ());
141
-
165
+ const string outputFile = cv::tempfile (" .avi" );
166
+ for (int i = 0 ; i < nFrames-1 ; ++i) {
167
+ reader >> frameBgr;
168
+ ASSERT_FALSE (frameBgr.empty ());
142
169
if (!writer.isOpened ())
143
- writer.open (outputFile, VideoWriter::fourcc (' X' , ' V' , ' I' , ' D' ), FPS, frame.size ());
144
-
145
- startTimer (); next ();
146
- writer.write (frame);
170
+ writer.open (outputFile, VideoWriter::fourcc (' x' , ' 2' , ' 6' , ' 4' ), fps, frameBgr.size ());
171
+ startTimer ();
172
+ writer.write (frameBgr);
147
173
stopTimer ();
148
174
}
175
+ reader >> frameBgr;
176
+ ASSERT_FALSE (frameBgr.empty ());
177
+ startTimer ();
178
+ writer.write (frameBgr);
179
+ writer.release ();
180
+ stopTimer ();
149
181
}
150
-
151
- SANITY_CHECK (frame);
182
+ SANITY_CHECK (frameBgr);
152
183
}
153
184
185
+ #endif
154
186
#endif
155
187
}} // namespace
0 commit comments