Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d6c74a1

Browse files
committed
cudacodec::VideoReader - amend FFmpeg codec resolution
1 parent 7a4c0df commit d6c74a1

File tree

2 files changed

+54
-18
lines changed

2 files changed

+54
-18
lines changed

modules/cudacodec/src/ffmpeg_video_source.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ static std::string fourccToString(int fourcc)
6666
(i32_c.c[3] >= ' ' && i32_c.c[3] < 128) ? i32_c.c[3] : '?');
6767
}
6868

69+
// handle old FFmpeg backend - remove when windows shared library is updated
70+
#ifdef _WIN32
6971
static
70-
Codec FourccToCodec(int codec)
72+
Codec FourccToCodecWin32Old(int codec)
7173
{
7274
switch (codec)
7375
{
@@ -100,9 +102,34 @@ Codec FourccToCodec(int codec)
100102
case CV_FOURCC_MACRO('a', 'v', '0', '1'): // fallthru
101103
case CV_FOURCC_MACRO('A', 'V', '0', '1'): return AV1;
102104
default:
103-
break;
105+
return NumCodecs;
104106
}
107+
}
108+
#endif
105109

110+
static
111+
Codec FourccToCodec(int codec)
112+
{
113+
#ifdef _WIN32 // handle old FFmpeg backend - remove when windows shared library is updated
114+
Codec win32OldCodec = FourccToCodecWin32Old(codec);
115+
if(win32OldCodec != NumCodecs)
116+
return win32OldCodec;
117+
#endif
118+
switch (codec)
119+
{
120+
case CV_FOURCC_MACRO('m', 'p', 'g', '1'): return MPEG1;
121+
case CV_FOURCC_MACRO('m', 'p', 'g', '2'): return MPEG2;
122+
case CV_FOURCC_MACRO('F', 'M', 'P', '4'): return MPEG4;
123+
case CV_FOURCC_MACRO('W', 'V', 'C', '1'): return VC1;
124+
case CV_FOURCC_MACRO('h', '2', '6', '4'): return H264;
125+
case CV_FOURCC_MACRO('h', 'e', 'v', 'c'): return HEVC;
126+
case CV_FOURCC_MACRO('M', 'J', 'P', 'G'): return JPEG;
127+
case CV_FOURCC_MACRO('V', 'P', '8', '0'): return VP8;
128+
case CV_FOURCC_MACRO('V', 'P', '9', '0'): return VP9;
129+
case CV_FOURCC_MACRO('A', 'V', '0', '1'): return AV1;
130+
default:
131+
break;
132+
}
106133
std::string msg = cv::format("Unknown codec FOURCC: 0x%08X (%s)", codec, fourccToString(codec).c_str());
107134
CV_LOG_WARNING(NULL, msg);
108135
CV_Error(Error::StsUnsupportedFormat, msg);
@@ -163,7 +190,6 @@ cv::cudacodec::detail::FFmpegVideoSource::FFmpegVideoSource(const String& fname,
163190

164191
int codec = (int)cap.get(CAP_PROP_FOURCC);
165192
int pixelFormat = (int)cap.get(CAP_PROP_CODEC_PIXEL_FORMAT);
166-
167193
format_.codec = FourccToCodec(codec);
168194
format_.height = cap.get(CAP_PROP_FRAME_HEIGHT);
169195
format_.width = cap.get(CAP_PROP_FRAME_WIDTH);

modules/cudacodec/test/test_video.cpp

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -280,15 +280,11 @@ CUDA_TEST_P(DisplayResolution, Reader)
280280
CUDA_TEST_P(Video, Reader)
281281
{
282282
cv::cuda::setDevice(GET_PARAM(0).deviceID());
283+
const std::string relativeFilePath = GET_PARAM(1);
283284

284285
// CUDA demuxer has to fall back to ffmpeg to process "cv/video/768x576.avi"
285-
if (GET_PARAM(1) == "cv/video/768x576.avi" && !videoio_registry::hasBackend(CAP_FFMPEG))
286-
throw SkipTestException("FFmpeg backend not found");
287-
288-
#ifdef _WIN32 // handle old FFmpeg backend
289-
if (GET_PARAM(1) == "/cv/tracking/faceocc2/data/faceocc2.webm")
290-
throw SkipTestException("Feature not yet supported by Windows FFmpeg shared library!");
291-
#endif
286+
if (relativeFilePath == "cv/video/768x576.avi" && !videoio_registry::hasBackend(CAP_FFMPEG))
287+
throw SkipTestException("FFmpeg backend not found - SKIP");
292288

293289
const std::vector<std::pair< cudacodec::ColorFormat, int>> formatsToChannels = {
294290
{cudacodec::ColorFormat::GRAY,1},
@@ -297,8 +293,15 @@ CUDA_TEST_P(Video, Reader)
297293
{cudacodec::ColorFormat::NV_NV12,1}
298294
};
299295

300-
std::string inputFile = std::string(cvtest::TS::ptr()->get_data_path()) + "../" + GET_PARAM(1);
301-
cv::Ptr<cv::cudacodec::VideoReader> reader = cv::cudacodec::createVideoReader(inputFile);
296+
std::string inputFile = std::string(cvtest::TS::ptr()->get_data_path()) + "../" + relativeFilePath;
297+
cv::Ptr<cv::cudacodec::VideoReader> reader;
298+
try {
299+
reader = cv::cudacodec::createVideoReader(inputFile);
300+
}
301+
catch (const Exception& e) {
302+
ASSERT_TRUE(relativeFilePath == "highgui/video/sample_322x242_15frames.yuv420p.libaom-av1.mp4");
303+
throw SkipTestException("AV1 decoding not supported in this version of FFmpeg - SKIP");
304+
}
302305
ASSERT_FALSE(reader->set(cudacodec::ColorFormat::RGB));
303306
cv::cudacodec::FormatInfo fmt = reader->format();
304307
cv::cuda::GpuMat frame;
@@ -837,13 +840,18 @@ INSTANTIATE_TEST_CASE_P(CUDA_Codec, Scaling, testing::Combine(
837840

838841
INSTANTIATE_TEST_CASE_P(CUDA_Codec, DisplayResolution, ALL_DEVICES);
839842

840-
#define VIDEO_SRC_R "highgui/video/big_buck_bunny.mp4", "cv/video/768x576.avi", "cv/video/1920x1080.avi", "highgui/video/big_buck_bunny.avi", \
843+
#ifdef _WIN32 // handle old FFmpeg backend - remove when windows shared library is updated
844+
#define VIDEO_SRC_R testing::Values("highgui/video/big_buck_bunny.mp4", "cv/video/768x576.avi", "cv/video/1920x1080.avi", "highgui/video/big_buck_bunny.avi", \
841845
"highgui/video/big_buck_bunny.h264", "highgui/video/big_buck_bunny.h265", "highgui/video/big_buck_bunny.mpg", \
842846
"highgui/video/sample_322x242_15frames.yuv420p.libvpx-vp9.mp4", "highgui/video/sample_322x242_15frames.yuv420p.libaom-av1.mp4", \
843-
"cv/tracking/faceocc2/data/faceocc2.webm"
844-
INSTANTIATE_TEST_CASE_P(CUDA_Codec, Video, testing::Combine(
845-
ALL_DEVICES,
846-
testing::Values(VIDEO_SRC_R)));
847+
"cv/tracking/faceocc2/data/faceocc2.webm")
848+
#else
849+
#define VIDEO_SRC_R testing::Values("highgui/video/big_buck_bunny.mp4", "cv/video/768x576.avi", "cv/video/1920x1080.avi", "highgui/video/big_buck_bunny.avi", \
850+
"highgui/video/big_buck_bunny.h264", "highgui/video/big_buck_bunny.h265", "highgui/video/big_buck_bunny.mpg", \
851+
"highgui/video/sample_322x242_15frames.yuv420p.libvpx-vp9.mp4", "highgui/video/sample_322x242_15frames.yuv420p.libaom-av1.mp4", \
852+
"cv/tracking/faceocc2/data/faceocc2.webm", "highgui/video/sample_322x242_15frames.yuv420p.mpeg2video.mp4", "highgui/video/sample_322x242_15frames.yuv420p.mjpeg.mp4")
853+
#endif
854+
INSTANTIATE_TEST_CASE_P(CUDA_Codec, Video, testing::Combine(ALL_DEVICES,VIDEO_SRC_R));
847855

848856
const color_conversion_params_t color_conversion_params[] =
849857
{
@@ -878,9 +886,11 @@ INSTANTIATE_TEST_CASE_P(CUDA_Codec, CheckExtraData, testing::Combine(
878886
ALL_DEVICES,
879887
testing::ValuesIn(check_extra_data_params)));
880888

889+
#define VIDEO_SRC_KEY "highgui/video/big_buck_bunny.mp4", "cv/video/768x576.avi", "cv/video/1920x1080.avi", "highgui/video/big_buck_bunny.avi", \
890+
"highgui/video/big_buck_bunny.h264", "highgui/video/big_buck_bunny.h265", "highgui/video/big_buck_bunny.mpg"
881891
INSTANTIATE_TEST_CASE_P(CUDA_Codec, CheckKeyFrame, testing::Combine(
882892
ALL_DEVICES,
883-
testing::Values(VIDEO_SRC_R)));
893+
testing::Values(VIDEO_SRC_KEY)));
884894

885895
INSTANTIATE_TEST_CASE_P(CUDA_Codec, CheckParams, ALL_DEVICES);
886896

0 commit comments

Comments
 (0)