xref: /aosp_15_r20/external/armnn/samples/ObjectDetection/test/FrameReaderTest.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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 }