Fixposition SDK 0.0.0-heads/main-0-g200d201
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 (typically CamDataFmt::NV12)
89 LORES_IMG = 2, //!< Low-res image (typically CamDataFmt::NV12)
90 HIRES_VID = 3, //!< High-res video (typically CamDataFmt::H265)
91 LORES_VID = 4, //!< Low-res video (typically CamDataFmt::JPEG)
92 FURES_IMG = 5, //!< Full-res image (typically CamDataFmt::NV12, for some cameras/sensors only, not streamable)
93 FURES_VID = 6, //!< Full-res video (typically CamDataFmt::H265, for some cameras/sensors only)
94 DEPTH_IMG = 7, //!< Internal use, ignore
95 DEPTH_VID = 8, //!< Internal use, ignore
96}; // clang-format on
97
98/**
99 * @brief Stringify camera data type enum
100 *
101 * @param[in] type Camera data type
102 *
103 * @returns the stringification of the camera data type, or "?" for bad enum values
104 */
105const char* CamDataTypeToStr(const CamDataType type);
106
107/**
108 * @brief Convert camera data type string to enum
109 *
110 * @param[in] str Camera data type string
111 * @param[in] def Default camera data type, for bad str
112 *
113 * @returns the camera data type, or def if str was invalid
114 */
115CamDataType CamDataTypeFromStrOr(const char* str, const CamDataType def);
116
117/**
118 * @brief Convert camera data type value to enum
119 *
120 * @param[in] val Camera data type value
121 * @param[in] def Default camera data type, for bad str
122 *
123 * @returns the camera data type, or def if str was invalid
124 */
125CamDataType CamDataTypeFromValOr(const uint8_t val, const CamDataType def);
126
127// ---------------------------------------------------------------------------------------------------------------------
128
129/**
130 * @brief Camera data format
131 */
132enum class CamDataFmt : uint8_t // clang-format off
133{
134 UNSPECIFIED = 0, //!< Invalid
135 // Video
136 H264_NAL = 1, //!< H.264 NAL (AVC) (video/avc)
137 H265_NAL = 2, //!< H.265 NAL (HEVC) (video/hevc)
138 MJPEG = 3, //!< Motion JPEG (image/jpeg)
139 // Image
140 JPEG = 4, //!< JPEG (image/jpeg)
141 Y8 = 5, //!< Planar Y (greyscale), 8bpp
142 NV12 = 6, //!< Planar YUV 4:2:0, 12bpp
143 RGB24 = 7, //!< Packed RGB 8:8:8, 24bpp
144}; // clang-format on
145
146/**
147 * @brief Stringify camera data format enum
148 *
149 * @param[in] fmt Camera data format
150 *
151 * @returns the stringification of the camera data format, or "?" for bad enum values
152 */
153const char* CamDataFmtToStr(const CamDataFmt fmt);
154
155/**
156 * @brief Convert camera data format string to enum
157 *
158 * @param[in] str Camera data format string
159 * @param[in] def Default camera data format, for bad str
160 *
161 * @returns the camera data format, or def if str was invalid
162 */
163CamDataFmt CamDataFmtFromStrOr(const char* str, const CamDataFmt def);
164
165/**
166 * @brief Convert camera data format value to enum
167 *
168 * @param[in] val Camera data format value
169 * @param[in] def Default camera data format, for bad str
170 *
171 * @returns the camera data format, or def if str was invalid
172 */
173CamDataFmt CamDataFmtFromValOr(const uint8_t val, const CamDataFmt def);
174
175// ---------------------------------------------------------------------------------------------------------------------
176
177/**
178 * @brief Camera frame type
179 */
180enum class CamDataFrm : uint8_t // clang-format off
181{
182 UNSPECIFIED = 0, //!< Unspecified, invalid data
183 I_FRAME = 1, //!< I-frame (= Horizon camsys MC_H26[45]_NALU_TYPE_I)
184 P_FRAME = 2, //!< P-frame (= Horizon camsys MC_H26[45]_NALU_TYPE_P)
185 FULL = 3, //!< Full frame (non-encoded, e.g. NV12 or JPEG)
186 OTHER = 4, //!< Other frame type (unexpected)
187}; // clang-format on
188
189/**
190 * @brief Stringify camera data frame type enum
191 *
192 * @param[in] frm Camera data frame type
193 *
194 * @returns the stringification of the camera data frame type, or "?" for bad enum values
195 */
196const char* CamDataFrmToStr(const CamDataFrm frm);
197
198/**
199 * @brief Convert camera data frame type string to enum
200 *
201 * @param[in] str Camera data frame type string
202 * @param[in] def Default camera data frame type, for bad str
203 *
204 * @returns the camera data frame type, or def if str was invalid
205 */
206CamDataFrm CamDataFrmFromStrOr(const char* str, const CamDataFrm def);
207
208/**
209 * @brief Convert camera data frame type value to enum
210 *
211 * @param[in] val Camera data frame type value
212 * @param[in] def Default camera data frame type, for bad str
213 *
214 * @returns the camera data frame type, or def if str was invalid
215 */
216CamDataFrm CamDataFrmFromValOr(const uint8_t val, const CamDataFrm def);
217
218// ---------------------------------------------------------------------------------------------------------------------
219
220/**
221 * @brief Camera data from CamStream (or from FPL, see fpl::CamData)
222 */
224{
225 // clang-format off
226 bool valid_ = false; //!< Data valid, successfully extracted from message
227 CamId cam_id_ = CamId::UNSPECIFIED; //!< = meta_.cam_id_ as enum (if value in range)
228 CamDataType type_ = CamDataType::UNSPECIFIED; //!< = meta_.type_ as enum (if value in range)
229 CamDataFmt fmt_ = CamDataFmt::UNSPECIFIED; //!< = meta_.fmt_ as enum (if value in range)
230 CamDataFrm frm_ = CamDataFrm::UNSPECIFIED; //!< = meta_.frm_ as enum (if value in range)
231 uint64_t seq_ = 0; //!< Sequence number
232 uint64_t ts_ = 0; //!< Camera image time (middle of exposure) [CLOCK_REALTIME ns] (0 = invalid)
233 uint32_t dt_ = 0; //!< Exposure time (duration) [ns] (0 = not available)
234 uint32_t width_ = 0; //!< Width of the frame [px]
235 uint32_t height_ = 0; //!< Height of the fram [px]
236 std::vector<uint8_t> data_; //!< Image/frame data, contents depends on fmt_ etc.
237 // clang-format on
238};
239
240// ---------------------------------------------------------------------------------------------------------------------
241
242/**
243 * @brief Camera stream parameters
244 */
246{
247 std::string name_; //!< Name (for debug logging)
248 std::string host_; //!< Host name or IP address
251 int rate_ = 1; //!< Rate (1 = every frame, 2 = every 2nd frame, ...), not for video streams
252 static constexpr int RATE_MIN = 1; //!< Min rate_
253 static constexpr int RATE_MAX = 25; //!< Max rate_
254 time::Duration timeout_ = time::Duration::FromSec(1.0); //!< Timeout receiving data (> 0.1s)
255};
256
257/**
258 * @brief Camera streaming from from PBx-A1 sensor
259 */
261{
262 public:
263 /**
264 * @brief Constructor
265 *
266 * Do not use. Use CreateCamStream() factory function.
267 *
268 * @param[in] params Parameters
269 */
270 explicit CamStream(const CamStreamParams& params);
271
272 /**
273 * @brief Destructor
274 */
275 virtual ~CamStream();
276
277 /**
278 * @brief Connect stream
279 *
280 * @returns true if the stream was connected successfully, false otherwise (bad params, network problem, ...)
281 */
282 virtual bool Connect() = 0;
283
284 /**
285 * @brief Disconnect stream
286 *
287 * Call to explicitly disconnect. The destructor calls this automatically.
288 */
289 virtual void Disconnect() = 0;
290
291 /**
292 * @brief Get next frame
293 *
294 * @param[out] data Camera image/frame data
295 *
296 * @returns true if a next frame was received and data is filled (it may still be not valid_!),
297 * false on error (lost connection, bad data, ...)
298 */
299 virtual bool NextFrame(CamData& data) = 0;
300
301 protected:
302 CamStreamParams params_; //!< Parameters
303};
304
305/**
306 * @brief Pointer to a CamStream instance, see CreateCamStream()
307 */
308using CamStreamPtr = std::unique_ptr<CamStream>;
309
310/**
311 * @brief Create a camera stream instance
312 *
313 * @param[in] params The parameters
314 *
315 * @returns the video frame decoder instances, or nullptr if it failed (bad params)
316 */
318
319/* ****************************************************************************************************************** */
320} // namespace cam
321} // namespace common
322} // namespace fpsdk
323#endif // __FPSDK_COMMON_CAM_HPP__
CamStreamParams params_
Parameters.
Definition cam.hpp:302
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:308
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 (typically CamDataFmt::H265).
Definition cam.hpp:90
@ DEPTH_VID
Internal use, ignore.
Definition cam.hpp:95
@ FURES_IMG
Full-res image (typically CamDataFmt::NV12, for some cameras/sensors only, not streamable).
Definition cam.hpp:92
@ LORES_IMG
Low-res image (typically CamDataFmt::NV12).
Definition cam.hpp:89
@ DEPTH_IMG
Internal use, ignore.
Definition cam.hpp:94
@ HIRES_IMG
High-res image (typically CamDataFmt::NV12).
Definition cam.hpp:88
@ FURES_VID
Full-res video (typically CamDataFmt::H265, for some cameras/sensors only).
Definition cam.hpp:93
@ LORES_VID
Low-res video (typically CamDataFmt::JPEG).
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:133
@ RGB24
Packed RGB 8:8:8, 24bpp.
Definition cam.hpp:143
@ MJPEG
Motion JPEG (image/jpeg).
Definition cam.hpp:138
@ NV12
Planar YUV 4:2:0, 12bpp.
Definition cam.hpp:142
@ H264_NAL
H.264 NAL (AVC) (video/avc).
Definition cam.hpp:136
@ JPEG
JPEG (image/jpeg).
Definition cam.hpp:140
@ H265_NAL
H.265 NAL (HEVC) (video/hevc).
Definition cam.hpp:137
@ Y8
Planar Y (greyscale), 8bpp.
Definition cam.hpp:141
CamDataFrm CamDataFrmFromStrOr(const char *str, const CamDataFrm def)
Convert camera data frame type string to enum.
CamDataFrm
Camera frame type.
Definition cam.hpp:181
@ OTHER
Other frame type (unexpected).
Definition cam.hpp:186
@ UNSPECIFIED
Unspecified, invalid data.
Definition cam.hpp:182
@ I_FRAME
I-frame (= Horizon camsys MC_H26[45]_NALU_TYPE_I).
Definition cam.hpp:183
@ FULL
Full frame (non-encoded, e.g. NV12 or JPEG).
Definition cam.hpp:185
@ P_FRAME
P-frame (= Horizon camsys MC_H26[45]_NALU_TYPE_P).
Definition cam.hpp:184
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:224
uint64_t ts_
Camera image time (middle of exposure) [CLOCK_REALTIME ns] (0 = invalid).
Definition cam.hpp:232
CamId cam_id_
= meta_.cam_id_ as enum (if value in range)
Definition cam.hpp:227
uint32_t dt_
Exposure time (duration) [ns] (0 = not available).
Definition cam.hpp:233
CamDataFmt fmt_
= meta_.fmt_ as enum (if value in range)
Definition cam.hpp:229
uint64_t seq_
Sequence number.
Definition cam.hpp:231
CamDataType type_
= meta_.type_ as enum (if value in range)
Definition cam.hpp:228
bool valid_
Data valid, successfully extracted from message.
Definition cam.hpp:226
uint32_t height_
Height of the fram [px].
Definition cam.hpp:235
std::vector< uint8_t > data_
Image/frame data, contents depends on fmt_ etc.
Definition cam.hpp:236
uint32_t width_
Width of the frame [px].
Definition cam.hpp:234
CamDataFrm frm_
= meta_.frm_ as enum (if value in range)
Definition cam.hpp:230
Camera stream parameters.
Definition cam.hpp:246
int rate_
Rate (1 = every frame, 2 = every 2nd frame, ...), not for video streams.
Definition cam.hpp:251
std::string host_
Host name or IP address.
Definition cam.hpp:248
CamDataType type_
Camera data type.
Definition cam.hpp:250
static constexpr int RATE_MAX
Max rate_.
Definition cam.hpp:253
static constexpr int RATE_MIN
Min rate_.
Definition cam.hpp:252
std::string name_
Name (for debug logging).
Definition cam.hpp:247
time::Duration timeout_
Timeout receiving data (> 0.1s).
Definition cam.hpp:254
Fixposition SDK: Time utilities.