mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 15:53:03 +04:00
Merge pull request #21337 from mansourmoufid:videocapture-get-property-return
Make cv::VideoCapture::get return cv::CAP_PROP_UNKNOWN (-1) for unsupported properties #21337 The return value indicating an unsupported property is not consistent across backends. I stumbled on this issue because my code was determining if a property value is valid if it's non-zero (like the documentation says), which worked fine on macOS, but not on Android. For example, auto-exposure is not supported on macOS, so get() returns 0. But it is supported on Android and 0 means auto-exposure is off. I think -1 is the better return value to indicate unsupported properties. I made changes to all the backends. I think I got every case. This breaks API compatibility for some backends, so I based this on branch 3.4. - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or other license that is incompatible with OpenCV - [x] The PR is proposed to proper branch - [ ] There is reference to original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake
This commit is contained in:
@@ -64,6 +64,14 @@ public:
|
||||
std::cout << "SKIP test: backend " << apiPref << " can't open the video: " << video_file << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Requires FFmpeg wrapper rebuild for Windows
|
||||
#ifdef _WIN32
|
||||
if (apiPref != CAP_FFMPEG)
|
||||
EXPECT_EQ(CAP_PROP_UNKNOWN, cap.get(CV__CAP_PROP_LATEST));
|
||||
#else
|
||||
EXPECT_EQ(CAP_PROP_UNKNOWN, cap.get(CV__CAP_PROP_LATEST));
|
||||
#endif
|
||||
int n_frames = -1;
|
||||
EXPECT_NO_THROW(n_frames = (int)cap.get(CAP_PROP_FRAME_COUNT));
|
||||
if (n_frames > 0)
|
||||
@@ -528,6 +536,15 @@ TEST_P(Videoio_Writer, write_nothing)
|
||||
VideoWriter writer;
|
||||
EXPECT_NO_THROW(writer.open(video_file, apiPref, fourcc, fps, frame_size, true));
|
||||
ASSERT_TRUE(writer.isOpened());
|
||||
|
||||
// TODO: Requires FFmpeg wrapper rebuild for Windows
|
||||
#ifdef _WIN32
|
||||
if (apiPref != CAP_FFMPEG)
|
||||
EXPECT_EQ(CAP_PROP_UNKNOWN, writer.get(CV__CAP_PROP_LATEST));
|
||||
#else
|
||||
EXPECT_EQ(cv::VIDEOWRITER_PROP_UNKNOWN, writer.get(CV__CAP_PROP_LATEST));
|
||||
#endif
|
||||
|
||||
#if 0 // no frames
|
||||
cv::Mat m(frame_size, CV_8UC3, Scalar::all(127));
|
||||
writer << m;
|
||||
|
||||
Reference in New Issue
Block a user