// // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #define CATCH_CONFIG_MAIN #include #include #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)); } } } }