1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #define CATCH_CONFIG_MAIN 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include <catch.hpp> 9*89c4ff92SAndroid Build Coastguard Worker #include <opencv2/opencv.hpp> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include "IFrameReader.hpp" 12*89c4ff92SAndroid Build Coastguard Worker #include "CvVideoFrameReader.hpp" 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker SCENARIO("Read frames from video file using CV frame reader", "[framereader]") { 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker GIVEN("a valid video file") { 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard Worker std::string testResources = TEST_RESOURCE_DIR; 19*89c4ff92SAndroid Build Coastguard Worker REQUIRE(testResources != ""); 20*89c4ff92SAndroid Build Coastguard Worker std::string file = testResources + "/" + "Megamind.avi"; 21*89c4ff92SAndroid Build Coastguard Worker WHEN("Frame reader is initialised") { 22*89c4ff92SAndroid Build Coastguard Worker 23*89c4ff92SAndroid Build Coastguard Worker common::CvVideoFrameReader reader; 24*89c4ff92SAndroid Build Coastguard Worker THEN("no exception is thrown") { 25*89c4ff92SAndroid Build Coastguard Worker reader.Init(file); 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker AND_WHEN("when source parameters are read") { 28*89c4ff92SAndroid Build Coastguard Worker 29*89c4ff92SAndroid Build Coastguard Worker auto fps = reader.GetSourceFps(); 30*89c4ff92SAndroid Build Coastguard Worker auto height = reader.GetSourceHeight(); 31*89c4ff92SAndroid Build Coastguard Worker auto width = reader.GetSourceWidth(); 32*89c4ff92SAndroid Build Coastguard Worker auto encoding = reader.GetSourceEncoding(); 33*89c4ff92SAndroid Build Coastguard Worker auto framesCount = reader.GetFrameCount(); 34*89c4ff92SAndroid Build Coastguard Worker 35*89c4ff92SAndroid Build Coastguard Worker THEN("they are aligned with video file") { 36*89c4ff92SAndroid Build Coastguard Worker 37*89c4ff92SAndroid Build Coastguard Worker REQUIRE(height == 528); 38*89c4ff92SAndroid Build Coastguard Worker REQUIRE(width == 720); 39*89c4ff92SAndroid Build Coastguard Worker REQUIRE(encoding == "XVID"); 40*89c4ff92SAndroid Build Coastguard Worker REQUIRE(fps == 23.976); 41*89c4ff92SAndroid Build Coastguard Worker REQUIRE(framesCount == 270); 42*89c4ff92SAndroid Build Coastguard Worker } 43*89c4ff92SAndroid Build Coastguard Worker 44*89c4ff92SAndroid Build Coastguard Worker } 45*89c4ff92SAndroid Build Coastguard Worker 46*89c4ff92SAndroid Build Coastguard Worker AND_WHEN("frame is read") { 47*89c4ff92SAndroid Build Coastguard Worker auto framePtr = reader.ReadFrame(); 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker THEN("it is not a NULL pointer") { 50*89c4ff92SAndroid Build Coastguard Worker REQUIRE(framePtr != nullptr); 51*89c4ff92SAndroid Build Coastguard Worker } 52*89c4ff92SAndroid Build Coastguard Worker 53*89c4ff92SAndroid Build Coastguard Worker AND_THEN("it is not empty") { 54*89c4ff92SAndroid Build Coastguard Worker REQUIRE(!framePtr->empty()); 55*89c4ff92SAndroid Build Coastguard Worker REQUIRE(!reader.IsExhausted(framePtr)); 56*89c4ff92SAndroid Build Coastguard Worker } 57*89c4ff92SAndroid Build Coastguard Worker } 58*89c4ff92SAndroid Build Coastguard Worker 59*89c4ff92SAndroid Build Coastguard Worker AND_WHEN("all frames were read from the file") { 60*89c4ff92SAndroid Build Coastguard Worker 61*89c4ff92SAndroid Build Coastguard Worker for (int i = 0; i < 270; i++) { 62*89c4ff92SAndroid Build Coastguard Worker auto framePtr = reader.ReadFrame(); 63*89c4ff92SAndroid Build Coastguard Worker } 64*89c4ff92SAndroid Build Coastguard Worker 65*89c4ff92SAndroid Build Coastguard Worker THEN("last + 1 frame is empty") { 66*89c4ff92SAndroid Build Coastguard Worker auto framePtr = reader.ReadFrame(); 67*89c4ff92SAndroid Build Coastguard Worker 68*89c4ff92SAndroid Build Coastguard Worker REQUIRE(framePtr->empty()); 69*89c4ff92SAndroid Build Coastguard Worker REQUIRE(reader.IsExhausted(framePtr)); 70*89c4ff92SAndroid Build Coastguard Worker } 71*89c4ff92SAndroid Build Coastguard Worker 72*89c4ff92SAndroid Build Coastguard Worker } 73*89c4ff92SAndroid Build Coastguard Worker 74*89c4ff92SAndroid Build Coastguard Worker AND_WHEN("frames are read from the file, pointers point to the different objects") { 75*89c4ff92SAndroid Build Coastguard Worker 76*89c4ff92SAndroid Build Coastguard Worker auto framePtr = reader.ReadFrame(); 77*89c4ff92SAndroid Build Coastguard Worker 78*89c4ff92SAndroid Build Coastguard Worker cv::Mat *frame = framePtr.get(); 79*89c4ff92SAndroid Build Coastguard Worker 80*89c4ff92SAndroid Build Coastguard Worker for (int i = 0; i < 30; i++) { 81*89c4ff92SAndroid Build Coastguard Worker REQUIRE(frame != reader.ReadFrame().get()); 82*89c4ff92SAndroid Build Coastguard Worker } 83*89c4ff92SAndroid Build Coastguard Worker 84*89c4ff92SAndroid Build Coastguard Worker } 85*89c4ff92SAndroid Build Coastguard Worker } 86*89c4ff92SAndroid Build Coastguard Worker } 87*89c4ff92SAndroid Build Coastguard Worker } 88*89c4ff92SAndroid Build Coastguard Worker 89*89c4ff92SAndroid Build Coastguard Worker GIVEN("an invalid video file") { 90*89c4ff92SAndroid Build Coastguard Worker 91*89c4ff92SAndroid Build Coastguard Worker std::string file = "nosuchfile.avi"; 92*89c4ff92SAndroid Build Coastguard Worker 93*89c4ff92SAndroid Build Coastguard Worker WHEN("Frame reader is initialised") { 94*89c4ff92SAndroid Build Coastguard Worker 95*89c4ff92SAndroid Build Coastguard Worker common::CvVideoFrameReader reader; 96*89c4ff92SAndroid Build Coastguard Worker 97*89c4ff92SAndroid Build Coastguard Worker THEN("exception is thrown") { 98*89c4ff92SAndroid Build Coastguard Worker REQUIRE_THROWS(reader.Init(file)); 99*89c4ff92SAndroid Build Coastguard Worker } 100*89c4ff92SAndroid Build Coastguard Worker } 101*89c4ff92SAndroid Build Coastguard Worker 102*89c4ff92SAndroid Build Coastguard Worker } 103*89c4ff92SAndroid Build Coastguard Worker }