Fixposition SDK 0.0.0-heads/main-0-g4d935a0
Collection of c++ libraries and apps for use with Fixposition products on Linux
Loading...
Searching...
No Matches
cam.hpp
Go to the documentation of this file.
1/**
2 * \verbatim
3 * ___ ___
4 * \ \ / /
5 * \ \/ / Copyright (c) Fixposition AG (www.fixposition.com) and contributors
6 * / /\ \ License: see the LICENSE file
7 * /__/ \__\
8 * \endverbatim
9 *
10 * @file
11 * @brief Fixposition SDK: Camera types and utilities
12 *
13 * @page FPSDK_COMMON_CAM Camera types and utilities
14 *
15 * **API**: fpsdk_common/cam.hpp and fpsdk::common::cam
16 *
17 */
18#ifndef __FPSDK_COMMON_CAM_HPP__
19#define __FPSDK_COMMON_CAM_HPP__
20
21/* LIBC/STL */
22#include <cstdint>
23#include <memory>
24#include <vector>
25
26/* EXTERNAL */
27
28/* PACKAGE */
29#include "fpsdk_common/time.hpp"
30
31namespace fpsdk {
32namespace common {
33/**
34 * @brief Camera types and utilities
35 */
36namespace cam {
37/* ****************************************************************************************************************** */
38
39/**
40 * @brief Camera ID
41 */
42enum class CamId : uint8_t // clang-format off
43{
44 UNSPECIFIED = 0, //!< Unspecified
45 CAM1 = 1, //!< Camera 1
46 CAM2 = 2, //!< Camera 2
47 CAM3 = 3, //!< Camera 3
48 CAM4 = 4, //!< Camera 4
49}; // clang-format on
50
51/**
52 * @brief Stringify camera ID enum
53 *
54 * @param[in] camid Camera ID
55 *
56 * @returns the stringification of the CameraId, or "?" for bad enum values
57 */
58const char* CamIdToStr(const CamId camid);
59
60/**
61 * @brief Convert camera ID string to enum
62 *
63 * @param[in] str Camera ID string
64 * @param[in] def Default camera ID, for bad str
65 *
66 * @returns the camera ID, or def if str was invalid
67 */
68CamId CamIdFromStrOr(const char* str, const CamId def);
69
70/**
71 * @brief Convert camera ID value to enum
72 *
73 * @param[in] val Camera ID value
74 * @param[in] def Default camera data type, for bad str
75 *
76 * @returns the camera data type, or def if str was invalid
77 */
78CamId CamIdFromValOr(const uint8_t val, const CamId def);
79
80// ---------------------------------------------------------------------------------------------------------------------
81
82/**
83 * @brief Camera data type (type of data)
84 */
85enum class CamDataType : uint8_t // clang-format off
86{
87 UNSPECIFIED = 0, //!< Unspecified
88 HIRES_IMG = 1, //!< High-res image
89 LORES_IMG = 2, //!< Low-res image
90 HIRES_VID = 3, //!< High-res video
91 LORES_VID = 4, //!< Low-res video
92}; // clang-format on
93
94/**
95 * @brief Stringify camera data type enum
96 *
97 * @param[in] type Camera data type
98 *
99 * @returns the stringification of the camera data type, or "?" for bad enum values
100 */
101const char* CamDataTypeToStr(const CamDataType type);
102
103/**
104 * @brief Convert camera data type string to enum
105 *
106 * @param[in] str Camera data type string
107 * @param[in] def Default camera data type, for bad str
108 *
109 * @returns the camera data type, or def if str was invalid
110 */
111CamDataType CamDataTypeFromStrOr(const char* str, const CamDataType def);
112
113/**
114 * @brief Convert camera data type value to enum
115 *
116 * @param[in] val Camera data type value
117 * @param[in] def Default camera data type, for bad str
118 *
119 * @returns the camera data type, or def if str was invalid
120 */
121CamDataType CamDataTypeFromValOr(const uint8_t val, const CamDataType def);
122
123// ---------------------------------------------------------------------------------------------------------------------
124
125/**
126 * @brief Camera data format
127 */
128enum class CamDataFmt : uint8_t // clang-format off
129{
130 UNSPECIFIED = 0, //!< Invalid
131 // Video
132 H264_NAL = 1, //!< H.264 NAL (AVC) (video/avc)
133 H265_NAL = 2, //!< H.265 NAL (HEVC) (video/hevc)
134 MJPEG = 3, //!< Motion JPEG (image/jpeg)
135 // Image
136 JPEG = 4, //!< JPEG (image/jpeg)
137 Y8 = 5, //!< Planar Y (greyscale), 8bpp
138 NV12 = 6, //!< Planar YUV 4:2:0, 12bpp
139 RGB24 = 7, //!< Packed RGB 8:8:8, 24bpp
140}; // clang-format on
141
142/**
143 * @brief Stringify camera data format enum
144 *
145 * @param[in] fmt Camera data format
146 *
147 * @returns the stringification of the camera data format, or "?" for bad enum values
148 */
149const char* CamDataFmtToStr(const CamDataFmt fmt);
150
151/**
152 * @brief Convert camera data format string to enum
153 *
154 * @param[in] str Camera data format string
155 * @param[in] def Default camera data format, for bad str
156 *
157 * @returns the camera data format, or def if str was invalid
158 */
159CamDataFmt CamDataFmtFromStrOr(const char* str, const CamDataFmt def);
160
161/**
162 * @brief Convert camera data format value to enum
163 *
164 * @param[in] val Camera data format value
165 * @param[in] def Default camera data format, for bad str
166 *
167 * @returns the camera data format, or def if str was invalid
168 */
169CamDataFmt CamDataFmtFromValOr(const uint8_t val, const CamDataFmt def);
170
171// ---------------------------------------------------------------------------------------------------------------------
172
173/**
174 * @brief Camera frame type
175 */
176enum class CamDataFrm : uint8_t // clang-format off
177{
178 UNSPECIFIED = 0, //!< Unspecified, invalid data
179 I_FRAME = 1, //!< I-frame (= Horizon camsys MC_H26[45]_NALU_TYPE_I)
180 P_FRAME = 2, //!< P-frame (= Horizon camsys MC_H26[45]_NALU_TYPE_P)
181 FULL = 3, //!< Full frame (non-encoded, e.g. NV12 or JPEG)
182 OTHER = 4, //!< Other frame type (unexpected)
183}; // clang-format on
184
185/**
186 * @brief Stringify camera data frame type enum
187 *
188 * @param[in] frm Camera data frame type
189 *
190 * @returns the stringification of the camera data frame type, or "?" for bad enum values
191 */
192const char* CamDataFrmToStr(const CamDataFrm frm);
193
194/**
195 * @brief Convert camera data frame type string to enum
196 *
197 * @param[in] str Camera data frame type string
198 * @param[in] def Default camera data frame type, for bad str
199 *
200 * @returns the camera data frame type, or def if str was invalid
201 */
202CamDataFrm CamDataFrmFromStrOr(const char* str, const CamDataFrm def);
203
204/**
205 * @brief Convert camera data frame type value to enum
206 *
207 * @param[in] val Camera data frame type value
208 * @param[in] def Default camera data frame type, for bad str
209 *
210 * @returns the camera data frame type, or def if str was invalid
211 */
212CamDataFrm CamDataFrmFromValOr(const uint8_t val, const CamDataFrm def);
213
214// ---------------------------------------------------------------------------------------------------------------------
215
216/**
217 * @brief Camera data from CamStream (or from FPL, see fpl::CamData)
218 */
220{
221 // clang-format off
222 bool valid_ = false; //!< Data valid, successfully extracted from message
223 CamId cam_id_ = CamId::UNSPECIFIED; //!< = meta_.cam_id_ as enum (if value in range)
224 CamDataType type_ = CamDataType::UNSPECIFIED; //!< = meta_.type_ as enum (if value in range)
225 CamDataFmt fmt_ = CamDataFmt::UNSPECIFIED; //!< = meta_.fmt_ as enum (if value in range)
226 CamDataFrm frm_ = CamDataFrm::UNSPECIFIED; //!< = meta_.frm_ as enum (if value in range)
227 uint64_t seq_ = 0; //!< Sequence number
228 uint64_t ts_ = 0; //!< Camera image time (middle of exposure) [CLOCK_REALTIME ns] (0 = invalid)
229 uint32_t dt_ = 0; //!< Exposure time (duration) [ns] (0 = not available)
230 uint32_t width_ = 0; //!< Width of the frame [px]
231 uint32_t height_ = 0; //!< Height of the fram [px]
232 std::vector<uint8_t> data_; //!< Image/frame data, contents depends on fmt_ etc.
233 // clang-format on
234};
235
236// ---------------------------------------------------------------------------------------------------------------------
237
238/**
239 * @brief Camera stream parameters
240 */
242{
243 std::string name_; //!< Name (for debug logging)
244 std::string host_; //!< Host name or IP address
247 int rate_ = 1; //!< Rate (1 = every frame, 2 = every 2nd frame, ...), not for video streams
248 static constexpr int RATE_MIN = 1; //!< Min rate_
249 static constexpr int RATE_MAX = 25; //!< Max rate_
250 time::Duration timeout_ = time::Duration::FromSec(1.0); //!< Timeout receiving data (> 0.1s)
251};
252
253/**
254 * @brief Camera streaming from from PBx-A1 sensor
255 */
257{
258 public:
259 /**
260 * @brief Constructor
261 *
262 * Do not use. Use CreateCamStream() factory function.
263 *
264 * @param[in] params Parameters
265 */
267
268 /**
269 * @brief Destructor
270 */
271 virtual ~CamStream();
272
273 /**
274 * @brief Connect stream
275 *
276 * @returns true if the stream was connected successfully, false otherwise (bad params, network problem, ...)
277 */
278 virtual bool Connect() = 0;
279
280 /**
281 * @brief Disconnect stream
282 *
283 * Call to explicitly disconnect. The destructor calls this automatically.
284 */
285 virtual void Disconnect() = 0;
286
287 /**
288 * @brief Get next frame
289 *
290 * @param[out] data Camera image/frame data
291 *
292 * @returns true if a next frame was received and data is filled (it may still be not valid_!),
293 * false on error (lost connection, bad data, ...)
294 */
295 virtual bool NextFrame(CamData& data) = 0;
296
297 protected:
298 CamStreamParams params_; //!< Parameters
299};
300
301/**
302 * @brief Pointer to a CamStream instance, see CreateCamStream()
303 */
304using CamStreamPtr = std::unique_ptr<CamStream>;
305
306/**
307 * @brief Create a camera stream instance
308 *
309 * @param[in] params The parameters
310 *
311 * @returns the video frame decoder instances, or nullptr if it failed (bad params)
312 */
314
315/* ****************************************************************************************************************** */
316} // namespace cam
317} // namespace common
318} // namespace fpsdk
319#endif // __FPSDK_COMMON_CAM_HPP__
CamStreamParams params_
Parameters.
Definition cam.hpp:298
virtual bool Connect()=0
Connect stream.
CamStream(const CamStreamParams &params)
Constructor.
virtual ~CamStream()
Destructor.
virtual bool NextFrame(CamData &data)=0
Get next frame.
virtual void Disconnect()=0
Disconnect stream.
static Duration FromSec(const double sec)
Make Duration from seconds.
Camera types and utilities.
Definition cam.hpp:36
std::unique_ptr< CamStream > CamStreamPtr
Pointer to a CamStream instance, see CreateCamStream().
Definition cam.hpp:304
CamId CamIdFromValOr(const uint8_t val, const CamId def)
Convert camera ID value to enum.
const char * CamIdToStr(const CamId camid)
Stringify camera ID enum.
CamDataFmt CamDataFmtFromStrOr(const char *str, const CamDataFmt def)
Convert camera data format string to enum.
CamDataFrm CamDataFrmFromValOr(const uint8_t val, const CamDataFrm def)
Convert camera data frame type value to enum.
const char * CamDataFmtToStr(const CamDataFmt fmt)
Stringify camera data format enum.
CamId CamIdFromStrOr(const char *str, const CamId def)
Convert camera ID string to enum.
CamId
Camera ID.
Definition cam.hpp:43
@ UNSPECIFIED
Unspecified.
Definition cam.hpp:44
CamDataFmt CamDataFmtFromValOr(const uint8_t val, const CamDataFmt def)
Convert camera data format value to enum.
const char * CamDataTypeToStr(const CamDataType type)
Stringify camera data type enum.
CamDataType
Camera data type (type of data).
Definition cam.hpp:86
@ UNSPECIFIED
Unspecified.
Definition cam.hpp:87
@ HIRES_VID
High-res video.
Definition cam.hpp:90
@ LORES_IMG
Low-res image.
Definition cam.hpp:89
@ HIRES_IMG
High-res image.
Definition cam.hpp:88
@ LORES_VID
Low-res video.
Definition cam.hpp:91
const char * CamDataFrmToStr(const CamDataFrm frm)
Stringify camera data frame type enum.
CamDataType CamDataTypeFromValOr(const uint8_t val, const CamDataType def)
Convert camera data type value to enum.
CamDataFmt
Camera data format.
Definition cam.hpp:129
@ RGB24
Packed RGB 8:8:8, 24bpp.
Definition cam.hpp:139
@ MJPEG
Motion JPEG (image/jpeg).
Definition cam.hpp:134
@ NV12
Planar YUV 4:2:0, 12bpp.
Definition cam.hpp:138
@ H264_NAL
H.264 NAL (AVC) (video/avc).
Definition cam.hpp:132
@ JPEG
JPEG (image/jpeg).
Definition cam.hpp:136
@ H265_NAL
H.265 NAL (HEVC) (video/hevc).
Definition cam.hpp:133
@ Y8
Planar Y (greyscale), 8bpp.
Definition cam.hpp:137
CamDataFrm CamDataFrmFromStrOr(const char *str, const CamDataFrm def)
Convert camera data frame type string to enum.
CamDataFrm
Camera frame type.
Definition cam.hpp:177
@ OTHER
Other frame type (unexpected).
Definition cam.hpp:182
@ UNSPECIFIED
Unspecified, invalid data.
Definition cam.hpp:178
@ I_FRAME
I-frame (= Horizon camsys MC_H26[45]_NALU_TYPE_I).
Definition cam.hpp:179
@ FULL
Full frame (non-encoded, e.g. NV12 or JPEG).
Definition cam.hpp:181
@ P_FRAME
P-frame (= Horizon camsys MC_H26[45]_NALU_TYPE_P).
Definition cam.hpp:180
CamStreamPtr CreateCamStream(const CamStreamParams &params)
Create a camera stream instance.
CamDataType CamDataTypeFromStrOr(const char *str, const CamDataType def)
Convert camera data type string to enum.
Fixposition SDK: Common library.
Definition doc.hpp:21
Fixposition SDK.
Camera data from CamStream (or from FPL, see fpl::CamData).
Definition cam.hpp:220
uint64_t ts_
Camera image time (middle of exposure) [CLOCK_REALTIME ns] (0 = invalid).
Definition cam.hpp:228
CamId cam_id_
= meta_.cam_id_ as enum (if value in range)
Definition cam.hpp:223
uint32_t dt_
Exposure time (duration) [ns] (0 = not available).
Definition cam.hpp:229
CamDataFmt fmt_
= meta_.fmt_ as enum (if value in range)
Definition cam.hpp:225
uint64_t seq_
Sequence number.
Definition cam.hpp:227
CamDataType type_
= meta_.type_ as enum (if value in range)
Definition cam.hpp:224
bool valid_
Data valid, successfully extracted from message.
Definition cam.hpp:222
uint32_t height_
Height of the fram [px].
Definition cam.hpp:231
std::vector< uint8_t > data_
Image/frame data, contents depends on fmt_ etc.
Definition cam.hpp:232
uint32_t width_
Width of the frame [px].
Definition cam.hpp:230
CamDataFrm frm_
= meta_.frm_ as enum (if value in range)
Definition cam.hpp:226
Camera stream parameters.
Definition cam.hpp:242
int rate_
Rate (1 = every frame, 2 = every 2nd frame, ...), not for video streams.
Definition cam.hpp:247
std::string host_
Host name or IP address.
Definition cam.hpp:244
CamDataType type_
Camera data type.
Definition cam.hpp:246
static constexpr int RATE_MAX
Max rate_.
Definition cam.hpp:249
static constexpr int RATE_MIN
Min rate_.
Definition cam.hpp:248
std::string name_
Name (for debug logging).
Definition cam.hpp:243
time::Duration timeout_
Timeout receiving data (> 0.1s).
Definition cam.hpp:250
Fixposition SDK: Time utilities.