xref: /aosp_15_r20/external/armnn/samples/common/include/CVUtils/CvVideoFrameReader.hpp (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 #pragma once
6*89c4ff92SAndroid Build Coastguard Worker 
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include "IFrameReader.hpp"
9*89c4ff92SAndroid Build Coastguard Worker #include <opencv2/opencv.hpp>
10*89c4ff92SAndroid Build Coastguard Worker 
11*89c4ff92SAndroid Build Coastguard Worker namespace common
12*89c4ff92SAndroid Build Coastguard Worker {
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker class CvVideoFrameReader :
15*89c4ff92SAndroid Build Coastguard Worker     public IFrameReader<cv::Mat>
16*89c4ff92SAndroid Build Coastguard Worker {
17*89c4ff92SAndroid Build Coastguard Worker public:
18*89c4ff92SAndroid Build Coastguard Worker     /**
19*89c4ff92SAndroid Build Coastguard Worker      * @brief Default constructor.
20*89c4ff92SAndroid Build Coastguard Worker      *
21*89c4ff92SAndroid Build Coastguard Worker      * Underlying open cv video capture object will be instantiated.
22*89c4ff92SAndroid Build Coastguard Worker      */
23*89c4ff92SAndroid Build Coastguard Worker     CvVideoFrameReader() = default;
24*89c4ff92SAndroid Build Coastguard Worker 
25*89c4ff92SAndroid Build Coastguard Worker     ~CvVideoFrameReader() override = default;
26*89c4ff92SAndroid Build Coastguard Worker 
27*89c4ff92SAndroid Build Coastguard Worker     /**
28*89c4ff92SAndroid Build Coastguard Worker      *@brief Initialises reader to capture frames from video file.
29*89c4ff92SAndroid Build Coastguard Worker      *
30*89c4ff92SAndroid Build Coastguard Worker      * @param source path to the video file or image sequence.
31*89c4ff92SAndroid Build Coastguard Worker      *
32*89c4ff92SAndroid Build Coastguard Worker      * @throws std::runtime_error if init failed
33*89c4ff92SAndroid Build Coastguard Worker      */
34*89c4ff92SAndroid Build Coastguard Worker     void Init(const std::string& source);
35*89c4ff92SAndroid Build Coastguard Worker 
36*89c4ff92SAndroid Build Coastguard Worker     std::shared_ptr <cv::Mat> ReadFrame() override;
37*89c4ff92SAndroid Build Coastguard Worker 
38*89c4ff92SAndroid Build Coastguard Worker     bool IsExhausted(const std::shared_ptr <cv::Mat>& frame) const override;
39*89c4ff92SAndroid Build Coastguard Worker 
40*89c4ff92SAndroid Build Coastguard Worker     /**
41*89c4ff92SAndroid Build Coastguard Worker      * Returns effective video frame width supported by the source/set by the user.
42*89c4ff92SAndroid Build Coastguard Worker      * Must be called after Init method.
43*89c4ff92SAndroid Build Coastguard Worker      * @return frame width
44*89c4ff92SAndroid Build Coastguard Worker      */
45*89c4ff92SAndroid Build Coastguard Worker     int GetSourceWidth() const;
46*89c4ff92SAndroid Build Coastguard Worker 
47*89c4ff92SAndroid Build Coastguard Worker     /**
48*89c4ff92SAndroid Build Coastguard Worker      * Returns effective video frame height supported by the source/set by the user.
49*89c4ff92SAndroid Build Coastguard Worker      * Must be called after Init method.
50*89c4ff92SAndroid Build Coastguard Worker      * @return frame height
51*89c4ff92SAndroid Build Coastguard Worker      */
52*89c4ff92SAndroid Build Coastguard Worker     int GetSourceHeight() const;
53*89c4ff92SAndroid Build Coastguard Worker 
54*89c4ff92SAndroid Build Coastguard Worker     /**
55*89c4ff92SAndroid Build Coastguard Worker      * Returns effective fps value supported by the source/set by the user.
56*89c4ff92SAndroid Build Coastguard Worker      * @return fps value
57*89c4ff92SAndroid Build Coastguard Worker      */
58*89c4ff92SAndroid Build Coastguard Worker     double GetSourceFps() const;
59*89c4ff92SAndroid Build Coastguard Worker 
60*89c4ff92SAndroid Build Coastguard Worker     /**
61*89c4ff92SAndroid Build Coastguard Worker      * Will query OpenCV to convert images to RGB
62*89c4ff92SAndroid Build Coastguard Worker      * Copy is actually default behaviour, but the set function needs to be called
63*89c4ff92SAndroid Build Coastguard Worker      * in order to know whether OpenCV supports conversion from our source format.
64*89c4ff92SAndroid Build Coastguard Worker      * @return boolean,
65*89c4ff92SAndroid Build Coastguard Worker      *     true:  OpenCV returns RGB
66*89c4ff92SAndroid Build Coastguard Worker      *     false: OpenCV returns the fourcc format from GetSourceEncoding
67*89c4ff92SAndroid Build Coastguard Worker      */
68*89c4ff92SAndroid Build Coastguard Worker     bool ConvertToRGB();
69*89c4ff92SAndroid Build Coastguard Worker 
70*89c4ff92SAndroid Build Coastguard Worker     /**
71*89c4ff92SAndroid Build Coastguard Worker      * Returns 4-character code of codec.
72*89c4ff92SAndroid Build Coastguard Worker      * @return codec name
73*89c4ff92SAndroid Build Coastguard Worker      */
74*89c4ff92SAndroid Build Coastguard Worker     std::string GetSourceEncoding() const;
75*89c4ff92SAndroid Build Coastguard Worker 
76*89c4ff92SAndroid Build Coastguard Worker    /**
77*89c4ff92SAndroid Build Coastguard Worker     * Get the fourcc int from its string name.
78*89c4ff92SAndroid Build Coastguard Worker     * @return codec int
79*89c4ff92SAndroid Build Coastguard Worker     */
80*89c4ff92SAndroid Build Coastguard Worker     int GetSourceEncodingInt() const;
81*89c4ff92SAndroid Build Coastguard Worker 
82*89c4ff92SAndroid Build Coastguard Worker     int GetFrameCount() const;
83*89c4ff92SAndroid Build Coastguard Worker 
84*89c4ff92SAndroid Build Coastguard Worker private:
85*89c4ff92SAndroid Build Coastguard Worker     cv::VideoCapture m_capture;
86*89c4ff92SAndroid Build Coastguard Worker 
87*89c4ff92SAndroid Build Coastguard Worker     void CheckIsOpen(const std::string& source);
88*89c4ff92SAndroid Build Coastguard Worker };
89*89c4ff92SAndroid Build Coastguard Worker 
90*89c4ff92SAndroid Build Coastguard Worker class CvVideoFrameReaderRgbWrapper :
91*89c4ff92SAndroid Build Coastguard Worker         public IFrameReader<cv::Mat>
92*89c4ff92SAndroid Build Coastguard Worker {
93*89c4ff92SAndroid Build Coastguard Worker public:
94*89c4ff92SAndroid Build Coastguard Worker     CvVideoFrameReaderRgbWrapper() = delete;
95*89c4ff92SAndroid Build Coastguard Worker     CvVideoFrameReaderRgbWrapper(const CvVideoFrameReaderRgbWrapper& o) = delete;
96*89c4ff92SAndroid Build Coastguard Worker     CvVideoFrameReaderRgbWrapper(CvVideoFrameReaderRgbWrapper&& o) = delete;
97*89c4ff92SAndroid Build Coastguard Worker 
98*89c4ff92SAndroid Build Coastguard Worker     CvVideoFrameReaderRgbWrapper(std::unique_ptr<common::CvVideoFrameReader> reader);
99*89c4ff92SAndroid Build Coastguard Worker 
100*89c4ff92SAndroid Build Coastguard Worker     std::shared_ptr<cv::Mat> ReadFrame() override;
101*89c4ff92SAndroid Build Coastguard Worker 
102*89c4ff92SAndroid Build Coastguard Worker     bool IsExhausted(const std::shared_ptr<cv::Mat>& frame) const override;
103*89c4ff92SAndroid Build Coastguard Worker 
104*89c4ff92SAndroid Build Coastguard Worker private:
105*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<common::CvVideoFrameReader> m_reader;
106*89c4ff92SAndroid Build Coastguard Worker };
107*89c4ff92SAndroid Build Coastguard Worker 
108*89c4ff92SAndroid Build Coastguard Worker }// namespace common