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