Conscience Core
CscCaptureEngine.h
Go to the documentation of this file.
1 //
2 // CscCaptureEngine.hpp
3 // ConscienceRobotManager
4 //
5 // Created by Iliès Zaoui on 14/07/2019.
6 // Copyright © 2019 IliesZaoui. All rights reserved.
7 //
8 
9 #ifndef CscCaptureEngine_h
10 #define CscCaptureEngine_h
11 
12 #include <mutex>
13 #include <thread>
14 #include <opencv2/opencv.hpp>
15 
16 #include "CscCommon.h"
17 
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;
21 namespace conscience_utils::JSON {
23 class CscJsonObject;
24 }
25 using namespace conscience_utils::JSON;
26 using namespace conscience_utils::logging;
27 
29 
30 ENUM(CscEntityVideoSourceType,
31  NoStream,
32  LocalFile,
33  LocalDevice,
34  BytesStream,
35  NetworkStream);
36 
37 struct Resolution {
38  int width;
39  int height;
40  Resolution(int width, int height) : width(width), height(height) {
41  }
42 
43  cv::Size toSize() const {
44  return cv::Size(width, height);
45  }
46 
47  operator string() const {
48  return to_string(width) + "x" + to_string(height);
49  }
50 };
51 
53 
54 public:
55  static ptr<CscEntityVideoSource> none();
56 
57  static ptr<CscEntityVideoSource> localFileStream(const string &footagePath);
58 
59  static ptr<CscEntityVideoSource> localDeviceStream(
60  const int &deviceId,
61  const optional<Resolution> &resolution = {},
62  const optional<unsigned> &fps = {});
63 
67  static ptr<CscEntityVideoSource> networkStream(
68  const string &streamUrl,
69  const optional<Resolution> &resolution = {},
70  const optional<int> &fps = {},
71  const map<string, string> &additionalParams = {});
72 
74 
75  operator string() {
76  return "VideoSource(" + to_string(type) + ", parameters=" + mapToString(parameters) + ")";
77  }
78 
79  string toString();
80 
81  string serialize() const;
82  CscJsonObject *serializeJson() const;
83  static ptr<CscEntityVideoSource> fromSerializedJson(CscJsonObjectReader &serialized);
84  static ptr<CscEntityVideoSource> fromSerialized(const string &serializedVideoSource);
85 
86  const CscEntityVideoSourceType &getType();
87 
88  bool isNone() const;
89 
90  int getIntParameter(const string &parameterName);
91 
92  optional<int> getOptionalIntParameter(const string &parameterName);
93 
94  string getParameter(const string &parameterName);
95 
96  CscEntityVideoSource(const CscEntityVideoSourceType &type, const map<string, string> &parameters = {});
97 
98  const string &getId() const;
99 
104  optional<string> getNetworkStreamUrl();
105  optional<string> getOptionalParam(const string &parameterName);
106 
107 private:
108  const CscEntityVideoSourceType type;
109  const std::map<string, string> parameters;
110  const string id;
111  string generateId() const;
112 };
113 
114 class CannotOpenVideoStreamException : public exception {
115 public:
116  CannotOpenVideoStreamException(ptr<CscEntityVideoSource> videoSource) noexcept : errorMessage("cannot open video stream from source: " + string(*videoSource)){};
117 
118  const char *what() const noexcept override {
119  return errorMessage.c_str();
120  }
121 
122  ~CannotOpenVideoStreamException() noexcept override = default;
123 
124 private:
125  const string errorMessage;
126 };
127 
129 public:
130  CscCaptureEngine(const string &logPrefix = "");
131  virtual ~CscCaptureEngine();
132 
137  void open(ptr<CscEntityVideoSource> videoSource);
138 
142  Mat &getCurrentFrame();
143 
147  Mat getCurrentFrameClone();
148 
152  Mat &getProcessedFrame();
153 
157  Mat getProcessedFrameClone();
158  Mat &getProcessedFrameMini();
159 
163  void close();
164 
168  bool isOpened() const;
169 
173  bool isOpening() const;
174 
178  bool isClosed() const;
179 
180  void populateProcessedImage(Mat image);
181  void updateCaptureProp(int prop, float value);
182  float getCapturePropValue(int prop);
183 
184  static void writeImage(string path, Mat &image);
185 
186  optional<Resolution> getRequestedResolution() const {
187  return requestedResolution;
188  }
189 
190  optional<Resolution> getActualResolution() const {
191  return actualResolution;
192  }
193 
194  CscEntityVideoSourceType getSourceType() const;
195 
196 private:
197  enum Status {
198  OPENING,
199  OPENED,
200  CLOSED,
201  DESTROYING,
202  DESTROYED
203  };
204 
205  ptr<CscEntityVideoSource> videoSource = nullptr;
206  VideoCapture videoCapture;
207 
208  bool conscienceVisionStreamCurrentlyOpening = false;
209 
210  recursive_mutex grabMutex;
211  mutex currentImageMutex;
212  mutex processedImageMutex;
213 
214  int currentOpenRequestId = 0;
215 
216  optional<unsigned long long> grabFailureStartTimestamp = {};
217  bool grabWarningLogged = false;
218 
219  optional<Resolution> requestedResolution = {};
220  optional<Resolution> actualResolution = {};
221 
222  optional<int> requestedFps = {};
223  optional<int> actualFps = {};
224 
225  void updateActualMetrics();
226 
227  int deviceId = 0;
228 
229  Mat currentFrame;
230  Mat processedFrame;
231  Mat processedFrameMini;
232 
233  thread *captureThread = nullptr;
234  void initThread();
235  Status status = Status::CLOSED;
236 
237  const int timeStepMillis = 250;
238  const int maxTimeAttemptMillis = 30000;
239  int actualTimeAttemptMillis = 0;
240  int actualAttempts = 0;
241  mutex requestOpenMutex;
242 
246  void doOpen(ptr<CscEntityVideoSource> videoSource);
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 = {});
251 
252  unique_ptr<CscLogger> logger = nullptr;
253 
254  void updateFrame();
255  bool isNoSleepStream() const;
256  void sleepUntilFrame();
260  void tryOpen();
261 
262  bool isMediaFile() const;
263 
264  void setCurrentFrame(Mat currentFrame);
265 
266  void captureThreadLoop();
267 };
268 
269 }
270 
271 #endif
nlohmann::to_string
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Definition: json.hpp:26470
conscience_core::media_capture::Resolution::Resolution
Resolution(int width, int height)
Definition: CscCaptureEngine.h:40
conscience_core::media_capture::CscCaptureEngine::getRequestedResolution
optional< Resolution > getRequestedResolution() const
Definition: CscCaptureEngine.h:186
logger
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
conscience_core::media_capture::CscEntityVideoSource
Definition: CscCaptureEngine.h:52
conscience_utils::logging
Definition: conscience_log.cpp:20
conscience_core::media_capture::ENUM
ENUM(CscEntityVideoSourceType, NoStream, LocalFile, LocalDevice, BytesStream, NetworkStream)
conscience_core::core_objects::resources::LocalFile
@ LocalFile
Definition: CscResourceSpec.h:21
conscience_core::media_capture::CannotOpenVideoStreamException
Definition: CscCaptureEngine.h:114
conscience_utils::JSON
Definition: CscCommandMetadataBuilder.h:20
conscience_core::media_capture::Resolution::height
int height
Definition: CscCaptureEngine.h:39
conscience_core::media_capture::CscCaptureEngine
Definition: CscCaptureEngine.h:128
CscCommon.h
jwt::json::type
type
Generic JSON types used in JWTs.
Definition: jwt.h:1794
conscience_core::media_capture::CannotOpenVideoStreamException::what
const char * what() const noexcept override
Definition: CscCaptureEngine.h:118
conscience_core::media_capture::CscCaptureEngine::getActualResolution
optional< Resolution > getActualResolution() const
Definition: CscCaptureEngine.h:190
conscience_core::media_capture::Resolution
Definition: CscCaptureEngine.h:37
conscience_core::media_capture::Resolution::width
int width
Definition: CscCaptureEngine.h:38
conscience_core::media_capture
Definition: CscEntityReflexion.h:53
conscience_core::media_capture::Resolution::toSize
cv::Size toSize() const
Definition: CscCaptureEngine.h:43
conscience_utils::JSON::CscJsonObjectReader
Definition: json.h:203
conscience_utils::JSON::CscJsonObject
Definition: json.h:494
conscience_utils::mapToString
string mapToString(const map< K, V > &theMap, const string &entriesSeparator=",", const string &keyValueSeparator="=")
Definition: conscience_util.h:502
conscience_core::bridging::commands::environment_objects::optional< string >
const ptr< CscObjectModel > const string const CscPoint3d const CscPoint3d optional< string >
Definition: environmentObjectsCommands.h:373
ptr
std::shared_ptr< T > ptr
Definition: CscCommon.h:29
conscience_utils::equals
bool equals(const map< K, V > &map1, const map< K, V > &map2)
Definition: conscience_util.h:527
conscience_core::media_capture::CannotOpenVideoStreamException::CannotOpenVideoStreamException
CannotOpenVideoStreamException(ptr< CscEntityVideoSource > videoSource) noexcept
Definition: CscCaptureEngine.h:116