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