opencv/modules/videoio/test/test_dynamic.cpp
Alexander Alekhin fc628014bb Merge branch 4.x
2021-04-10 18:03:01 +00:00

136 lines
4.3 KiB
C++

// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
#include "test_precomp.hpp"
using namespace std;
namespace opencv_test { namespace {
const int FRAME_COUNT = 120;
inline void generateFrame(int i, Mat & frame)
{
::generateFrame(i, FRAME_COUNT, frame);
}
TEST(videoio_dynamic, basic_write)
{
const Size FRAME_SIZE(640, 480);
const double FPS = 100;
const String filename = cv::tempfile(".avi");
const int fourcc = VideoWriter::fourcc('M', 'J', 'P', 'G');
bool fileExists = false;
{
vector<VideoCaptureAPIs> backends = videoio_registry::getWriterBackends();
for (VideoCaptureAPIs be : backends)
{
VideoWriter writer;
writer.open(filename, be, fourcc, FPS, FRAME_SIZE, true);
if (writer.isOpened())
{
Mat frame(FRAME_SIZE, CV_8UC3);
for (int j = 0; j < FRAME_COUNT; ++j)
{
generateFrame(j, frame);
writer << frame;
}
writer.release();
fileExists = true;
}
EXPECT_FALSE(writer.isOpened());
}
}
if (!fileExists)
{
cout << "None of backends has been able to write video file - SKIP reading part" << endl;
return;
}
{
vector<VideoCaptureAPIs> backends = videoio_registry::getStreamBackends();
for (VideoCaptureAPIs be : backends)
{
std::string backend_name = cv::videoio_registry::getBackendName(be);
VideoCapture cap;
cap.open(filename, be);
if(cap.isOpened())
{
int count = 0;
while (true)
{
Mat frame;
if (cap.grab())
{
if (cap.retrieve(frame))
{
++count;
continue;
}
}
break;
}
if (be == CAP_AVFOUNDATION)
{
if (FRAME_COUNT != count) // OpenCV 5.0: 5 vs 120
throw SkipTestException(backend_name + ": invalid number of frames");
}
EXPECT_EQ(FRAME_COUNT, count) << backend_name;
cap.release();
}
EXPECT_FALSE(cap.isOpened());
}
}
remove(filename.c_str());
}
TEST(videoio_dynamic, write_invalid)
{
vector<VideoCaptureAPIs> backends = videoio_registry::getWriterBackends();
for (VideoCaptureAPIs be : backends)
{
SCOPED_TRACE(be);
const string filename = cv::tempfile(".mkv");
VideoWriter writer;
bool res = true;
// Bad FourCC
EXPECT_NO_THROW(res = writer.open(filename, be, VideoWriter::fourcc('A', 'B', 'C', 'D'), 1, Size(640, 480), true));
EXPECT_FALSE(res);
EXPECT_FALSE(writer.isOpened());
// Empty filename
EXPECT_NO_THROW(res = writer.open(String(), be, VideoWriter::fourcc('H', '2', '6', '4'), 1, Size(640, 480), true));
EXPECT_FALSE(res);
EXPECT_FALSE(writer.isOpened());
EXPECT_NO_THROW(res = writer.open(String(), be, VideoWriter::fourcc('M', 'J', 'P', 'G'), 1, Size(640, 480), true));
EXPECT_FALSE(res);
EXPECT_FALSE(writer.isOpened());
// zero FPS
EXPECT_NO_THROW(res = writer.open(filename, be, VideoWriter::fourcc('H', '2', '6', '4'), 0, Size(640, 480), true));
EXPECT_FALSE(res);
EXPECT_FALSE(writer.isOpened());
// cleanup
EXPECT_NO_THROW(writer.release());
remove(filename.c_str());
}
// Generic
{
VideoWriter writer;
bool res = true;
EXPECT_NO_THROW(res = writer.open(std::string(), VideoWriter::fourcc('H', '2', '6', '4'), 1, Size(640, 480)));
EXPECT_FALSE(res);
EXPECT_FALSE(writer.isOpened());
EXPECT_NO_THROW(res = writer.open(std::string(), VideoWriter::fourcc('M', 'J', 'P', 'G'), 1, Size(640, 480)));
EXPECT_FALSE(res);
EXPECT_FALSE(writer.isOpened());
}
}
}} // opencv_test::<anonymous>::