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