Skip to content

Commit 82e2792

Browse files
committed
cudacodec: ensure output frame resolution is display not coded size
1 parent ed1873b commit 82e2792

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

modules/cudacodec/src/video_parser.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,16 @@ int CUDAAPI cv::cudacodec::detail::VideoParser::HandleVideoSequence(void* userDa
122122
newFormat.ulHeight = format->coded_height;
123123
newFormat.fps = format->frame_rate.numerator / static_cast<float>(format->frame_rate.denominator);
124124
newFormat.targetSz = thiz->videoDecoder_->getTargetSz();
125-
newFormat.width = newFormat.targetSz.width ? newFormat.targetSz.width : format->coded_width;
126-
newFormat.height = newFormat.targetSz.height ? newFormat.targetSz.height : format->coded_height;
127125
newFormat.srcRoi = thiz->videoDecoder_->getSrcRoi();
128126
if (newFormat.srcRoi.empty()) {
129-
format->display_area.right = format->coded_width;
130-
format->display_area.bottom = format->coded_height;
131127
newFormat.displayArea = Rect(Point(format->display_area.left, format->display_area.top), Point(format->display_area.right, format->display_area.bottom));
128+
if (newFormat.targetSz.empty())
129+
newFormat.targetSz = Size((format->display_area.right - format->display_area.left), (format->display_area.bottom - format->display_area.top));
132130
}
133131
else
134132
newFormat.displayArea = newFormat.srcRoi;
133+
newFormat.width = newFormat.targetSz.width ? newFormat.targetSz.width : format->coded_width;
134+
newFormat.height = newFormat.targetSz.height ? newFormat.targetSz.height : format->coded_height;
135135
newFormat.targetRoi = thiz->videoDecoder_->getTargetRoi();
136136
newFormat.ulNumDecodeSurfaces = min(!thiz->allowFrameDrop_ ? max(thiz->videoDecoder_->nDecodeSurfaces(), static_cast<int>(format->min_num_decode_surfaces)) :
137137
format->min_num_decode_surfaces * 2, 32);

modules/cudacodec/test/test_video.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ PARAM_TEST_CASE(Scaling, cv::cuda::DeviceInfo, std::string, Size2f, Rect2f, Rect
5858
{
5959
};
6060

61+
struct DisplayResolution : testing::TestWithParam<cv::cuda::DeviceInfo>
62+
{
63+
};
64+
6165
PARAM_TEST_CASE(Video, cv::cuda::DeviceInfo, std::string)
6266
{
6367
};
@@ -223,6 +227,37 @@ CUDA_TEST_P(Scaling, Reader)
223227
ASSERT_LT(mae, 2.35);
224228
}
225229

230+
CUDA_TEST_P(DisplayResolution, Reader)
231+
{
232+
cv::cuda::setDevice(GetParam().deviceID());
233+
std::string inputFile = std::string(cvtest::TS::ptr()->get_data_path()) + "../cv/video/1920x1080.avi";
234+
const Rect displayArea(0, 0, 1920, 1080);
235+
GpuMat frame;
236+
237+
{
238+
// verify the output frame is the diplay size (1920x1080) and not the coded size (1920x1088)
239+
cv::Ptr<cv::cudacodec::VideoReader> reader = cv::cudacodec::createVideoReader(inputFile);
240+
reader->set(cudacodec::ColorFormat::GRAY);
241+
ASSERT_TRUE(reader->nextFrame(frame));
242+
const cudacodec::FormatInfo format = reader->format();
243+
ASSERT_TRUE(format.displayArea == displayArea);
244+
ASSERT_TRUE(frame.size() == displayArea.size() && frame.size() == format.targetSz);
245+
}
246+
247+
{
248+
// extra check to verify display frame has not been post-processed and is just a cropped version of the coded sized frame
249+
cudacodec::VideoReaderInitParams params;
250+
params.srcRoi = Rect(0, 0, 1920, 1088);
251+
cv::Ptr<cv::cudacodec::VideoReader> readerCodedSz = cv::cudacodec::createVideoReader(inputFile, {}, params);
252+
readerCodedSz->set(cudacodec::ColorFormat::GRAY);
253+
GpuMat frameCodedSz;
254+
ASSERT_TRUE(readerCodedSz->nextFrame(frameCodedSz));
255+
const cudacodec::FormatInfo formatCodedSz = readerCodedSz->format();
256+
const double err = cv::cuda::norm(frame, frameCodedSz(displayArea), NORM_INF);
257+
ASSERT_TRUE(err == 0);
258+
}
259+
}
260+
226261
CUDA_TEST_P(Video, Reader)
227262
{
228263
cv::cuda::setDevice(GET_PARAM(0).deviceID());
@@ -664,6 +699,8 @@ INSTANTIATE_TEST_CASE_P(CUDA_Codec, CheckSet, testing::Combine(
664699
INSTANTIATE_TEST_CASE_P(CUDA_Codec, Scaling, testing::Combine(
665700
ALL_DEVICES, testing::Values(VIDEO_SRC_SCALING), testing::Values(TARGET_SZ), testing::Values(SRC_ROI), testing::Values(TARGET_ROI)));
666701

702+
INSTANTIATE_TEST_CASE_P(CUDA_Codec, DisplayResolution, ALL_DEVICES);
703+
667704
#define VIDEO_SRC_R "highgui/video/big_buck_bunny.mp4", "cv/video/768x576.avi", "cv/video/1920x1080.avi", "highgui/video/big_buck_bunny.avi", \
668705
"highgui/video/big_buck_bunny.h264", "highgui/video/big_buck_bunny.h265", "highgui/video/big_buck_bunny.mpg", \
669706
"highgui/video/sample_322x242_15frames.yuv420p.libvpx-vp9.mp4", "highgui/video/sample_322x242_15frames.yuv420p.libaom-av1.mp4", \

0 commit comments

Comments
 (0)