blob: 96d94f40799b675ed8c4b9ba67cb2f87fa6e9137 [file] [log] [blame]
Éanna Ó Catháin919c14e2020-09-14 17:36:49 +01001//
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
Éanna Ó Catháinc6ab02a2021-04-07 14:35:25 +010011namespace common
Éanna Ó Catháin919c14e2020-09-14 17:36:49 +010012{
13
14class CvVideoFrameReader :
15 public IFrameReader<cv::Mat>
16{
17public:
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
84private:
85 cv::VideoCapture m_capture;
86
87 void CheckIsOpen(const std::string& source);
88};
89
90class CvVideoFrameReaderRgbWrapper :
91 public IFrameReader<cv::Mat>
92{
93public:
94 CvVideoFrameReaderRgbWrapper() = delete;
95 CvVideoFrameReaderRgbWrapper(const CvVideoFrameReaderRgbWrapper& o) = delete;
96 CvVideoFrameReaderRgbWrapper(CvVideoFrameReaderRgbWrapper&& o) = delete;
97
Éanna Ó Catháinc6ab02a2021-04-07 14:35:25 +010098 CvVideoFrameReaderRgbWrapper(std::unique_ptr<common::CvVideoFrameReader> reader);
Éanna Ó Catháin919c14e2020-09-14 17:36:49 +010099
100 std::shared_ptr<cv::Mat> ReadFrame() override;
101
102 bool IsExhausted(const std::shared_ptr<cv::Mat>& frame) const override;
103
104private:
Éanna Ó Catháinc6ab02a2021-04-07 14:35:25 +0100105 std::unique_ptr<common::CvVideoFrameReader> m_reader;
Éanna Ó Catháin919c14e2020-09-14 17:36:49 +0100106};
107
Éanna Ó Catháinc6ab02a2021-04-07 14:35:25 +0100108}// namespace common