xref: /aosp_15_r20/external/armnn/samples/common/src/CVUtils/CvVideoFrameReader.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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 Worker std::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 Worker bool 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 Worker void 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 Worker void 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 Worker int 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 Worker int 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 Worker double 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 Worker bool 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 Worker std::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 Worker int 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 Worker int 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 Worker std::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 Worker bool 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 Worker CvVideoFrameReaderRgbWrapper::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