9 #ifndef CscCaptureEngine_h
10 #define CscCaptureEngine_h
14 #include <opencv2/opencv.hpp>
18 using cv::Mat, cv::VideoCapture, cv::CAP_PROP_FPS, cv::CAP_PROP_FRAME_WIDTH, cv::CAP_PROP_FRAME_HEIGHT;
19 using std::pair, std::mutex, std::recursive_mutex, std::exception, std::thread, std::lock_guard;
20 namespace fs = std::filesystem;
30 ENUM(CscEntityVideoSourceType,
40 Resolution(
int width,
int height) : width(width), height(height) {
44 return cv::Size(width, height);
47 operator string()
const {
61 const optional<Resolution> &resolution = {},
62 const optional<unsigned> &fps = {});
68 const string &streamUrl,
69 const optional<Resolution> &resolution = {},
70 const optional<int> &fps = {},
71 const map<string, string> &additionalParams = {});
81 string serialize()
const;
86 const CscEntityVideoSourceType &getType();
90 int getIntParameter(
const string ¶meterName);
92 optional<int> getOptionalIntParameter(
const string ¶meterName);
94 string getParameter(
const string ¶meterName);
98 const string &getId()
const;
108 const CscEntityVideoSourceType
type;
109 const std::map<string, string> parameters;
111 string generateId()
const;
118 const char *
what() const noexcept
override {
119 return errorMessage.c_str();
125 const
string errorMessage;
142 Mat &getCurrentFrame();
147 Mat getCurrentFrameClone();
152 Mat &getProcessedFrame();
157 Mat getProcessedFrameClone();
158 Mat &getProcessedFrameMini();
168 bool isOpened()
const;
173 bool isOpening()
const;
178 bool isClosed()
const;
180 void populateProcessedImage(Mat image);
181 void updateCaptureProp(
int prop,
float value);
182 float getCapturePropValue(
int prop);
184 static void writeImage(
string path, Mat &image);
187 return requestedResolution;
191 return actualResolution;
194 CscEntityVideoSourceType getSourceType()
const;
206 VideoCapture videoCapture;
208 bool conscienceVisionStreamCurrentlyOpening =
false;
210 recursive_mutex grabMutex;
211 mutex currentImageMutex;
212 mutex processedImageMutex;
214 int currentOpenRequestId = 0;
216 optional<unsigned long long> grabFailureStartTimestamp = {};
217 bool grabWarningLogged =
false;
219 optional<Resolution> requestedResolution = {};
220 optional<Resolution> actualResolution = {};
222 optional<int> requestedFps = {};
223 optional<int> actualFps = {};
225 void updateActualMetrics();
231 Mat processedFrameMini;
233 thread *captureThread =
nullptr;
235 Status status = Status::CLOSED;
237 const int timeStepMillis = 250;
238 const int maxTimeAttemptMillis = 30000;
239 int actualTimeAttemptMillis = 0;
240 int actualAttempts = 0;
241 mutex requestOpenMutex;
247 void openStreamFromDevice(
int deviceId,
const optional<int> &frameWidth,
const optional<int> &frameHeight,
const optional<int> &requestedFps = {});
248 void openStreamFromFile(
string filePath);
249 void openStreamFromNetwork(
string streamUrl, optional<Resolution> resolution = {}, optional<int> fps = {});
250 void onOpened(optional<Resolution> requestedResolution = {}, optional<int> requestedFps = {});
252 unique_ptr<CscLogger>
logger =
nullptr;
255 bool isNoSleepStream()
const;
256 void sleepUntilFrame();
262 bool isMediaFile()
const;
264 void setCurrentFrame(Mat currentFrame);
266 void captureThreadLoop();