// // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include "IFrameReader.hpp" #include namespace od { class CvVideoFrameReader : public IFrameReader { public: /** * @brief Default constructor. * * Underlying open cv video capture object will be instantiated. */ CvVideoFrameReader() = default; ~CvVideoFrameReader() override = default; /** *@brief Initialises reader to capture frames from video file. * * @param source path to the video file or image sequence. * * @throws std::runtime_error if init failed */ void Init(const std::string& source); std::shared_ptr ReadFrame() override; bool IsExhausted(const std::shared_ptr & frame) const override; /** * Returns effective video frame width supported by the source/set by the user. * Must be called after Init method. * @return frame width */ int GetSourceWidth() const; /** * Returns effective video frame height supported by the source/set by the user. * Must be called after Init method. * @return frame height */ int GetSourceHeight() const; /** * Returns effective fps value supported by the source/set by the user. * @return fps value */ double GetSourceFps() const; /** * Will query OpenCV to convert images to RGB * Copy is actually default behaviour, but the set function needs to be called * in order to know whether OpenCV supports conversion from our source format. * @return boolean, * true: OpenCV returns RGB * false: OpenCV returns the fourcc format from GetSourceEncoding */ bool ConvertToRGB(); /** * Returns 4-character code of codec. * @return codec name */ std::string GetSourceEncoding() const; /** * Get the fourcc int from its string name. * @return codec int */ int GetSourceEncodingInt() const; int GetFrameCount() const; private: cv::VideoCapture m_capture; void CheckIsOpen(const std::string& source); }; class CvVideoFrameReaderRgbWrapper : public IFrameReader { public: CvVideoFrameReaderRgbWrapper() = delete; CvVideoFrameReaderRgbWrapper(const CvVideoFrameReaderRgbWrapper& o) = delete; CvVideoFrameReaderRgbWrapper(CvVideoFrameReaderRgbWrapper&& o) = delete; CvVideoFrameReaderRgbWrapper(std::unique_ptr reader); std::shared_ptr ReadFrame() override; bool IsExhausted(const std::shared_ptr& frame) const override; private: std::unique_ptr m_reader; }; }// namespace od