blob: a02fa7fd4e04b3a0836547e9ce3c01ba5ff1c244 [file] [log] [blame]
//
// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#define CATCH_CONFIG_MAIN
#include <catch.hpp>
#include <opencv2/opencv.hpp>
#include "IFrameReader.hpp"
#include "CvVideoFrameReader.hpp"
SCENARIO("Read frames from video file using CV frame reader", "[framereader]") {
GIVEN("a valid video file") {
std::string testResources = TEST_RESOURCE_DIR;
REQUIRE(testResources != "");
std::string file = testResources + "/" + "Megamind.avi";
WHEN("Frame reader is initialised") {
common::CvVideoFrameReader reader;
THEN("no exception is thrown") {
reader.Init(file);
AND_WHEN("when source parameters are read") {
auto fps = reader.GetSourceFps();
auto height = reader.GetSourceHeight();
auto width = reader.GetSourceWidth();
auto encoding = reader.GetSourceEncoding();
auto framesCount = reader.GetFrameCount();
THEN("they are aligned with video file") {
REQUIRE(height == 528);
REQUIRE(width == 720);
REQUIRE(encoding == "XVID");
REQUIRE(fps == 23.976);
REQUIRE(framesCount == 270);
}
}
AND_WHEN("frame is read") {
auto framePtr = reader.ReadFrame();
THEN("it is not a NULL pointer") {
REQUIRE(framePtr != nullptr);
}
AND_THEN("it is not empty") {
REQUIRE(!framePtr->empty());
REQUIRE(!reader.IsExhausted(framePtr));
}
}
AND_WHEN("all frames were read from the file") {
for (int i = 0; i < 270; i++) {
auto framePtr = reader.ReadFrame();
}
THEN("last + 1 frame is empty") {
auto framePtr = reader.ReadFrame();
REQUIRE(framePtr->empty());
REQUIRE(reader.IsExhausted(framePtr));
}
}
AND_WHEN("frames are read from the file, pointers point to the different objects") {
auto framePtr = reader.ReadFrame();
cv::Mat *frame = framePtr.get();
for (int i = 0; i < 30; i++) {
REQUIRE(frame != reader.ReadFrame().get());
}
}
}
}
}
GIVEN("an invalid video file") {
std::string file = "nosuchfile.avi";
WHEN("Frame reader is initialised") {
common::CvVideoFrameReader reader;
THEN("exception is thrown") {
REQUIRE_THROWS(reader.Init(file));
}
}
}
}