| // |
| // 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)); |
| } |
| } |
| |
| } |
| } |