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 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker #include "CvVideoFrameReader.hpp" 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker namespace common 10*89c4ff92SAndroid Build Coastguard Worker { 11*89c4ff92SAndroid Build Coastguard Worker ReadFrame()12*89c4ff92SAndroid Build Coastguard Workerstd::shared_ptr<cv::Mat> CvVideoFrameReader::ReadFrame() 13*89c4ff92SAndroid Build Coastguard Worker { 14*89c4ff92SAndroid Build Coastguard Worker // opencv copies data anyway 15*89c4ff92SAndroid Build Coastguard Worker cv::Mat captureFrame; 16*89c4ff92SAndroid Build Coastguard Worker m_capture.read(captureFrame); 17*89c4ff92SAndroid Build Coastguard Worker return std::make_shared<cv::Mat>(std::move(captureFrame)); 18*89c4ff92SAndroid Build Coastguard Worker } 19*89c4ff92SAndroid Build Coastguard Worker IsExhausted(const std::shared_ptr<cv::Mat> & frame) const20*89c4ff92SAndroid Build Coastguard Workerbool CvVideoFrameReader::IsExhausted(const std::shared_ptr<cv::Mat>& frame) const 21*89c4ff92SAndroid Build Coastguard Worker { 22*89c4ff92SAndroid Build Coastguard Worker assert(frame!=nullptr); 23*89c4ff92SAndroid Build Coastguard Worker return frame->empty(); 24*89c4ff92SAndroid Build Coastguard Worker } 25*89c4ff92SAndroid Build Coastguard Worker CheckIsOpen(const std::string & source)26*89c4ff92SAndroid Build Coastguard Workervoid CvVideoFrameReader::CheckIsOpen(const std::string& source) 27*89c4ff92SAndroid Build Coastguard Worker { 28*89c4ff92SAndroid Build Coastguard Worker if (!m_capture.isOpened()) 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker throw std::runtime_error("Failed to open video capture for the source = " + source); 31*89c4ff92SAndroid Build Coastguard Worker } 32*89c4ff92SAndroid Build Coastguard Worker } 33*89c4ff92SAndroid Build Coastguard Worker Init(const std::string & source)34*89c4ff92SAndroid Build Coastguard Workervoid CvVideoFrameReader::Init(const std::string& source) 35*89c4ff92SAndroid Build Coastguard Worker { 36*89c4ff92SAndroid Build Coastguard Worker m_capture.open(source); 37*89c4ff92SAndroid Build Coastguard Worker CheckIsOpen(source); 38*89c4ff92SAndroid Build Coastguard Worker } 39*89c4ff92SAndroid Build Coastguard Worker GetSourceWidth() const40*89c4ff92SAndroid Build Coastguard Workerint CvVideoFrameReader::GetSourceWidth() const 41*89c4ff92SAndroid Build Coastguard Worker { 42*89c4ff92SAndroid Build Coastguard Worker return static_cast<int>(lround(m_capture.get(cv::CAP_PROP_FRAME_WIDTH))); 43*89c4ff92SAndroid Build Coastguard Worker } 44*89c4ff92SAndroid Build Coastguard Worker GetSourceHeight() const45*89c4ff92SAndroid Build Coastguard Workerint CvVideoFrameReader::GetSourceHeight() const 46*89c4ff92SAndroid Build Coastguard Worker { 47*89c4ff92SAndroid Build Coastguard Worker return static_cast<int>(lround(m_capture.get(cv::CAP_PROP_FRAME_HEIGHT))); 48*89c4ff92SAndroid Build Coastguard Worker } 49*89c4ff92SAndroid Build Coastguard Worker GetSourceFps() const50*89c4ff92SAndroid Build Coastguard Workerdouble CvVideoFrameReader::GetSourceFps() const 51*89c4ff92SAndroid Build Coastguard Worker { 52*89c4ff92SAndroid Build Coastguard Worker return m_capture.get(cv::CAP_PROP_FPS); 53*89c4ff92SAndroid Build Coastguard Worker } 54*89c4ff92SAndroid Build Coastguard Worker ConvertToRGB()55*89c4ff92SAndroid Build Coastguard Workerbool CvVideoFrameReader::ConvertToRGB() 56*89c4ff92SAndroid Build Coastguard Worker { 57*89c4ff92SAndroid Build Coastguard Worker m_capture.set(cv::CAP_PROP_CONVERT_RGB, 1.0); 58*89c4ff92SAndroid Build Coastguard Worker return static_cast<bool>(m_capture.get(cv::CAP_PROP_CONVERT_RGB)); 59*89c4ff92SAndroid Build Coastguard Worker } 60*89c4ff92SAndroid Build Coastguard Worker GetSourceEncoding() const61*89c4ff92SAndroid Build Coastguard Workerstd::string CvVideoFrameReader::GetSourceEncoding() const 62*89c4ff92SAndroid Build Coastguard Worker { 63*89c4ff92SAndroid Build Coastguard Worker char fourccStr[5]; 64*89c4ff92SAndroid Build Coastguard Worker auto fourcc = (int)m_capture.get(cv::CAP_PROP_FOURCC); 65*89c4ff92SAndroid Build Coastguard Worker sprintf(fourccStr,"%c%c%c%c",fourcc & 0xFF, (fourcc >> 8) & 0xFF, (fourcc >> 16) & 0xFF, (fourcc >> 24) & 0xFF); 66*89c4ff92SAndroid Build Coastguard Worker return fourccStr; 67*89c4ff92SAndroid Build Coastguard Worker } 68*89c4ff92SAndroid Build Coastguard Worker GetSourceEncodingInt() const69*89c4ff92SAndroid Build Coastguard Workerint CvVideoFrameReader::GetSourceEncodingInt() const 70*89c4ff92SAndroid Build Coastguard Worker { 71*89c4ff92SAndroid Build Coastguard Worker return (int)m_capture.get(cv::CAP_PROP_FOURCC); 72*89c4ff92SAndroid Build Coastguard Worker } 73*89c4ff92SAndroid Build Coastguard Worker GetFrameCount() const74*89c4ff92SAndroid Build Coastguard Workerint CvVideoFrameReader::GetFrameCount() const 75*89c4ff92SAndroid Build Coastguard Worker { 76*89c4ff92SAndroid Build Coastguard Worker return static_cast<int>(lround(m_capture.get(cv::CAP_PROP_FRAME_COUNT))); 77*89c4ff92SAndroid Build Coastguard Worker }; 78*89c4ff92SAndroid Build Coastguard Worker ReadFrame()79*89c4ff92SAndroid Build Coastguard Workerstd::shared_ptr<cv::Mat> CvVideoFrameReaderRgbWrapper::ReadFrame() 80*89c4ff92SAndroid Build Coastguard Worker { 81*89c4ff92SAndroid Build Coastguard Worker auto framePtr = m_reader->ReadFrame(); 82*89c4ff92SAndroid Build Coastguard Worker if (!IsExhausted(framePtr)) 83*89c4ff92SAndroid Build Coastguard Worker { 84*89c4ff92SAndroid Build Coastguard Worker cv::cvtColor(*framePtr, *framePtr, cv::COLOR_BGR2RGB); 85*89c4ff92SAndroid Build Coastguard Worker } 86*89c4ff92SAndroid Build Coastguard Worker return framePtr; 87*89c4ff92SAndroid Build Coastguard Worker } 88*89c4ff92SAndroid Build Coastguard Worker IsExhausted(const std::shared_ptr<cv::Mat> & frame) const89*89c4ff92SAndroid Build Coastguard Workerbool CvVideoFrameReaderRgbWrapper::IsExhausted(const std::shared_ptr<cv::Mat>& frame) const 90*89c4ff92SAndroid Build Coastguard Worker { 91*89c4ff92SAndroid Build Coastguard Worker return m_reader->IsExhausted(frame); 92*89c4ff92SAndroid Build Coastguard Worker } 93*89c4ff92SAndroid Build Coastguard Worker CvVideoFrameReaderRgbWrapper(std::unique_ptr<common::CvVideoFrameReader> reader)94*89c4ff92SAndroid Build Coastguard WorkerCvVideoFrameReaderRgbWrapper::CvVideoFrameReaderRgbWrapper(std::unique_ptr<common::CvVideoFrameReader> reader): 95*89c4ff92SAndroid Build Coastguard Worker m_reader(std::move(reader)) 96*89c4ff92SAndroid Build Coastguard Worker {} 97*89c4ff92SAndroid Build Coastguard Worker 98*89c4ff92SAndroid Build Coastguard Worker }// namespace common