Update SDK version to v2.4.1

This commit is contained in:
jj
2025-05-19 10:32:44 +08:00
parent 5bd616cb90
commit 8ee93124f9
44 changed files with 2197 additions and 1122 deletions
@@ -20,4 +20,4 @@
#include <libobsensor/h/StreamProfile.h> #include <libobsensor/h/StreamProfile.h>
#include <libobsensor/h/Version.h> #include <libobsensor/h/Version.h>
#include <libobsensor/h/TypeHelper.h> #include <libobsensor/h/TypeHelper.h>
#include <libobsensor/h/RecordPlayback.h>
@@ -14,9 +14,8 @@
#include <libobsensor/hpp/Filter.hpp> #include <libobsensor/hpp/Filter.hpp>
#include <libobsensor/hpp/Frame.hpp> #include <libobsensor/hpp/Frame.hpp>
#include <libobsensor/hpp/Pipeline.hpp> #include <libobsensor/hpp/Pipeline.hpp>
// #include <libobsensor/hpp/RecordPlayback.hpp> #include <libobsensor/hpp/RecordPlayback.hpp>
#include <libobsensor/hpp/Sensor.hpp> #include <libobsensor/hpp/Sensor.hpp>
#include <libobsensor/hpp/StreamProfile.hpp> #include <libobsensor/hpp/StreamProfile.hpp>
#include <libobsensor/hpp/Version.hpp> #include <libobsensor/hpp/Version.hpp>
#include <libobsensor/hpp/TypeHelper.hpp> #include <libobsensor/hpp/TypeHelper.hpp>
@@ -211,12 +211,12 @@ OB_EXPORT bool ob_device_preset_list_has_preset(const ob_device_preset_list *pre
* @return bool Returns true if the device supports the frame interleave feature. * @return bool Returns true if the device supports the frame interleave feature.
*/ */
OB_EXPORT bool ob_device_is_frame_interleave_supported(const ob_device *device, ob_error **error); OB_EXPORT bool ob_device_is_frame_interleave_supported(const ob_device *device, ob_error **error);
/** /**
* *
* @brief load the frame interleave mode according to frame interleavee name. * @brief load the frame interleave mode according to frame interleavee name.
* *
* @param device The device object. * @param device The device object.
* @param interleave_ae_name The name should be one of the frame interleave names returned by @ref ob_device_get_available_frame_interleave_list. * @param frame_interleave_name The name should be one of the frame interleave names returned by @ref ob_device_get_available_frame_interleave_list.
* @param error Log error messages. * @param error Log error messages.
*/ */
OB_EXPORT void ob_device_load_frame_interleave(ob_device *device, const char *frame_interleave_name, ob_error **error); OB_EXPORT void ob_device_load_frame_interleave(ob_device *device, const char *frame_interleave_name, ob_error **error);
@@ -230,11 +230,10 @@ OB_EXPORT void ob_device_load_frame_interleave(ob_device *device, const char *fr
*/ */
OB_EXPORT ob_device_frame_interleave_list *ob_device_get_available_frame_interleave_list(ob_device *device, ob_error **error); OB_EXPORT ob_device_frame_interleave_list *ob_device_get_available_frame_interleave_list(ob_device *device, ob_error **error);
/** /**
* @brief Delete the available frame interleave list. * @brief Delete the available frame interleave list.
* *
* @param interleave_ae_list The available frame interleave list. * @param frame_interleave_list The available frame interleave list.
* @param error Log error messages. * @param error Log error messages.
*/ */
OB_EXPORT void ob_delete_frame_interleave_list(ob_device_frame_interleave_list *frame_interleave_list, ob_error **error); OB_EXPORT void ob_delete_frame_interleave_list(ob_device_frame_interleave_list *frame_interleave_list, ob_error **error);
@@ -242,7 +241,7 @@ OB_EXPORT void ob_delete_frame_interleave_list(ob_device_frame_interleave_list *
/** /**
* @brief Get the number of frame interleave in the frame interleave list. * @brief Get the number of frame interleave in the frame interleave list.
* *
* @param interleave_ae_list The available frame interleave list. * @param frame_interleave_list The available frame interleave list.
* @param error Log error messages. * @param error Log error messages.
* @return The number of frame interleave in the frame interleave list. * @return The number of frame interleave in the frame interleave list.
*/ */
@@ -251,7 +250,7 @@ OB_EXPORT uint32_t ob_device_frame_interleave_list_get_count(ob_device_frame_int
/** /**
* @brief Get the name of frame interleave in the frame interleave list. * @brief Get the name of frame interleave in the frame interleave list.
* *
* @param interleave_ae_list The available frame interleave list. * @param frame_interleave_list The available frame interleave list.
* @param index The index of frame interleave in the frame interleave list. * @param index The index of frame interleave in the frame interleave list.
* @param error Log error messages. * @param error Log error messages.
* @return The name of frame interleave in the frame interleave list.. * @return The name of frame interleave in the frame interleave list..
@@ -261,8 +260,8 @@ OB_EXPORT const char *ob_device_frame_interleave_list_get_name(ob_device_frame_i
/** /**
* @brief Check if the interleave ae list has the interleave ae. * @brief Check if the interleave ae list has the interleave ae.
* *
* @param interleave_ae_list The available interleave ae list. * @param frame_interleave_list The available interleave ae list.
* @param interleave_ae_name The name of the interleave ae. * @param frame_interleave_name The name of the interleave ae.
* @param error Log error messages. * @param error Log error messages.
* @return Whether the interleave ae list has the interleave ae. If true, the interleave ae list has the interleave ae. If false, the interleave ae list does * @return Whether the interleave ae list has the interleave ae. If true, the interleave ae list has the interleave ae. If false, the interleave ae list does
* not have the interleave ae. * not have the interleave ae.
@@ -104,7 +104,7 @@ OB_EXPORT void ob_enable_device_clock_sync(ob_context *context, uint64_t repeat_
OB_EXPORT void ob_free_idle_memory(ob_context *context, ob_error **error); OB_EXPORT void ob_free_idle_memory(ob_context *context, ob_error **error);
/** /**
* @brief For linux, there are two ways to enable the UVC backend: libuvc and libusb. This function is used to set the backend type. * @brief For linux, there are two ways to enable the UVC backend: libuvc and v4l2. This function is used to set the backend type.
* @brief It is effective when the new device is created. * @brief It is effective when the new device is created.
* *
* @attention This interface is only available for Linux. * @attention This interface is only available for Linux.
@@ -155,7 +155,7 @@ OB_EXPORT void ob_set_logger_to_console(ob_log_severity severity, ob_error **err
/** /**
* @brief Set the extensions directory * @brief Set the extensions directory
* @brief The extensions directory is used to search for dynamic libraries that provide additional functionality to the SDK, such as the Frame filters. * @brief The extensions directory is used to search for dynamic libraries that provide additional functionality to the SDK, such as the Frame filters.
* *
* @attention Should be called before creating the context and pipeline, otherwise the default extensions directory (./extensions) will be used. * @attention Should be called before creating the context and pipeline, otherwise the default extensions directory (./extensions) will be used.
* *
@@ -166,6 +166,26 @@ OB_EXPORT void ob_device_get_structured_data(ob_device *device, ob_property_id p
*/ */
OB_EXPORT void ob_device_get_raw_data(ob_device *device, ob_property_id property_id, ob_get_data_callback cb, void *user_data, ob_error **error); OB_EXPORT void ob_device_get_raw_data(ob_device *device, ob_property_id property_id, ob_get_data_callback cb, void *user_data, ob_error **error);
/**
* @brief Set customer data.
*
* @param[in] device The device object.
* @param[in] data The property data to be set.
* @param[in] data_size The size of the property to be set,the maximum length cannot exceed 65532 bytes.
* @param[out] error Log error messages.
*/
OB_EXPORT void ob_device_write_customer_data(ob_device *device, const void *data, uint32_t data_size, ob_error **error);
/**
* @brief Get customer data of a device property.
*
* @param[in] device The device object.
* @param[out] data The obtained property data.
* @param[out] data_size The size of the obtained property data.
* @param[out] error Log error messages.
*/
OB_EXPORT void ob_device_read_customer_data(ob_device *device, void *data, uint32_t *data_size, ob_error **error);
/** /**
* @brief Get the number of properties supported by the device. * @brief Get the number of properties supported by the device.
* *
@@ -305,9 +325,8 @@ OB_EXPORT void ob_device_enable_heartbeat(ob_device *device, bool enable, ob_err
* @param[in] send_data The data to be sent to the device. * @param[in] send_data The data to be sent to the device.
* @param[in] send_data_size The size of the data to be sent to the device. * @param[in] send_data_size The size of the data to be sent to the device.
* @param[out] receive_data The data received from the device. * @param[out] receive_data The data received from the device.
* @param[in, out] receive_data_size Pass in the expected size of the receive data, and return the actual size of the received data. * @param[in,out] receive_data_size Pass in the expected size of the receive data, and return the actual size of the received data.
* @param error Pointer to an error object that will be set if an error occurs. * @param error Pointer to an error object that will be set if an error occurs.
* @return OB_EXPORT
*/ */
OB_EXPORT void ob_device_send_and_receive_data(ob_device *device, const uint8_t *send_data, uint32_t send_data_size, uint8_t *receive_data, OB_EXPORT void ob_device_send_and_receive_data(ob_device *device, const uint8_t *send_data, uint32_t send_data_size, uint8_t *receive_data,
uint32_t *receive_data_size, ob_error **error); uint32_t *receive_data_size, ob_error **error);
@@ -388,7 +407,7 @@ OB_EXPORT const char *ob_device_info_get_firmware_version(const ob_device_info *
* *
* @param[in] info Device Information * @param[in] info Device Information
* @param[out] error Pointer to an error object that will be set if an error occurs. * @param[out] error Pointer to an error object that will be set if an error occurs.
* @return const char* The connection type,currently supports:"USB", "USB1.0", "USB1.1", "USB2.0", "USB2.1", "USB3.0", "USB3.1", "USB3.2", "Ethernet" * @return const char* The connection type, currently supports: "USB", "USB1.0", "USB1.1", "USB2.0", "USB2.1", "USB3.0", "USB3.1", "USB3.2", "Ethernet"
*/ */
OB_EXPORT const char *ob_device_info_get_connection_type(const ob_device_info *info, ob_error **error); OB_EXPORT const char *ob_device_info_get_connection_type(const ob_device_info *info, ob_error **error);
@@ -399,7 +418,7 @@ OB_EXPORT const char *ob_device_info_get_connection_type(const ob_device_info *i
* *
* @param info Device Information * @param info Device Information
* @param error Pointer to an error object that will be set if an error occurs. * @param error Pointer to an error object that will be set if an error occurs.
* @return const char* The IP address,such as "192.168.1.10" * @return const char* The IP address, such as "192.168.1.10"
*/ */
OB_EXPORT const char *ob_device_info_get_ip_address(const ob_device_info *info, ob_error **error); OB_EXPORT const char *ob_device_info_get_ip_address(const ob_device_info *info, ob_error **error);
@@ -533,7 +552,7 @@ OB_EXPORT const char *ob_device_list_get_device_serial_number(const ob_device_li
* @param[in] list Device list object * @param[in] list Device list object
* @param[in] index Device index * @param[in] index Device index
* @param[out] error Pointer to an error object that will be set if an error occurs. * @param[out] error Pointer to an error object that will be set if an error occurs.
* @return const char* returns the device connection type,currently supports:"USB", "USB1.0", "USB1.1", "USB2.0", "USB2.1", "USB3.0", "USB3.1", "USB3.2", * @return const char* returns the device connection type, currently supports: "USB", "USB1.0", "USB1.1", "USB2.0", "USB2.1", "USB3.0", "USB3.1", "USB3.2",
* "Ethernet" * "Ethernet"
*/ */
OB_EXPORT const char *ob_device_list_get_device_connection_type(const ob_device_list *list, uint32_t index, ob_error **error); OB_EXPORT const char *ob_device_list_get_device_connection_type(const ob_device_list *list, uint32_t index, ob_error **error);
@@ -546,10 +565,22 @@ OB_EXPORT const char *ob_device_list_get_device_connection_type(const ob_device_
* @param list Device list object * @param list Device list object
* @param index Device index * @param index Device index
* @param error Pointer to an error object that will be set if an error occurs. * @param error Pointer to an error object that will be set if an error occurs.
* @return const char* returns the device ip address,such as "192.168.1.10" * @return const char* returns the device ip address, such as "192.168.1.10"
*/ */
OB_EXPORT const char *ob_device_list_get_device_ip_address(const ob_device_list *list, uint32_t index, ob_error **error); OB_EXPORT const char *ob_device_list_get_device_ip_address(const ob_device_list *list, uint32_t index, ob_error **error);
/**
* @brief Get device local mac address
*
* @attention Only valid for network devices, otherwise it will return "0:0:0:0:0:0".
*
* @param list Device list object
* @param index Device index
* @param error Pointer to an error object that will be set if an error occurs.
* @return const char* returns the device mac address
*/
OB_EXPORT const char *ob_device_list_get_device_local_mac(const ob_device_list *list, uint32_t index, ob_error **error);
/** /**
* @brief Create a device. * @brief Create a device.
* *
@@ -580,7 +611,7 @@ OB_EXPORT ob_device *ob_device_list_get_device_by_serial_number(const ob_device_
* @brief On Linux platform, for usb device, the uid of the device is composed of bus-port-dev, for example 1-1.2-1. But the SDK will remove the dev number and * @brief On Linux platform, for usb device, the uid of the device is composed of bus-port-dev, for example 1-1.2-1. But the SDK will remove the dev number and
* only keep the bus-port as the uid to create the device, for example 1-1.2, so that we can create a device connected to the specified USB port. Similarly, * only keep the bus-port as the uid to create the device, for example 1-1.2, so that we can create a device connected to the specified USB port. Similarly,
* users can also directly pass in bus-port as uid to create device. * users can also directly pass in bus-port as uid to create device.
* @brief For GMSL device,the uid is GMSL port with “gmsl2-” prefix, for example gmsl2-1. * @brief For GMSL device, the uid is GMSL port with "gmsl2-" prefix, for example gmsl2-1.
* *
* @attention If the device has already been acquired and created elsewhere, repeated acquisitions will return an error. * @attention If the device has already been acquired and created elsewhere, repeated acquisitions will return an error.
* *
@@ -68,7 +68,7 @@ OB_EXPORT ob_exception_type ob_error_get_exception_type(const ob_error *error);
/** /**
* @brief Delete the error object. * @brief Delete the error object.
* *
* @param[in] error The error object to delete. * @param[in] error The error object to delete, you should set the pointer to NULL after calling this function.
*/ */
OB_EXPORT void ob_delete_error(ob_error *error); OB_EXPORT void ob_delete_error(ob_error *error);
@@ -62,7 +62,7 @@ OB_EXPORT ob_frame *ob_create_frame_from_stream_profile(const ob_stream_profile
* no longer needed. * no longer needed.
* *
* @param[in] frame_type Frame object type. * @param[in] frame_type Frame object type.
* @param[in] frame_format Frame object format. * @param[in] format Frame object format.
* @param[in] width Frame object width. * @param[in] width Frame object width.
* @param[in] height Frame object height. * @param[in] height Frame object height.
* @param[in] stride_bytes Row span in bytes. If 0, the stride is calculated based on the width and format. * @param[in] stride_bytes Row span in bytes. If 0, the stride is calculated based on the width and format.
@@ -148,7 +148,7 @@ OB_EXPORT void ob_delete_frame(const ob_frame *frame, ob_error **error);
/** /**
* @brief Copy the information of the source frame object to the destination frame object. * @brief Copy the information of the source frame object to the destination frame object.
* @brief Including the index,timestamp,system timestamp,global timestamp and metadata will be copied. * @brief Including the index, timestamp, system timestamp, global timestamp and metadata will be copied.
* *
* @param[in] src_frame Source frame object to copy the information from. * @param[in] src_frame Source frame object to copy the information from.
* @param[in] dst_frame Destination frame object to copy the information to. * @param[in] dst_frame Destination frame object to copy the information to.
@@ -224,7 +224,7 @@ OB_EXPORT void ob_frame_set_system_timestamp_us(ob_frame *frame, uint64_t system
/** /**
* @brief Get the global timestamp of the frame in microseconds. * @brief Get the global timestamp of the frame in microseconds.
* @brief The global timestamp is the time point when the frame was was captured by the device, and has been converted to the host clock domain. The * @brief The global timestamp is the time point when the frame was captured by the device, and has been converted to the host clock domain. The
* conversion process base on the frame timestamp and can eliminate the timer drift of the device * conversion process base on the frame timestamp and can eliminate the timer drift of the device
* *
* @attention The global timestamp is disabled by default. If global timestamp is not enabled, the function will return 0. To enable it, call @ref * @attention The global timestamp is disabled by default. If global timestamp is not enabled, the function will return 0. To enable it, call @ref
@@ -603,6 +603,24 @@ OB_EXPORT ob_frame *ob_frameset_get_frame_by_index(const ob_frame *frameset, uin
*/ */
OB_EXPORT void ob_frameset_push_frame(ob_frame *frameset, const ob_frame *frame, ob_error **error); OB_EXPORT void ob_frameset_push_frame(ob_frame *frameset, const ob_frame *frame, ob_error **error);
/**
* @brief Get point cloud frame width
*
* @param[in] frame point cloud Frame object
* @param[out] error Pointer to an error object that will be set if an error occurs.
* @return uint32_t return the point cloud frame width
*/
OB_EXPORT uint32_t ob_point_cloud_frame_get_width(const ob_frame *frame, ob_error **error);
/**
* @brief Get point cloud frame height
*
* @param[in] frame point cloud Frame object
* @param[out] error Pointer to an error object that will be set if an error occurs.
* @return uint32_t return the point cloud frame height
*/
OB_EXPORT uint32_t ob_point_cloud_frame_get_height(const ob_frame *frame, ob_error **error);
// The following interfaces are deprecated and are retained here for compatibility purposes. // The following interfaces are deprecated and are retained here for compatibility purposes.
#define ob_frame_index ob_frame_get_index #define ob_frame_index ob_frame_get_index
#define ob_frame_format ob_frame_get_format #define ob_frame_format ob_frame_get_format
@@ -62,7 +62,7 @@ OB_EXPORT ob_multi_device_sync_config ob_device_get_multi_device_sync_config(con
* *
* @attention The frequency of the user call this function multiplied by the number of frames per trigger should be less than the frame rate of the stream. The * @attention The frequency of the user call this function multiplied by the number of frames per trigger should be less than the frame rate of the stream. The
* number of frames per trigger can be set by @ref framesPerTrigger. * number of frames per trigger can be set by @ref framesPerTrigger.
* @attention For some models,receive and execute the capture command will have a certain delay and performance consumption, so the frequency of calling this * @attention For some models, receive and execute the capture command will have a certain delay and performance consumption, so the frequency of calling this
* function should not be too high, please refer to the product manual for the specific supported frequency. * function should not be too high, please refer to the product manual for the specific supported frequency.
* @attention If the device is not in the @ref OB_MULTI_DEVICE_SYNC_MODE_HARDWARE_TRIGGERING mode, device will ignore the capture command. * @attention If the device is not in the @ref OB_MULTI_DEVICE_SYNC_MODE_HARDWARE_TRIGGERING mode, device will ignore the capture command.
* *
@@ -10,19 +10,21 @@
#include "Export.h" #include "Export.h"
#include <stdbool.h>
#include <stdint.h>
#pragma pack(push, 1) // struct 1-byte align #pragma pack(push, 1) // struct 1-byte align
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include <stdbool.h>
#include <stdint.h>
typedef struct ob_context_t ob_context; typedef struct ob_context_t ob_context;
typedef struct ob_device_t ob_device; typedef struct ob_device_t ob_device;
typedef struct ob_device_info_t ob_device_info; typedef struct ob_device_info_t ob_device_info;
typedef struct ob_device_list_t ob_device_list; typedef struct ob_device_list_t ob_device_list;
typedef struct ob_record_device_t ob_record_device;
typedef struct ob_playback_device_t ob_playback_device;
typedef struct ob_camera_param_list_t ob_camera_param_list; typedef struct ob_camera_param_list_t ob_camera_param_list;
typedef struct ob_sensor_t ob_sensor; typedef struct ob_sensor_t ob_sensor;
typedef struct ob_sensor_list_t ob_sensor_list; typedef struct ob_sensor_list_t ob_sensor_list;
@@ -183,6 +185,7 @@ typedef enum {
OB_PIXEL_DEPTH = 0, // Depth pixel type, the value of the pixel is the distance from the camera to the object OB_PIXEL_DEPTH = 0, // Depth pixel type, the value of the pixel is the distance from the camera to the object
OB_PIXEL_DISPARITY = 2, // Disparity for structured light camera OB_PIXEL_DISPARITY = 2, // Disparity for structured light camera
OB_PIXEL_RAW_PHASE = 3, // Raw phase for tof camera OB_PIXEL_RAW_PHASE = 3, // Raw phase for tof camera
OB_PIXEL_TOF_DEPTH = 4, // Depth for tof camera
} OBPixelType, } OBPixelType,
ob_pixel_type; ob_pixel_type;
@@ -190,7 +193,7 @@ typedef enum {
* @brief Enumeration value describing the pixel format * @brief Enumeration value describing the pixel format
*/ */
typedef enum { typedef enum {
OB_FORMAT_UNKNOWN = -1, /*< unknown format */ OB_FORMAT_UNKNOWN = -1, /**< unknown format */
OB_FORMAT_YUYV = 0, /**< YUYV format */ OB_FORMAT_YUYV = 0, /**< YUYV format */
OB_FORMAT_YUY2 = 1, /**< YUY2 format (the actual format is the same as YUYV) */ OB_FORMAT_YUY2 = 1, /**< YUY2 format (the actual format is the same as YUYV) */
OB_FORMAT_UYVY = 2, /**< UYVY format */ OB_FORMAT_UYVY = 2, /**< UYVY format */
@@ -495,6 +498,15 @@ typedef enum {
} OBAlignMode, } OBAlignMode,
ob_align_mode; ob_align_mode;
/**
* @brief Camera performance mode
*/
typedef enum {
ADAPTIVE_PERFORMANCE_MODE, /**< Camera adaptive mode */
HIGH_PERFORMANCE_MODE, /**< High Performance Mode */
} OBCameraPerformanceMode,
ob_camera_performance_mode;
/** /**
* @brief Rectangle * @brief Rectangle
*/ */
@@ -527,6 +539,10 @@ typedef enum {
FORMAT_YUYV_TO_BGRA, /**< YUYV to BGRA */ FORMAT_YUYV_TO_BGRA, /**< YUYV to BGRA */
FORMAT_YUYV_TO_Y16, /**< YUYV to Y16 */ FORMAT_YUYV_TO_Y16, /**< YUYV to Y16 */
FORMAT_YUYV_TO_Y8, /**< YUYV to Y8 */ FORMAT_YUYV_TO_Y8, /**< YUYV to Y8 */
FORMAT_RGBA_TO_RGB, /**< RGBA to RGB */
FORMAT_BGRA_TO_BGR, /**< BGRA to BGR */
FORMAT_Y16_TO_RGB, /**< Y16 to RGB */
FORMAT_Y8_TO_RGB, /**< Y8 to RGB */
} OBConvertFormat, } OBConvertFormat,
ob_convert_format; ob_convert_format;
@@ -714,14 +730,14 @@ typedef struct {
double zpps; // zpps=z0/fx double zpps; // zpps=z0/fx
float baseline; // baseline length, for monocular camera,it means the distance of laser to the center of IR-CMOS float baseline; // baseline length, for monocular camera,it means the distance of laser to the center of IR-CMOS
double fx; // focus double fx; // focus
uint8_t bitSize; // disparity bit size(raw disp bit size,for example: MX6000 is 12, MX6600 is 14) uint8_t bitSize; // disparity bit size (raw disp bit size, for example: MX6000 is 12, MX6600 is 14)
float unit; // reference units:unit=10 denote 1cm; unit=1 denote 1mm; unit=0.5 denote 0.5mm; and so on float unit; // reference units: unit=10 denote 1cm; unit=1 denote 1mm; unit=0.5 denote 0.5mm; and so on
float minDisparity; // dual disparity coefficient float minDisparity; // dual disparity coefficient
uint8_t packMode; // data pack mode uint8_t packMode; // data pack mode
float dispOffset; // disparity offset,actual disp=chip disp + disp_offset float dispOffset; // disparity offset, actual disp=chip disp + disp_offset
int32_t invalidDisp; // invalid disparity,usually is 0,dual IR add a auxiliary value. int32_t invalidDisp; // invalid disparity, usually is 0, dual IR add a auxiliary value.
int32_t dispIntPlace; // disp integer digits,default is 8,Gemini2 XL is 10 int32_t dispIntPlace; // disp integer digits, default is 8, Gemini2 XL is 10
uint8_t isDualCamera; // 0 monocular camera,1 dual camera uint8_t isDualCamera; // 0 monocular camera, 1 dual camera
} OBDisparityParam, ob_disparity_param; } OBDisparityParam, ob_disparity_param;
/** /**
@@ -826,7 +842,7 @@ typedef enum {
/** /**
* @brief Secondary synchronize mode * @brief Secondary synchronize mode
* @brief Secondary device. Both process input trigger signal and output trigger signal to other devices. * @brief Secondary device. Both process input trigger signal and output trigger signal to other devices.
* @brief Different sensors in a single devices receive trigger signals respectively:ext trigger -> RGB && ext trigger -> IR/Depth/TOF * @brief Different sensors in a single devices receive trigger signals respectively: ext trigger -> RGB && ext trigger -> IR/Depth/TOF
* *
* @attention With the current Gemini 2 device set to this mode, each Sensor receives the first external trigger signal * @attention With the current Gemini 2 device set to this mode, each Sensor receives the first external trigger signal
* after the stream is turned on and starts timing self-triggering at the set frame rate until the stream is turned off * after the stream is turned on and starts timing self-triggering at the set frame rate until the stream is turned off
@@ -860,7 +876,7 @@ typedef enum {
* @brief Software trigger synchronize mode as secondary device * @brief Software trigger synchronize mode as secondary device
* @brief The slave receives the external trigger signal (the external trigger signal comes from the soft trigger host) and outputs the trigger signal to * @brief The slave receives the external trigger signal (the external trigger signal comes from the soft trigger host) and outputs the trigger signal to
* the external relay. * the external relay.
* @brief Different sensors in a single machine receive trigger signals respectively:ext trigger -> RGB && ext trigger -> IR/Depth/TOF * @brief Different sensors in a single machine receive trigger signals respectively: ext trigger -> RGB && ext trigger -> IR/Depth/TOF
*/ */
OB_SYNC_MODE_SECONDARY_SOFT_TRIGGER = 0x07, OB_SYNC_MODE_SECONDARY_SOFT_TRIGGER = 0x07,
@@ -1295,14 +1311,14 @@ typedef struct {
/** /**
* @brief The delay time of the depth image capture after receiving the capture command or trigger signal in microseconds. * @brief The delay time of the depth image capture after receiving the capture command or trigger signal in microseconds.
* *
* @attention This parameter is only valid for some models, please refer to the product manual for details. * @attention This parameter is only valid for some models, please refer to the product manual for details.
*/ */
int depthDelayUs; int depthDelayUs;
/** /**
* @brief The delay time of the color image capture after receiving the capture command or trigger signal in microseconds. * @brief The delay time of the color image capture after receiving the capture command or trigger signal in microseconds.
* *
* @attention This parameter is only valid for some models, please refer to the product manual for details. * @attention This parameter is only valid for some models, please refer to the product manual for details.
*/ */
int colorDelayUs; int colorDelayUs;
@@ -1548,14 +1564,14 @@ typedef enum {
/** /**
* @brief Power line frequency * @brief Power line frequency
* @brief For anti-flickering, 0:Close, 1: 50Hz, 2: 60Hz, 3: Auto * @brief For anti-flickering, 0: Close, 1: 50Hz, 2: 60Hz, 3: Auto
*/ */
OB_FRAME_METADATA_TYPE_POWER_LINE_FREQUENCY = 15, OB_FRAME_METADATA_TYPE_POWER_LINE_FREQUENCY = 15,
/** /**
* @brief Low light compensation * @brief Low light compensation
* *
* @attention The low light compensation is a feature inside the device,and can not manually control it. * @attention The low light compensation is a feature inside the device, and can not manually control it.
*/ */
OB_FRAME_METADATA_TYPE_LOW_LIGHT_COMPENSATION = 16, OB_FRAME_METADATA_TYPE_LOW_LIGHT_COMPENSATION = 16,
@@ -1678,9 +1694,26 @@ typedef enum {
* *
*/ */
OB_UVC_BACKEND_TYPE_V4L2, OB_UVC_BACKEND_TYPE_V4L2,
/**
* @brief Use MSMF backend to access the UVC device
*/
OB_UVC_BACKEND_TYPE_MSMF,
} ob_uvc_backend_type, } ob_uvc_backend_type,
OBUvcBackendType; OBUvcBackendType;
/**
* @brief The playback status of the media
*/
typedef enum {
OB_PLAYBACK_UNKNOWN,
OB_PLAYBACK_PLAYING, /**< The media is playing */
OB_PLAYBACK_PAUSED, /**< The media is paused */
OB_PLAYBACK_STOPPED, /**< The media is stopped */
OB_PLAYBACK_COUNT,
} ob_playback_status,
OBPlaybackStatus;
// For compatibility // For compatibility
#define OB_FRAME_METADATA_TYPE_LASER_POWER_MODE OB_FRAME_METADATA_TYPE_LASER_POWER_LEVEL #define OB_FRAME_METADATA_TYPE_LASER_POWER_MODE OB_FRAME_METADATA_TYPE_LASER_POWER_LEVEL
#define OB_FRAME_METADATA_TYPE_EMITTER_MODE OB_FRAME_METADATA_TYPE_LASER_STATUS #define OB_FRAME_METADATA_TYPE_EMITTER_MODE OB_FRAME_METADATA_TYPE_LASER_STATUS
@@ -1787,6 +1820,7 @@ typedef void(ob_frame_destroy_callback)(uint8_t *buffer, void *user_data);
*/ */
typedef void(ob_log_callback)(ob_log_severity severity, const char *message, void *user_data); typedef void(ob_log_callback)(ob_log_severity severity, const char *message, void *user_data);
typedef void (*ob_playback_status_changed_callback)(ob_playback_status status, void *user_data);
/** /**
* @brief Check if the sensor_type is a video sensor * @brief Check if the sensor_type is a video sensor
* *
@@ -205,13 +205,13 @@ OB_EXPORT void ob_config_enable_stream_with_stream_profile(ob_config *config, co
* *
* @attention The stream_type should be a video stream type, such as OB_STREAM_IR, OB_STREAM_COLOR, OB_STREAM_DEPTH, etc. * @attention The stream_type should be a video stream type, such as OB_STREAM_IR, OB_STREAM_COLOR, OB_STREAM_DEPTH, etc.
* *
* @param config[in] The pipeline configuration object * @param[in] config The pipeline configuration object
* @param stream_type[in] The type of the stream to be enabled * @param[in] stream_type The type of the stream to be enabled
* @param width[in] The width of the video stream * @param[in] width The width of the video stream
* @param height[in] The height of the video stream * @param[in] height The height of the video stream
* @param fps[in] The frame rate of the video stream * @param[in] fps The frame rate of the video stream
* @param format[in] The format of the video stream * @param[in] format The format of the video stream
* @param error[out] Pointer to an error object that will be set if an error occurs. * @param[out] error Pointer to an error object that will be set if an error occurs.
*/ */
OB_EXPORT void ob_config_enable_video_stream(ob_config *config, ob_stream_type stream_type, uint32_t width, uint32_t height, uint32_t fps, ob_format format, OB_EXPORT void ob_config_enable_video_stream(ob_config *config, ob_stream_type stream_type, uint32_t width, uint32_t height, uint32_t fps, ob_format format,
ob_error **error); ob_error **error);
@@ -219,20 +219,20 @@ OB_EXPORT void ob_config_enable_video_stream(ob_config *config, ob_stream_type s
/** /**
* @brief Enable accelerometer stream with specified parameters * @brief Enable accelerometer stream with specified parameters
* *
* @param config[in] The pipeline configuration object * @param[in] config The pipeline configuration object
* @param full_scale_range[in] The full scale range of the accelerometer * @param[in] full_scale_range The full scale range of the accelerometer
* @param sample_rate[in] The sample rate of the accelerometer * @param[in] sample_rate The sample rate of the accelerometer
* @param error[out] Pointer to an error object that will be set if an error occurs. * @param[out] error Pointer to an error object that will be set if an error occurs.
*/ */
OB_EXPORT void ob_config_enable_accel_stream(ob_config *config, ob_accel_full_scale_range full_scale_range, ob_accel_sample_rate sample_rate, ob_error **error); OB_EXPORT void ob_config_enable_accel_stream(ob_config *config, ob_accel_full_scale_range full_scale_range, ob_accel_sample_rate sample_rate, ob_error **error);
/** /**
* @brief Enable gyroscope stream with specified parameters * @brief Enable gyroscope stream with specified parameters
* *
* @param config[in] The pipeline configuration object * @param[in] config The pipeline configuration object
* @param full_scale_range[in] The full scale range of the gyroscope * @param[in] full_scale_range The full scale range of the gyroscope
* @param sample_rate[in] The sample rate of the gyroscope * @param[in] sample_rate The sample rate of the gyroscope
* @param error[out] Pointer to an error object that will be set if an error occurs. * @param[out] error Pointer to an error object that will be set if an error occurs.
*/ */
OB_EXPORT void ob_config_enable_gyro_stream(ob_config *config, ob_gyro_full_scale_range full_scale_range, ob_gyro_sample_rate sample_rate, ob_error **error); OB_EXPORT void ob_config_enable_gyro_stream(ob_config *config, ob_gyro_full_scale_range full_scale_range, ob_gyro_sample_rate sample_rate, ob_error **error);
@@ -306,7 +306,7 @@ typedef enum {
OB_PROP_DEPTH_ROTATE_INT = 118, OB_PROP_DEPTH_ROTATE_INT = 118,
/** /**
* @brief Get hardware laser power actual level which real state of laser element. OB_PROP_LASER_POWER_LEVEL_CONTROL_INT99)will effect this command * @brief Get hardware laser power actual level which real state of laser element. OB_PROP_LASER_POWER_LEVEL_CONTROL_INT99 will effect this command
* which it setting and changed the hardware laser energy level. * which it setting and changed the hardware laser energy level.
*/ */
OB_PROP_LASER_POWER_ACTUAL_LEVEL_INT = 119, OB_PROP_LASER_POWER_ACTUAL_LEVEL_INT = 119,
@@ -501,6 +501,20 @@ typedef enum {
* @brief hardware noise remove filter threshold ,range [0.0 - 1.0] * @brief hardware noise remove filter threshold ,range [0.0 - 1.0]
*/ */
OB_PROP_HW_NOISE_REMOVE_FILTER_THRESHOLD_FLOAT = 212, OB_PROP_HW_NOISE_REMOVE_FILTER_THRESHOLD_FLOAT = 212,
/**
* @brief soft trigger auto capture enable, use in OB_MULTI_DEVICE_SYNC_MODE_SOFTWARE_TRIGGERING mode
*/
OB_DEVICE_AUTO_CAPTURE_ENABLE_BOOL = 216,
/**
* @brief soft trigger auto capture interval time, use in OB_MULTI_DEVICE_SYNC_MODE_SOFTWARE_TRIGGERING mode
*/
OB_DEVICE_AUTO_CAPTURE_INTERVAL_TIME_INT = 217,
/**
* @brief PTP time synchronization enable
*/
OB_DEVICE_PTP_CLOCK_SYNC_ENABLE_BOOL = 223,
/** /**
* @brief Baseline calibration parameters * @brief Baseline calibration parameters
*/ */
@@ -553,7 +567,7 @@ typedef enum {
/** /**
* @brief Device network static ip config record * @brief Device network static ip config record
* @brief Using for get last static ip config,witch is record in device flash when user set static ip config * @brief Using for get last static ip config, witch is record in device flash when user set static ip config
* *
* @attention read only * @attention read only
*/ */
@@ -800,10 +814,20 @@ typedef enum {
*/ */
OB_PROP_NETWORK_BANDWIDTH_TYPE_INT = 3027, OB_PROP_NETWORK_BANDWIDTH_TYPE_INT = 3027,
/**
* @brief Switch device performance mode, currently available in Adaptive Mode and High Performance Mode, such as G335LE.
*/
OB_PROP_DEVICE_PERFORMANCE_MODE_INT = 3028,
/** /**
* @brief Calibration JSON file read from device (Femto Mega, read only) * @brief Calibration JSON file read from device (Femto Mega, read only)
*/ */
OB_RAW_DATA_CAMERA_CALIB_JSON_FILE = 4029, OB_RAW_DATA_CAMERA_CALIB_JSON_FILE = 4029,
/**
* @brief Confidence degree
*/
OB_PROP_DEBUG_ESGM_CONFIDENCE_FLOAT = 5013,
} OBPropertyID, } OBPropertyID,
ob_property_id; ob_property_id;
@@ -0,0 +1,135 @@
// Copyright (c) Orbbec Inc. All Rights Reserved.
// Licensed under the MIT License.
/**
* @file RecordPlayback.hpp
* @brief Record and playback device-related types, including interfaces to create recording and playback devices,
record and playback streaming data, etc.
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "Device.h"
/**
* @brief Create a recording device for the specified device with a specified file path and compression enabled.
*
* @param[in] device The device to record.
* @param[in] file_path The file path to record to.
* @param[in] compression_enabled Whether to enable compression for the recording.
* @param[out] error Pointer to an error object that will be set if an error occurs.
* @return A pointer to the newly created recording device, or NULL if an error occurred.
*/
OB_EXPORT ob_record_device *ob_create_record_device(ob_device *device, const char *file_path, bool compression_enabled, ob_error **error);
/**
* @brief Delete a recording device.
*
* @param[in] recorder The recording device to delete.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_delete_record_device(ob_record_device *recorder, ob_error **error);
/**
* @brief Pause recording on the specified recording device.
*
* @param[in] recorder The recording device to pause.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_record_device_pause(ob_record_device *recorder, ob_error **error);
/**
* @brief Resume recording on the specified recording device.
*
* @param[in] recorder The recording device to resume.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_record_device_resume(ob_record_device *recorder, ob_error **error);
/**
* @brief Create a playback device for the specified file path.
*
* @param[in] file_path The file path to playback from.
* @param[out] error Pointer to an error object that will be set if an error occurs.
* @return A pointer to the newly created playback device, or NULL if an error occurred.
*/
OB_EXPORT ob_device *ob_create_playback_device(const char *file_path, ob_error **error);
/**
* @brief Pause playback on the specified playback device.
*
* @param[in] player The playback device to pause.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_playback_device_pause(ob_device *player, ob_error **error);
/**
* @brief Resume playback on the specified playback device.
*
* @param[in] player The playback device to resume.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_playback_device_resume(ob_device *player, ob_error **error);
/**
* @brief Set the playback to a specified time point of the played data.
*
* @param[in] player The playback device to set the position for.
* @param[in] timestamp The position to set the playback to, in milliseconds.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_playback_device_seek(ob_device *player, const uint64_t timestamp, ob_error **error);
/**
* @brief Set the playback to a specified time point of the played data.
*
* @param[in] player The playback device to set the position for.
* @param[in] rate The playback rate to set.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_playback_device_set_playback_rate(ob_device *player, const float rate, ob_error **error);
/**
* @brief Get the current playback status of the played data.
*
* @param[in] player The playback device to get the status for.
* @param[out] error Pointer to an error object that will be set if an error occurs.
* @return The current playback status of the played data.
*/
OB_EXPORT ob_playback_status ob_playback_device_get_current_playback_status(ob_device *player, ob_error **error);
/**
* @brief Set a callback function to receive playback status updates.
*
* @param[in] player The playback device to set the callback for.
* @param[in] callback The callback function to receive playback status updates.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_playback_device_set_playback_status_changed_callback(ob_device *player, ob_playback_status_changed_callback callback, void *user_data,
ob_error **error);
/**
* @brief Get the current playback position of the played data.
*
* @param[in] player The playback device to get the position for.
* @param[out] error Pointer to an error object that will be set if an error occurs.
* @return The current playback position of the played data, in milliseconds.
*/
OB_EXPORT uint64_t ob_playback_device_get_position(ob_device *player, ob_error **error);
/**
* @brief Get the duration of the played data.
*
* @param[in] player The playback device to get the duration for.
* @param[out] error Pointer to an error object that will be set if an error occurs.
* @return The duration of the played data, in milliseconds.
*/
OB_EXPORT uint64_t ob_playback_device_get_duration(ob_device *player, ob_error **error);
#ifdef __cplusplus
} // extern "C"
#endif
@@ -134,13 +134,23 @@ OB_EXPORT ob_extrinsic ob_stream_profile_get_extrinsic_to(const ob_stream_profil
/** /**
* @brief Set the extrinsic for source stream to target stream * @brief Set the extrinsic for source stream to target stream
* *
* @param[in] profile Stream profile object * @param[in] source Stream profile object
* @param[in] target Target stream type * @param[in] target Target stream type
* @param[in] extrinsic The extrinsic * @param[in] extrinsic The extrinsic
* @param[out] error Pointer to an error object that will be set if an error occurs. * @param[out] error Pointer to an error object that will be set if an error occurs.
*/ */
OB_EXPORT void ob_stream_profile_set_extrinsic_to(ob_stream_profile *source, const ob_stream_profile *target, ob_extrinsic extrinsic, ob_error **error); OB_EXPORT void ob_stream_profile_set_extrinsic_to(ob_stream_profile *source, const ob_stream_profile *target, ob_extrinsic extrinsic, ob_error **error);
/**
* @brief Set the extrinsic for source stream to target stream type
*
* @param[in] source Source stream profile
* @param[in] type Target stream type
* @param[out] error Pointer to an error object that will be set if an error occurs.
* @return ob_extrinsic The extrinsic
*/
OB_EXPORT void ob_stream_profile_set_extrinsic_to_type(ob_stream_profile *source, const ob_stream_type type, ob_extrinsic extrinsic, ob_error **error);
/** /**
* @brief Get the frame rate of the video stream * @brief Get the frame rate of the video stream
* *
@@ -235,7 +245,7 @@ OB_EXPORT ob_disparity_param ob_disparity_based_stream_profile_get_disparity_par
* @brief Set the disparity process param of the disparity stream. * @brief Set the disparity process param of the disparity stream.
* *
* @param[in] profile Stream profile object. If the profile is not for the disparity stream, an error will be returned. * @param[in] profile Stream profile object. If the profile is not for the disparity stream, an error will be returned.
* @param[in] intrinsic The disparity process param of the disparity stream. * @param[in] param The disparity process param of the disparity stream.
* @param[out] error Pointer to an error object that will be set if an error occurs. * @param[out] error Pointer to an error object that will be set if an error occurs.
*/ */
OB_EXPORT void ob_disparity_based_stream_profile_set_disparity_param(ob_stream_profile *profile, ob_disparity_param param, ob_error **error); OB_EXPORT void ob_disparity_based_stream_profile_set_disparity_param(ob_stream_profile *profile, ob_disparity_param param, ob_error **error);
+38 -28
View File
@@ -19,25 +19,22 @@ extern "C" {
* *
* @return bool Transform result * @return bool Transform result
*/ */
OB_EXPORT bool ob_transformation_3d_to_3d(const OBPoint3f source_point3f, OBExtrinsic extrinsic, OBPoint3f *target_point3f, ob_error **error) ; OB_EXPORT bool ob_transformation_3d_to_3d(const OBPoint3f source_point3f, OBExtrinsic extrinsic, OBPoint3f *target_point3f, ob_error **error);
/** /**
* @brief Transform a 2d pixel coordinate with an associated depth value of the source camera into a 3d point of the target coordinate system. * @brief Transform a 2d pixel coordinate with an associated depth value of the source camera into a 3d point of the target coordinate system.
* *
* @param[in] source_intrinsic Source intrinsic parameters
* @param[in] source_distortion Source distortion parameters
* @param[in] source_point2f Source 2d point value * @param[in] source_point2f Source 2d point value
* @param[in] source_depth_pixel_value The depth of sourcePoint2f in millimeters * @param[in] source_depth_pixel_value The depth of sourcePoint2f in millimeters
* @param[in] source_intrinsic Source intrinsic parameters
* @param[in] extrinsic Transformation matrix from source to target * @param[in] extrinsic Transformation matrix from source to target
* @param[out] target_point3f Target 3d point value * @param[out] target_point3f Target 3d point value
* @param[out] error Pointer to an error object that will be set if an error occurs. * @param[out] error Pointer to an error object that will be set if an error occurs.
* *
* @return bool Transform result * @return bool Transform result
*/ */
OB_EXPORT bool ob_transformation_2d_to_3d(const OBPoint2f source_point2f, const float source_depth_pixel_value, const OBCameraIntrinsic source_intrinsic, OB_EXPORT bool ob_transformation_2d_to_3d(const OBPoint2f source_point2f, const float source_depth_pixel_value, const OBCameraIntrinsic source_intrinsic,
OBExtrinsic extrinsic, OBPoint3f *target_point3f, ob_error **error); OBExtrinsic extrinsic, OBPoint3f *target_point3f, ob_error **error);
/** /**
* @brief Transform a 3d point of a source coordinate system into a 2d pixel coordinate of the target camera. * @brief Transform a 3d point of a source coordinate system into a 2d pixel coordinate of the target camera.
@@ -69,46 +66,59 @@ OB_EXPORT bool ob_transformation_3d_to_2d(const OBPoint3f source_point3f, const
* *
* @return bool Transform result * @return bool Transform result
*/ */
OB_EXPORT bool ob_transformation_2d_to_2d(const OBPoint2f source_point2f, const float source_depth_pixel_value, const OBCameraIntrinsic source_intrinsic, OB_EXPORT bool ob_transformation_2d_to_2d(const OBPoint2f source_point2f, const float source_depth_pixel_value, const OBCameraIntrinsic source_intrinsic,
const OBCameraDistortion source_distortion, const OBCameraIntrinsic target_intrinsic, const OBCameraDistortion target_distortion, const OBCameraDistortion source_distortion, const OBCameraIntrinsic target_intrinsic,
OBExtrinsic extrinsic, OBPoint2f *target_point2f, ob_error **error); const OBCameraDistortion target_distortion, OBExtrinsic extrinsic, OBPoint2f *target_point2f, ob_error **error);
// \deprecated This function is deprecated and will be removed in a future version. // \deprecated This function is deprecated and will be removed in a future version.
OB_EXPORT ob_frame *transformation_depth_frame_to_color_camera(ob_device *device, ob_frame *depth_frame, uint32_t target_color_camera_width, OB_EXPORT ob_frame *transformation_depth_frame_to_color_camera(ob_device *device, ob_frame *depth_frame, uint32_t target_color_camera_width,
uint32_t target_color_camera_height, ob_error **error); uint32_t target_color_camera_height, ob_error **error);
// \deprecated This function is deprecated and will be removed in a future version. // \deprecated This function is deprecated and will be removed in a future version.
OB_EXPORT bool transformation_init_xy_tables(const ob_calibration_param calibration_param, const ob_sensor_type sensor_type, float *data, uint32_t *data_size, OB_EXPORT bool transformation_init_xy_tables(const ob_calibration_param calibration_param, const ob_sensor_type sensor_type, float *data, uint32_t *data_size,
ob_xy_tables *xy_tables, ob_error **error); ob_xy_tables *xy_tables, ob_error **error);
// \deprecated This function is deprecated and will be removed in a future version. // \deprecated This function is deprecated and will be removed in a future version.
OB_EXPORT void transformation_depth_to_pointcloud(ob_xy_tables *xy_tables, const void *depth_image_data, void *pointcloud_data, ob_error **error); OB_EXPORT void transformation_depth_to_pointcloud(ob_xy_tables *xy_tables, const void *depth_image_data, void *pointcloud_data, ob_error **error);
// \deprecated This function is deprecated and will be removed in a future version. // \deprecated This function is deprecated and will be removed in a future version.
OB_EXPORT void transformation_depth_to_rgbd_pointcloud(ob_xy_tables *xy_tables, const void *depth_image_data, const void *color_image_data, void *pointcloud_data, OB_EXPORT void transformation_depth_to_rgbd_pointcloud(ob_xy_tables *xy_tables, const void *depth_image_data, const void *color_image_data,
ob_error **error); void *pointcloud_data, ob_error **error);
// \deprecated This function is deprecated and will be removed in a future version. // \deprecated This function is deprecated and will be removed in a future version.
// Use the ob_transformation_3d_to_3d instead. // Use the ob_transformation_3d_to_3d instead.
OB_EXPORT bool ob_calibration_3d_to_3d(const ob_calibration_param calibration_param, const ob_point3f source_point3f, const ob_sensor_type source_sensor_type, OB_EXPORT bool ob_calibration_3d_to_3d(const ob_calibration_param calibration_param, const ob_point3f source_point3f, const ob_sensor_type source_sensor_type,
const ob_sensor_type target_sensor_type, ob_point3f *target_point3f, ob_error **error); const ob_sensor_type target_sensor_type, ob_point3f *target_point3f, ob_error **error);
// \deprecated This function is deprecated and will be removed in a future version. // \deprecated This function is deprecated and will be removed in a future version.
// Use the ob_transformation_2d_to_3d instead. // Use the ob_transformation_2d_to_3d instead.
OB_EXPORT bool ob_calibration_2d_to_3d(const ob_calibration_param calibration_param, const ob_point2f source_point2f, const float source_depth_pixel_value, OB_EXPORT bool ob_calibration_2d_to_3d(const ob_calibration_param calibration_param, const ob_point2f source_point2f, const float source_depth_pixel_value,
const ob_sensor_type source_sensor_type, const ob_sensor_type target_sensor_type, ob_point3f *target_point3f, ob_error **error); const ob_sensor_type source_sensor_type, const ob_sensor_type target_sensor_type, ob_point3f *target_point3f,
ob_error **error);
// \deprecated This function is deprecated and will be removed in a future version. // \deprecated This function is deprecated and will be removed in a future version.
// Use the ob_transformation_3d_to_2d instead. // Use the ob_transformation_3d_to_2d instead.
OB_EXPORT bool ob_calibration_3d_to_2d(const ob_calibration_param calibration_param, const ob_point3f source_point3f, const ob_sensor_type source_sensor_type, OB_EXPORT bool ob_calibration_3d_to_2d(const ob_calibration_param calibration_param, const ob_point3f source_point3f, const ob_sensor_type source_sensor_type,
const ob_sensor_type target_sensor_type, ob_point2f *target_point2f, ob_error **error); const ob_sensor_type target_sensor_type, ob_point2f *target_point2f, ob_error **error);
// \deprecated This function is deprecated and will be removed in a future version. // \deprecated This function is deprecated and will be removed in a future version.
// Use the ob_transformation_2d_to_2d instead. // Use the ob_transformation_2d_to_2d instead.
OB_EXPORT bool ob_calibration_2d_to_2d(const ob_calibration_param calibration_param, const ob_point2f source_point2f, const float source_depth_pixel_value, OB_EXPORT bool ob_calibration_2d_to_2d(const ob_calibration_param calibration_param, const ob_point2f source_point2f, const float source_depth_pixel_value,
const ob_sensor_type source_sensor_type, const ob_sensor_type target_sensor_type, ob_point2f *target_point2f, ob_error **error); const ob_sensor_type source_sensor_type, const ob_sensor_type target_sensor_type, ob_point2f *target_point2f,
ob_error **error);
/**
* @brief save point cloud to ply file.
*
* @param[in] file_name Point cloud save path
* @param[in] frame Point cloud frame
* @param[in] save_binary Binary or textual,true: binary, false: textual
* @param[in] use_mesh Save mesh or not, true: save as mesh, false: not save as mesh
* @param[in] mesh_threshold Distance threshold for creating faces in point cloud,default value :50
* @param[out] error Pointer to an error object that will be set if an error occurs.
*
* @return bool save point cloud result
*/
OB_EXPORT bool ob_save_pointcloud_to_ply(const char *file_name, ob_frame *frame, bool save_binary, bool use_mesh, float mesh_threshold, ob_error **error);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
@@ -101,7 +101,7 @@ public:
* @brief Creates a network device with the specified IP address and port. * @brief Creates a network device with the specified IP address and port.
* *
* @param[in] address The IP address, ipv4 only. such as "192.168.1.10" * @param[in] address The IP address, ipv4 only. such as "192.168.1.10"
* @param[in] port The port number, currently only support 8090 * @param[in] port The port number, currently only support 8090
* @return std::shared_ptr<Device> The created device object. * @return std::shared_ptr<Device> The created device object.
*/ */
std::shared_ptr<Device> createNetDevice(const char *address, uint16_t port) const { std::shared_ptr<Device> createNetDevice(const char *address, uint16_t port) const {
@@ -127,7 +127,7 @@ public:
/** /**
* @brief Activates device clock synchronization to synchronize the clock of the host and all created devices (if supported). * @brief Activates device clock synchronization to synchronize the clock of the host and all created devices (if supported).
* *
* @param repeatInterval The interval for auto-repeated synchronization, in milliseconds. If the value is 0, synchronization is performed only once. * @param repeatIntervalMsec The interval for auto-repeated synchronization, in milliseconds. If the value is 0, synchronization is performed only once.
*/ */
void enableDeviceClockSync(uint64_t repeatIntervalMsec) const { void enableDeviceClockSync(uint64_t repeatIntervalMsec) const {
ob_error *error = nullptr; ob_error *error = nullptr;
@@ -146,12 +146,12 @@ public:
} }
/** /**
* @brief For linux, there are two ways to enable the UVC backend: libuvc and libusb. This function is used to set the backend type. * @brief For linux, there are two ways to enable the UVC backend: libuvc and v4l2. This function is used to set the backend type.
* @brief It is effective when the new device is created. * @brief It is effective when the new device is created.
* *
* @attention This interface is only available for Linux. * @attention This interface is only available for Linux.
* *
* @param[in] backend_type The backend type to be used. * @param[in] type The backend type to be used.
*/ */
void setUvcBackendType(OBUvcBackendType type) const { void setUvcBackendType(OBUvcBackendType type) const {
ob_error *error = nullptr; ob_error *error = nullptr;
@@ -202,7 +202,7 @@ public:
* @param callback The callback function. * @param callback The callback function.
*/ */
static void setLoggerToCallback(OBLogSeverity severity, LogCallback callback) { static void setLoggerToCallback(OBLogSeverity severity, LogCallback callback) {
ob_error *error = nullptr; ob_error *error = nullptr;
Context::getLogCallback() = callback; Context::getLogCallback() = callback;
ob_set_logger_to_callback(severity, &Context::logCallback, &Context::getLogCallback(), &error); ob_set_logger_to_callback(severity, &Context::logCallback, &Context::getLogCallback(), &error);
Error::handle(&error); Error::handle(&error);
@@ -210,7 +210,7 @@ public:
/** /**
* @brief Set the extensions directory * @brief Set the extensions directory
* @brief The extensions directory is used to search for dynamic libraries that provide additional functionality to the SDK, such as the Frame filters. * @brief The extensions directory is used to search for dynamic libraries that provide additional functionality to the SDK, such as the Frame filters.
* *
* @attention Should be called before creating the context and pipeline, otherwise the default extensions directory (./extensions) will be used. * @attention Should be called before creating the context and pipeline, otherwise the default extensions directory (./extensions) will be used.
* *
@@ -240,7 +240,7 @@ private:
} }
// Lazy initialization of the logcallback_. The purpose is to initialize logcallback_ in .hpp // Lazy initialization of the logcallback_. The purpose is to initialize logcallback_ in .hpp
static LogCallback& getLogCallback() { static LogCallback &getLogCallback() {
static LogCallback logCallback_ = nullptr; static LogCallback logCallback_ = nullptr;
return logCallback_; return logCallback_;
} }
@@ -249,4 +249,3 @@ private:
#define enableMultiDeviceSync enableDeviceClockSync #define enableMultiDeviceSync enableDeviceClockSync
}; };
} // namespace ob } // namespace ob
@@ -292,6 +292,30 @@ public:
Error::handle(&error); Error::handle(&error);
} }
/**
* @brief Set the customer data type of a device property
*
* @param data The data to set
* @param dataSize The size of the data to set,the maximum length cannot exceed 65532 bytes.
*/
void writeCustomerData(const void *data, uint32_t dataSize) {
ob_error *error = nullptr;
ob_device_write_customer_data(impl_, data, dataSize, &error);
Error::handle(&error);
}
/**
* @brief Get the customer data type of a device property
*
* @param data The property data obtained
* @param dataSize The size of the data obtained
*/
void readCustomerData(void *data, uint32_t *dataSize) {
ob_error *error = nullptr;
ob_device_read_customer_data(impl_, data, dataSize, &error);
Error::handle(&error);
}
/** /**
* @brief Get the number of properties supported by the device * @brief Get the number of properties supported by the device
* *
@@ -491,7 +515,7 @@ public:
* Please delete the object directly and obtain it again after the device is reconnected. * Please delete the object directly and obtain it again after the device is reconnected.
* Support devices: Gemini2 L * Support devices: Gemini2 L
* *
* @param[in] delayMs Time unit:ms。delayMs == 0:No delay;delayMs > 0, Delay millisecond connect to host device after reboot * @param[in] delayMs Time unit: ms. delayMs == 0: No delay; delayMs > 0, Delay millisecond connect to host device after reboot
*/ */
void reboot(uint32_t delayMs) const { void reboot(uint32_t delayMs) const {
setIntProperty(OB_PROP_DEVICE_REBOOT_DELAY_INT, delayMs); setIntProperty(OB_PROP_DEVICE_REBOOT_DELAY_INT, delayMs);
@@ -564,7 +588,7 @@ public:
* *
* @attention The frequency of the user call this function multiplied by the number of frames per trigger should be less than the frame rate of the stream. * @attention The frequency of the user call this function multiplied by the number of frames per trigger should be less than the frame rate of the stream.
* The number of frames per trigger can be set by @ref framesPerTrigger. * The number of frames per trigger can be set by @ref framesPerTrigger.
* @attention For some models,receive and execute the capture command will have a certain delay and performance consumption, so the frequency of calling * @attention For some models, receive and execute the capture command will have a certain delay and performance consumption, so the frequency of calling
* this function should not be too high, please refer to the product manual for the specific supported frequency. * this function should not be too high, please refer to the product manual for the specific supported frequency.
* @attention If the device is not in the @ref OB_MULTI_DEVICE_SYNC_MODE_HARDWARE_TRIGGERING mode, device will ignore the capture command. * @attention If the device is not in the @ref OB_MULTI_DEVICE_SYNC_MODE_HARDWARE_TRIGGERING mode, device will ignore the capture command.
*/ */
@@ -755,7 +779,7 @@ public:
* @param[in] sendData The data to be sent to the device. * @param[in] sendData The data to be sent to the device.
* @param[in] sendDataSize The size of the data to be sent to the device. * @param[in] sendDataSize The size of the data to be sent to the device.
* @param[out] receiveData The data received from the device. * @param[out] receiveData The data received from the device.
* @param[in out] receiveDataSize The requeseted size of the data received from the device, and the actual size of the data received from the device. * @param[in,out] receiveDataSize The requeseted size of the data received from the device, and the actual size of the data received from the device.
*/ */
void sendAndReceiveData(const uint8_t *sendData, uint32_t sendDataSize, uint8_t *receiveData, uint32_t *receiveDataSize) const { void sendAndReceiveData(const uint8_t *sendData, uint32_t sendDataSize, uint8_t *receiveData, uint32_t *receiveDataSize) const {
ob_error *error = nullptr; ob_error *error = nullptr;
@@ -919,7 +943,7 @@ public:
/** /**
* @brief Get the connection type of the device * @brief Get the connection type of the device
* *
* @return const char* the connection type of the device,currently supports:"USB", "USB1.0", "USB1.1", "USB2.0", "USB2.1", "USB3.0", "USB3.1", * @return const char* the connection type of the device, currently supports: "USB", "USB1.0", "USB1.1", "USB2.0", "USB2.1", "USB3.0", "USB3.1",
* "USB3.2", "Ethernet" * "USB3.2", "Ethernet"
*/ */
const char *getConnectionType() const { const char *getConnectionType() const {
@@ -1141,7 +1165,7 @@ public:
* @brief Get device connection type * @brief Get device connection type
* *
* @param index device index * @param index device index
* @return const char* returns connection type,currently supports:"USB", "USB1.0", "USB1.1", "USB2.0", "USB2.1", "USB3.0", "USB3.1", "USB3.2", "Ethernet" * @return const char* returns connection type, currently supports: "USB", "USB1.0", "USB1.1", "USB2.0", "USB2.1", "USB3.0", "USB3.1", "USB3.2", "Ethernet"
*/ */
const char *getConnectionType(uint32_t index) const { const char *getConnectionType(uint32_t index) const {
ob_error *error = nullptr; ob_error *error = nullptr;
@@ -1165,6 +1189,21 @@ public:
return ip; return ip;
} }
/**
* @brief get the local mac address of the device at the specified index
*
* @attention Only valid for network devices, otherwise it will return "0:0:0:0:0:0".
*
* @param index the index of the device
* @return const char* the local mac address of the device
*/
const char *getLocalMacAddress(uint32_t index) const {
ob_error *error = nullptr;
auto mac = ob_device_list_get_device_local_mac(impl_, index, &error);
Error::handle(&error);
return mac;
}
/** /**
* @brief Get the device object at the specified index * @brief Get the device object at the specified index
* *
@@ -1200,7 +1239,7 @@ public:
* @brief On Linux platform, for usb device, the uid of the device is composed of bus-port-dev, for example 1-1.2-1. But the SDK will remove the dev number * @brief On Linux platform, for usb device, the uid of the device is composed of bus-port-dev, for example 1-1.2-1. But the SDK will remove the dev number
* and only keep the bus-port as the uid to create the device, for example 1-1.2, so that we can create a device connected to the specified USB port. * and only keep the bus-port as the uid to create the device, for example 1-1.2, so that we can create a device connected to the specified USB port.
* Similarly, users can also directly pass in bus-port as uid to create device. * Similarly, users can also directly pass in bus-port as uid to create device.
* @brief For GMSL device,the uid is GMSL port with “gmsl2-” prefix, for example gmsl2-1. * @brief For GMSL device, the uid is GMSL port with "gmsl2-" prefix, for example gmsl2-1.
* *
* @attention If the device has been acquired and created elsewhere, repeated acquisition will throw an exception * @attention If the device has been acquired and created elsewhere, repeated acquisition will throw an exception
* *
@@ -1379,9 +1418,9 @@ public:
} }
/** /**
* @brief Get the number of device presets in the list * @brief Get the number of camera parameters in the list.
* *
* @return uint32_t the number of device presets in the list * @return uint32_t the number of camera parameters in the list.
*/ */
uint32_t getCount() { uint32_t getCount() {
ob_error *error = nullptr; ob_error *error = nullptr;
@@ -22,10 +22,12 @@ private:
* *
* @attention This constructor should not be called directly, use the handle() function instead. * @attention This constructor should not be called directly, use the handle() function instead.
* *
* @param error * @param error The ob_error object
*/ */
explicit Error(ob_error *error) : impl_(error) {}; explicit Error(ob_error *error) : impl_(error) {};
Error& operator=(const Error&) = default;
public: public:
/** /**
* @brief A static function to handle the ob_error and throw an exception if needed. * @brief A static function to handle the ob_error and throw an exception if needed.
@@ -311,7 +311,7 @@ public:
* @brief Some private filters require an activation key to be activated, its depends on the vendor of the filter. * @brief Some private filters require an activation key to be activated, its depends on the vendor of the filter.
* *
* @param name The name of the filter. * @param name The name of the filter.
* @param activation_key The activation key of the filter. * @param activationKey The activation key of the filter.
*/ */
static std::shared_ptr<Filter> createPrivateFilter(const std::string &name, const std::string &activationKey) { static std::shared_ptr<Filter> createPrivateFilter(const std::string &name, const std::string &activationKey) {
ob_error *error = nullptr; ob_error *error = nullptr;
@@ -352,7 +352,7 @@ public:
/** /**
* @brief Set the output pointcloud frame format. * @brief Set the output pointcloud frame format.
* *
* @param type The point cloud frame format: OB_FORMAT_POINT or OB_FORMAT_RGB_POINT * @param format The point cloud frame format: OB_FORMAT_POINT or OB_FORMAT_RGB_POINT
*/ */
void setCreatePointFormat(OBFormat format) { void setCreatePointFormat(OBFormat format) {
setConfigValue("pointFormat", static_cast<double>(format)); setConfigValue("pointFormat", static_cast<double>(format));
@@ -534,7 +534,7 @@ public:
/** /**
* @brief Set the sequenceId filter params. * @brief Set the sequenceId filter params.
* *
* @param sequence id to pass the filter. * @param sequence_id id to pass the filter.
*/ */
void selectSequenceId(int sequence_id) { void selectSequenceId(int sequence_id) {
setConfigValue("sequenceid", static_cast<double>(sequence_id)); setConfigValue("sequenceid", static_cast<double>(sequence_id));
@@ -580,7 +580,7 @@ public:
/** /**
* @brief Set the decimation filter scale value. * @brief Set the decimation filter scale value.
* *
* @param type The decimation filter scale value. * @param value The decimation filter scale value.
*/ */
void setScaleValue(uint8_t value) { void setScaleValue(uint8_t value) {
setConfigValue("decimate", static_cast<double>(value)); setConfigValue("decimate", static_cast<double>(value));
@@ -796,7 +796,6 @@ public:
/** /**
* @brief Set the HoleFillingFilter mode. * @brief Set the HoleFillingFilter mode.
* *
* @param[in] filter A holefilling_filter object.
* @param mode OBHoleFillingMode, OB_HOLE_FILL_TOP,OB_HOLE_FILL_NEAREST or OB_HOLE_FILL_FAREST. * @param mode OBHoleFillingMode, OB_HOLE_FILL_TOP,OB_HOLE_FILL_NEAREST or OB_HOLE_FILL_FAREST.
*/ */
void setFilterMode(OBHoleFillingMode mode) { void setFilterMode(OBHoleFillingMode mode) {
@@ -830,7 +829,7 @@ public:
/** /**
* @brief Set the noise removal filter params. * @brief Set the noise removal filter params.
* *
* @param[in] params ob_noise_removal_filter_params. * @param[in] filterParams ob_noise_removal_filter_params.
*/ */
void setFilterParams(OBNoiseRemovalFilterParams filterParams) { void setFilterParams(OBNoiseRemovalFilterParams filterParams) {
setConfigValue("max_size", static_cast<double>(filterParams.max_size)); setConfigValue("max_size", static_cast<double>(filterParams.max_size));
@@ -18,7 +18,7 @@
#include <functional> #include <functional>
/** /**
* Frame classis inheritance hierarchy: * Frame classis inheritance hierarchy:
* Frame * Frame
* | * |
* +-----------+----------+----------+-----------+ * +-----------+----------+----------+-----------+
@@ -181,7 +181,7 @@ public:
/** /**
* @brief Get the global timestamp of the frame in microseconds. * @brief Get the global timestamp of the frame in microseconds.
* @brief The global timestamp is the time point when the frame was was captured by the device, and has been converted to the host clock domain. The * @brief The global timestamp is the time point when the frame was captured by the device, and has been converted to the host clock domain. The
* conversion process base on the device timestamp and can eliminate the timer drift of the device * conversion process base on the device timestamp and can eliminate the timer drift of the device
* *
* @attention The global timestamp disable by default. If global timestamp is not enabled, the function will return 0. To enable the global timestamp, * @attention The global timestamp disable by default. If global timestamp is not enabled, the function will return 0. To enable the global timestamp,
@@ -593,6 +593,33 @@ public:
return scale; return scale;
} }
/**
* @brief Get the width of the frame.
*
* @return uint32_t The width of the frame.
*/
uint32_t getWidth() const {
ob_error *error = nullptr;
// TODO
auto width = ob_point_cloud_frame_get_width(impl_, &error);
Error::handle(&error);
return width;
}
/**
* @brief Get the height of the frame.
*
* @return uint32_t The height of the frame.
*/
uint32_t getHeight() const {
ob_error *error = nullptr;
auto height = ob_point_cloud_frame_get_height(impl_, &error);
Error::handle(&error);
return height;
}
public: public:
// The following interfaces are deprecated and are retained here for compatibility purposes. // The following interfaces are deprecated and are retained here for compatibility purposes.
#define getPositionValueScale getCoordinateValueScale #define getPositionValueScale getCoordinateValueScale
@@ -902,11 +929,11 @@ public:
* @attention The buffer is owned by the caller, and will not be destroyed by the frame object. The user should ensure that the buffer is valid and not * @attention The buffer is owned by the caller, and will not be destroyed by the frame object. The user should ensure that the buffer is valid and not
* modified. * modified.
* *
* @param[in] frame_type Frame object type. * @param[in] frameType Frame object type.
* @param[in] format Frame object format. * @param[in] format Frame object format.
* @param[in] buffer Frame object buffer. * @param[in] buffer Frame object buffer.
* @param[in] buffer_size Frame object buffer size.
* @param[in] destroyCallback Destroy callback, will be called when the frame object is destroyed. * @param[in] destroyCallback Destroy callback, will be called when the frame object is destroyed.
* @param[in] bufferSize Frame object buffer size.
* *
* @return std::shared_ptr<Frame> The created frame object. * @return std::shared_ptr<Frame> The created frame object.
*/ */
@@ -957,7 +984,7 @@ private:
static void BufferDestroy(uint8_t *buffer, void *context) { static void BufferDestroy(uint8_t *buffer, void *context) {
auto *ctx = static_cast<BufferDestroyContext *>(context); auto *ctx = static_cast<BufferDestroyContext *>(context);
if (ctx->callback) { if(ctx->callback) {
ctx->callback(buffer); ctx->callback(buffer);
} }
delete ctx; delete ctx;
@@ -95,7 +95,7 @@ public:
* If no parameters are specified, the stream will be enabled with default resolution settings. * If no parameters are specified, the stream will be enabled with default resolution settings.
* Users who wish to set custom resolutions should refer to the product manual, as available resolutions vary by camera model. * Users who wish to set custom resolutions should refer to the product manual, as available resolutions vary by camera model.
* *
* @param type The video stream type. * @param streamType The video stream type.
* @param width The video stream width (default is OB_WIDTH_ANY, which selects the default resolution). * @param width The video stream width (default is OB_WIDTH_ANY, which selects the default resolution).
* @param height The video stream height (default is OB_HEIGHT_ANY, which selects the default resolution). * @param height The video stream height (default is OB_HEIGHT_ANY, which selects the default resolution).
* @param fps The video stream frame rate (default is OB_FPS_ANY, which selects the default frame rate). * @param fps The video stream frame rate (default is OB_FPS_ANY, which selects the default frame rate).
@@ -182,7 +182,7 @@ public:
* @brief Disable a sensor stream to be used in the pipeline. * @brief Disable a sensor stream to be used in the pipeline.
* @brief Will convert sensor type to stream type automatically. * @brief Will convert sensor type to stream type automatically.
* *
* @param sensorType * @param sensorType The sensor configuration to be disabled
*/ */
void disableStream(OBSensorType sensorType) const { void disableStream(OBSensorType sensorType) const {
auto streamType = ob::TypeHelper::convertSensorTypeToStreamType(sensorType); auto streamType = ob::TypeHelper::convertSensorTypeToStreamType(sensorType);
@@ -346,7 +346,7 @@ public:
/** /**
* @brief Wait for frameset * @brief Wait for frameset
* *
* @param timeout_ms The waiting timeout in milliseconds * @param timeoutMs The waiting timeout in milliseconds
* @return std::shared_ptr<FrameSet> The waiting frameset data * @return std::shared_ptr<FrameSet> The waiting frameset data
*/ */
std::shared_ptr<FrameSet> waitForFrameset(uint32_t timeoutMs = 1000) const { std::shared_ptr<FrameSet> waitForFrameset(uint32_t timeoutMs = 1000) const {
@@ -0,0 +1,188 @@
// Copyright (c) Orbbec Inc. All Rights Reserved.
// Licensed under the MIT License.
/**
* @file RecordPlayback.hpp
* @brief Record and playback device-related types, including interfaces to create recording and playback devices,
record and playback streaming data, etc.
*/
#pragma once
#include "Types.hpp"
#include "Error.hpp"
#include "libobsensor/h/RecordPlayback.h"
#include "libobsensor/hpp/Device.hpp"
namespace ob {
typedef std::function<void(OBPlaybackStatus status)> PlaybackStatusChangeCallback;
class RecordDevice {
private:
ob_record_device_t *impl_;
public:
explicit RecordDevice(std::shared_ptr<Device> device, const std::string &file, bool compressionEnabled = true) {
ob_error *error = nullptr;
impl_ = ob_create_record_device(device->getImpl(), file.c_str(), compressionEnabled, &error);
Error::handle(&error);
}
virtual ~RecordDevice() noexcept {
ob_error *error = nullptr;
ob_delete_record_device(impl_, &error);
Error::handle(&error, false);
}
RecordDevice(RecordDevice &&other) {
if(this != &other) {
impl_ = other.impl_;
other.impl_ = nullptr;
}
}
RecordDevice &operator=(RecordDevice &&other) {
if(this != &other) {
impl_ = other.impl_;
other.impl_ = nullptr;
}
return *this;
}
RecordDevice(const RecordDevice &) = delete;
RecordDevice &operator=(const RecordDevice &) = delete;
public:
void pause() {
ob_error *error = nullptr;
ob_record_device_pause(impl_, &error);
Error::handle(&error);
}
void resume() {
ob_error *error = nullptr;
ob_record_device_resume(impl_, &error);
Error::handle(&error);
}
};
class PlaybackDevice : public Device {
public:
explicit PlaybackDevice(const std::string &file) : Device(nullptr) {
ob_error *error = nullptr;
impl_ = ob_create_playback_device(file.c_str(), &error);
Error::handle(&error);
}
virtual ~PlaybackDevice() noexcept = default;
PlaybackDevice(PlaybackDevice &&other) : Device(std::move(other)) {}
PlaybackDevice &operator=(PlaybackDevice &&other) {
Device::operator=(std::move(other));
return *this;
}
PlaybackDevice(const PlaybackDevice &) = delete;
PlaybackDevice &operator=(const PlaybackDevice &) = delete;
public:
/**
* @brief Pause the streaming data from the playback device.
*/
void pause() {
ob_error *error = nullptr;
ob_playback_device_pause(impl_, &error);
Error::handle(&error);
}
/**
* @brief Resume the streaming data from the playback device.
*/
void resume() {
ob_error *error = nullptr;
ob_playback_device_resume(impl_, &error);
Error::handle(&error);
}
/**
* @brief Seek to a specific timestamp when playing back a recording.
* @param[in] timestamp The timestamp to seek to, in milliseconds.
*/
void seek(const int64_t timestamp) {
ob_error *error = nullptr;
ob_playback_device_seek(impl_, timestamp, &error);
Error::handle(&error);
}
/**
* @brief Set the playback rate of the playback device.
* @param[in] rate The playback rate to set.
*/
void setPlaybackRate(const float rate) {
ob_error *error = nullptr;
ob_playback_device_set_playback_rate(impl_, rate, &error);
Error::handle(&error);
}
/**
* @brief Set a callback function to be called when the playback status changes.
* @param[in] callback The callback function to set.
*/
void setPlaybackStatusChangeCallback(PlaybackStatusChangeCallback callback) {
callback_ = callback;
ob_error *error = nullptr;
ob_playback_device_set_playback_status_changed_callback(impl_, &PlaybackDevice::playbackStatusCallback, this, &error);
Error::handle(&error);
}
/**
* @brief Get the current playback status of the playback device.
* @return The current playback status.
*/
OBPlaybackStatus getPlaybackStatus() const {
ob_error *error = nullptr;
OBPlaybackStatus status = ob_playback_device_get_current_playback_status(impl_, &error);
Error::handle(&error);
return status;
}
/**
* @brief Get the current position of the playback device.
* @return The current position of the playback device, in milliseconds.
*/
uint64_t getPosition() const {
ob_error *error = nullptr;
uint64_t position = ob_playback_device_get_position(impl_, &error);
Error::handle(&error);
return position;
}
/**
* @brief Get the duration of the playback device.
* @return The duration of the playback device, in milliseconds.
*/
uint64_t getDuration() const {
ob_error *error = nullptr;
uint64_t duration = ob_playback_device_get_duration(impl_, &error);
Error::handle(&error);
return duration;
}
private:
static void playbackStatusCallback(OBPlaybackStatus status, void *userData) {
auto *playbackDevice = static_cast<PlaybackDevice *>(userData);
if(playbackDevice && playbackDevice->callback_) {
playbackDevice->callback_(status);
}
}
private:
PlaybackStatusChangeCallback callback_;
};
} // namespace ob
@@ -51,9 +51,9 @@ public:
} }
/** /**
* @brief Get the format of the stream * @brief Get the format of the stream.
* *
* @return OBFormat return the format of the stream * @return OBFormat return the format of the stream.
*/ */
OBFormat getFormat() const { OBFormat getFormat() const {
ob_error *error = nullptr; ob_error *error = nullptr;
@@ -63,9 +63,9 @@ public:
} }
/** /**
* @brief Get the type of stream * @brief Get the type of stream.
* *
* @return OBStreamType return the type of the stream * @return OBStreamType return the type of the stream.
*/ */
OBStreamType getType() const { OBStreamType getType() const {
ob_error *error = nullptr; ob_error *error = nullptr;
@@ -75,7 +75,7 @@ public:
} }
/** /**
* @brief Get the extrinsic parameters from current stream profile to the given target stream profile * @brief Get the extrinsic parameters from current stream profile to the given target stream profile.
* *
* @return OBExtrinsic Return the extrinsic parameters. * @return OBExtrinsic Return the extrinsic parameters.
*/ */
@@ -87,17 +87,41 @@ public:
} }
/** /**
* @brief Check if frame object is compatible with the given type * @brief Set the extrinsic parameters from current stream profile to the given target stream profile.
*
* @tparam target Target stream profile.
* @tparam extrinsic The extrinsic.
*/
void bindExtrinsicTo(std::shared_ptr<StreamProfile> target, const OBExtrinsic &extrinsic) {
ob_error *error = nullptr;
ob_stream_profile_set_extrinsic_to(const_cast<ob_stream_profile_t *>(impl_), const_cast<const ob_stream_profile_t *>(target->getImpl()), extrinsic, &error);
Error::handle(&error);
}
/**
* @brief Set the extrinsic parameters from current stream profile to the given target stream type.
*
* @tparam targetStreamType Target stream type.
* @tparam extrinsic The extrinsic.
*/
void bindExtrinsicTo(const OBStreamType &targetStreamType, const OBExtrinsic &extrinsic) {
ob_error *error = nullptr;
ob_stream_profile_set_extrinsic_to_type(const_cast<ob_stream_profile_t *>(impl_),targetStreamType,extrinsic, &error);
Error::handle(&error);
}
/**
* @brief Check if frame object is compatible with the given type.
* *
* @tparam T Given type * @tparam T Given type.
* @return bool return result * @return bool return result.
*/ */
template <typename T> bool is() const; template <typename T> bool is() const;
/** /**
* @brief Converts object type to target type * @brief Converts object type to target type.
* *
* @tparam T Target type * @tparam T Target type.
* @return std::shared_ptr<T> Return the result. Throws an exception if conversion is not possible. * @return std::shared_ptr<T> Return the result. Throws an exception if conversion is not possible.
*/ */
template <typename T> std::shared_ptr<T> as() { template <typename T> std::shared_ptr<T> as() {
@@ -109,9 +133,9 @@ public:
} }
/** /**
* @brief Converts object type to target type (const version) * @brief Converts object type to target type (const version).
* *
* @tparam T Target type * @tparam T Target type.
* @return std::shared_ptr<T> Return the result. Throws an exception if conversion is not possible. * @return std::shared_ptr<T> Return the result. Throws an exception if conversion is not possible.
*/ */
template <typename T> std::shared_ptr<const T> as() const { template <typename T> std::shared_ptr<const T> as() const {
@@ -192,6 +216,17 @@ public:
return intrinsic; return intrinsic;
} }
/**
* @brief Set the intrinsic parameters of the stream.
*
* @param intrinsic The intrinsic parameters.
*/
void setIntrinsic(const OBCameraIntrinsic &intrinsic) {
ob_error *error = nullptr;
ob_video_stream_profile_set_intrinsic(const_cast<ob_stream_profile_t *>(impl_), intrinsic, &error);
Error::handle(&error);
}
/** /**
* @brief Get the distortion parameters of the stream. * @brief Get the distortion parameters of the stream.
* @brief Brown distortion model * @brief Brown distortion model
@@ -205,6 +240,17 @@ public:
return distortion; return distortion;
} }
/**
* @brief Set the distortion parameters of the stream.
*
* @param distortion The distortion parameters.
*/
void setDistortion(const OBCameraDistortion &distortion) {
ob_error *error = nullptr;
ob_video_stream_profile_set_distortion(const_cast<ob_stream_profile_t *>(impl_), distortion, &error);
Error::handle(&error);
}
public: public:
// The following interfaces are deprecated and are retained here for compatibility purposes. // The following interfaces are deprecated and are retained here for compatibility purposes.
uint32_t fps() const { uint32_t fps() const {
@@ -113,7 +113,7 @@ public:
* OB_SENSOR_IR_LEFT, * OB_SENSOR_IR_LEFT,
* OB_SENSOR_IR_RIGHT, * OB_SENSOR_IR_RIGHT,
* *
* @param type * @param type The sensor type
* @return true * @return true
* @return false * @return false
*/ */
@@ -128,7 +128,7 @@ public:
* OB_STREAM_VIDEO, * OB_STREAM_VIDEO,
* OB_STREAM_DEPTH, * OB_STREAM_DEPTH,
* OB_STREAM_COLOR, * OB_STREAM_COLOR,
* OB_STREAM_IR, * OB_STREAM_IR,
* OB_STREAM_IR_LEFT, * OB_STREAM_IR_LEFT,
* OB_STREAM_IR_RIGHT, * OB_STREAM_IR_RIGHT,
* *
@@ -17,7 +17,7 @@
namespace ob { namespace ob {
class Device; class Device;
class CoordinateTransformHelper { class CoordinateTransformHelper {
public: public:
/** /**
* @brief Transform a 3d point of a source coordinate system into a 3d point of the target coordinate system. * @brief Transform a 3d point of a source coordinate system into a 3d point of the target coordinate system.
@@ -29,8 +29,8 @@ public:
* @return bool Transform result * @return bool Transform result
*/ */
static bool transformation3dto3d(const OBPoint3f source_point3f, OBExtrinsic extrinsic, OBPoint3f *target_point3f) { static bool transformation3dto3d(const OBPoint3f source_point3f, OBExtrinsic extrinsic, OBPoint3f *target_point3f) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = ob_transformation_3d_to_3d(source_point3f, extrinsic, target_point3f, &error); bool result = ob_transformation_3d_to_3d(source_point3f, extrinsic, target_point3f, &error);
Error::handle(&error); Error::handle(&error);
return result; return result;
} }
@@ -48,8 +48,8 @@ public:
*/ */
static bool transformation2dto3d(const OBPoint2f source_point2f, const float source_depth_pixel_value, const OBCameraIntrinsic source_intrinsic, static bool transformation2dto3d(const OBPoint2f source_point2f, const float source_depth_pixel_value, const OBCameraIntrinsic source_intrinsic,
OBExtrinsic extrinsic, OBPoint3f *target_point3f) { OBExtrinsic extrinsic, OBPoint3f *target_point3f) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = ob_transformation_2d_to_3d(source_point2f, source_depth_pixel_value, source_intrinsic, extrinsic, target_point3f, &error); bool result = ob_transformation_2d_to_3d(source_point2f, source_depth_pixel_value, source_intrinsic, extrinsic, target_point3f, &error);
Error::handle(&error); Error::handle(&error);
return result; return result;
} }
@@ -66,9 +66,9 @@ public:
* @return bool Transform result * @return bool Transform result
*/ */
static bool transformation3dto2d(const OBPoint3f source_point3f, const OBCameraIntrinsic target_intrinsic, const OBCameraDistortion target_distortion, static bool transformation3dto2d(const OBPoint3f source_point3f, const OBCameraIntrinsic target_intrinsic, const OBCameraDistortion target_distortion,
OBExtrinsic extrinsic, OBPoint2f *target_point2f) { OBExtrinsic extrinsic, OBPoint2f *target_point2f) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = ob_transformation_3d_to_2d(source_point3f, target_intrinsic, target_distortion, extrinsic, target_point2f, &error); bool result = ob_transformation_3d_to_2d(source_point3f, target_intrinsic, target_distortion, extrinsic, target_point2f, &error);
Error::handle(&error); Error::handle(&error);
return result; return result;
} }
@@ -90,7 +90,7 @@ public:
static bool transformation2dto2d(const OBPoint2f source_point2f, const float source_depth_pixel_value, const OBCameraIntrinsic source_intrinsic, static bool transformation2dto2d(const OBPoint2f source_point2f, const float source_depth_pixel_value, const OBCameraIntrinsic source_intrinsic,
const OBCameraDistortion source_distortion, const OBCameraIntrinsic target_intrinsic, const OBCameraDistortion source_distortion, const OBCameraIntrinsic target_intrinsic,
const OBCameraDistortion target_distortion, OBExtrinsic extrinsic, OBPoint2f *target_point2f) { const OBCameraDistortion target_distortion, OBExtrinsic extrinsic, OBPoint2f *target_point2f) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = ob_transformation_2d_to_2d(source_point2f, source_depth_pixel_value, source_intrinsic, source_distortion, target_intrinsic, bool result = ob_transformation_2d_to_2d(source_point2f, source_depth_pixel_value, source_intrinsic, source_distortion, target_intrinsic,
target_distortion, extrinsic, target_point2f, &error); target_distortion, extrinsic, target_point2f, &error);
Error::handle(&error); Error::handle(&error);
@@ -101,8 +101,8 @@ public:
// The following interfaces are deprecated and are retained here for compatibility purposes. // The following interfaces are deprecated and are retained here for compatibility purposes.
static bool calibration3dTo3d(const OBCalibrationParam calibrationParam, const OBPoint3f sourcePoint3f, const OBSensorType sourceSensorType, static bool calibration3dTo3d(const OBCalibrationParam calibrationParam, const OBPoint3f sourcePoint3f, const OBSensorType sourceSensorType,
const OBSensorType targetSensorType, OBPoint3f *targetPoint3f) { const OBSensorType targetSensorType, OBPoint3f *targetPoint3f) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = ob_calibration_3d_to_3d(calibrationParam, sourcePoint3f, sourceSensorType, targetSensorType, targetPoint3f, &error); bool result = ob_calibration_3d_to_3d(calibrationParam, sourcePoint3f, sourceSensorType, targetSensorType, targetPoint3f, &error);
Error::handle(&error); Error::handle(&error);
return result; return result;
} }
@@ -110,15 +110,16 @@ public:
static bool calibration2dTo3d(const OBCalibrationParam calibrationParam, const OBPoint2f sourcePoint2f, const float sourceDepthPixelValue, static bool calibration2dTo3d(const OBCalibrationParam calibrationParam, const OBPoint2f sourcePoint2f, const float sourceDepthPixelValue,
const OBSensorType sourceSensorType, const OBSensorType targetSensorType, OBPoint3f *targetPoint3f) { const OBSensorType sourceSensorType, const OBSensorType targetSensorType, OBPoint3f *targetPoint3f) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = ob_calibration_2d_to_3d(calibrationParam, sourcePoint2f, sourceDepthPixelValue, sourceSensorType, targetSensorType, targetPoint3f, &error); bool result =
ob_calibration_2d_to_3d(calibrationParam, sourcePoint2f, sourceDepthPixelValue, sourceSensorType, targetSensorType, targetPoint3f, &error);
Error::handle(&error); Error::handle(&error);
return result; return result;
} }
static bool calibration3dTo2d(const OBCalibrationParam calibrationParam, const OBPoint3f sourcePoint3f, const OBSensorType sourceSensorType, static bool calibration3dTo2d(const OBCalibrationParam calibrationParam, const OBPoint3f sourcePoint3f, const OBSensorType sourceSensorType,
const OBSensorType targetSensorType, OBPoint2f *targetPoint2f) { const OBSensorType targetSensorType, OBPoint2f *targetPoint2f) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = ob_calibration_3d_to_2d(calibrationParam, sourcePoint3f, sourceSensorType, targetSensorType, targetPoint2f, &error); bool result = ob_calibration_3d_to_2d(calibrationParam, sourcePoint3f, sourceSensorType, targetSensorType, targetPoint2f, &error);
Error::handle(&error); Error::handle(&error);
return result; return result;
} }
@@ -126,7 +127,8 @@ public:
static bool calibration2dTo2d(const OBCalibrationParam calibrationParam, const OBPoint2f sourcePoint2f, const float sourceDepthPixelValue, static bool calibration2dTo2d(const OBCalibrationParam calibrationParam, const OBPoint2f sourcePoint2f, const float sourceDepthPixelValue,
const OBSensorType sourceSensorType, const OBSensorType targetSensorType, OBPoint2f *targetPoint2f) { const OBSensorType sourceSensorType, const OBSensorType targetSensorType, OBPoint2f *targetPoint2f) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = ob_calibration_2d_to_2d(calibrationParam, sourcePoint2f, sourceDepthPixelValue, sourceSensorType, targetSensorType, targetPoint2f, &error); bool result =
ob_calibration_2d_to_2d(calibrationParam, sourcePoint2f, sourceDepthPixelValue, sourceSensorType, targetSensorType, targetPoint2f, &error);
Error::handle(&error); Error::handle(&error);
return result; return result;
} }
@@ -138,15 +140,15 @@ public:
// unsafe operation, need to cast const to non-const // unsafe operation, need to cast const to non-const
auto unConstImpl = const_cast<ob_frame *>(depthFrame->getImpl()); auto unConstImpl = const_cast<ob_frame *>(depthFrame->getImpl());
auto result = transformation_depth_frame_to_color_camera(device->getImpl() , unConstImpl, targetColorCameraWidth, targetColorCameraHeight, &error); auto result = transformation_depth_frame_to_color_camera(device->getImpl(), unConstImpl, targetColorCameraWidth, targetColorCameraHeight, &error);
Error::handle(&error); Error::handle(&error);
return std::make_shared<ob::Frame>(result); return std::make_shared<ob::Frame>(result);
} }
static bool transformationInitXYTables(const OBCalibrationParam calibrationParam, const OBSensorType sensorType, float *data, uint32_t *dataSize, static bool transformationInitXYTables(const OBCalibrationParam calibrationParam, const OBSensorType sensorType, float *data, uint32_t *dataSize,
OBXYTables *xyTables) { OBXYTables *xyTables) {
ob_error *error = NULL; ob_error *error = NULL;
bool result = transformation_init_xy_tables(calibrationParam, sensorType, data, dataSize, xyTables, &error); bool result = transformation_init_xy_tables(calibrationParam, sensorType, data, dataSize, xyTables, &error);
Error::handle(&error); Error::handle(&error);
return result; return result;
} }
@@ -157,11 +159,32 @@ public:
Error::handle(&error, false); Error::handle(&error, false);
} }
static void transformationDepthToRGBDPointCloud(OBXYTables *xyTables, const void *depthImageData, const void *colorImageData, void *pointCloudData){ static void transformationDepthToRGBDPointCloud(OBXYTables *xyTables, const void *depthImageData, const void *colorImageData, void *pointCloudData) {
ob_error *error = NULL; ob_error *error = NULL;
transformation_depth_to_rgbd_pointcloud(xyTables, depthImageData, colorImageData, pointCloudData, &error); transformation_depth_to_rgbd_pointcloud(xyTables, depthImageData, colorImageData, pointCloudData, &error);
Error::handle(&error, false); Error::handle(&error, false);
} }
}; };
} // namespace ob
class PointCloudHelper {
public:
/**
* @brief save point cloud to ply file.
*
* @param[in] fileName Point cloud save path
* @param[in] frame Point cloud frame
* @param[in] saveBinary Binary or textual,true: binary, false: textual
* @param[in] useMesh Save mesh or not, true: save as mesh, false: not save as mesh
* @param[in] meshThreshold Distance threshold for creating faces in point cloud,default value :50
*
* @return bool save point cloud result
*/
static bool savePointcloudToPly(const char *fileName, std::shared_ptr<ob::Frame> frame, bool saveBinary, bool useMesh, float meshThreshold) {
ob_error *error = NULL;
auto unConstImpl = const_cast<ob_frame *>(frame->getImpl());
bool result = ob_save_pointcloud_to_ply(fileName, unConstImpl, saveBinary, useMesh, meshThreshold, &error);
Error::handle(&error, false);
return result;
}
};
} // namespace ob
@@ -8,12 +8,12 @@ set(CMAKE_IMPORT_FILE_VERSION 1)
# Import target "ob::OrbbecSDK" for configuration "Release" # Import target "ob::OrbbecSDK" for configuration "Release"
set_property(TARGET ob::OrbbecSDK APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) set_property(TARGET ob::OrbbecSDK APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(ob::OrbbecSDK PROPERTIES set_target_properties(ob::OrbbecSDK PROPERTIES
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.2.8" IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.4.1"
IMPORTED_SONAME_RELEASE "libOrbbecSDK.so.2" IMPORTED_SONAME_RELEASE "libOrbbecSDK.so.2"
) )
list(APPEND _cmake_import_check_targets ob::OrbbecSDK ) list(APPEND _cmake_import_check_targets ob::OrbbecSDK )
list(APPEND _cmake_import_check_files_for_ob::OrbbecSDK "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.2.8" ) list(APPEND _cmake_import_check_files_for_ob::OrbbecSDK "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.4.1" )
# Commands beyond this point should not need to know the version. # Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION) set(CMAKE_IMPORT_FILE_VERSION)
@@ -0,0 +1 @@
libdepthengine.so.2.0
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
libOrbbecSDK.so.2
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
libOrbbecSDK.so.2.4.1
@@ -8,12 +8,12 @@ set(CMAKE_IMPORT_FILE_VERSION 1)
# Import target "ob::OrbbecSDK" for configuration "Release" # Import target "ob::OrbbecSDK" for configuration "Release"
set_property(TARGET ob::OrbbecSDK APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) set_property(TARGET ob::OrbbecSDK APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(ob::OrbbecSDK PROPERTIES set_target_properties(ob::OrbbecSDK PROPERTIES
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.2.8" IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.4.1"
IMPORTED_SONAME_RELEASE "libOrbbecSDK.so.2" IMPORTED_SONAME_RELEASE "libOrbbecSDK.so.2"
) )
list(APPEND _cmake_import_check_targets ob::OrbbecSDK ) list(APPEND _cmake_import_check_targets ob::OrbbecSDK )
list(APPEND _cmake_import_check_files_for_ob::OrbbecSDK "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.2.8" ) list(APPEND _cmake_import_check_files_for_ob::OrbbecSDK "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.4.1" )
# Commands beyond this point should not need to know the version. # Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION) set(CMAKE_IMPORT_FILE_VERSION)
@@ -0,0 +1 @@
libdepthengine.so.2.0
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
libOrbbecSDK.so.2
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
libOrbbecSDK.so.2.4.1
File diff suppressed because it is too large Load Diff
+26 -18
View File
@@ -1,4 +1,4 @@
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0501", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Bootloader Device" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0501", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Bootloader Device"
# UVC Modules # UVC Modules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0635", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Femto" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0635", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Femto"
@@ -11,25 +11,33 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0537", MODE:="066
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0669", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Femto-mega" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0669", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Femto-mega"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="066b", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Femto Bolt" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="066b", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Femto Bolt"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0660", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Astra 2" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0660", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Astra 2"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0670", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 2" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0670", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 2"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0671", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 2 XL" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0671", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 2 XL"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0673", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 2 L" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0673", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 2 L"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0675", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 2 VL" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0675", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 2 VL"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0800", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 335" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0800", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 335"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0801", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 330" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0801", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 330"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0802", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini dm330" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0802", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini dm330"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0803", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 336" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0803", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 336"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0804", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 335L" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0804", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 335L"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0805", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 330L" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0805", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 330L"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0806", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini dm330L" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0806", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini dm330L"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0807", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 336L" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0807", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 336L"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080b", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 335Lg" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080b", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 335Lg"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080d", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 336Lg" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080d", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 336Lg"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080e", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 335Le" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="080e", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 335Le"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0810", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 336Le" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0810", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 336Le"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0674", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Orbbec Gemini 2 I" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0674", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 2 I"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0701", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Dabai DCL" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0701", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Dabai DCL"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="069d", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Astra Pro2" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="069d", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Astra Pro2"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0808", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 215"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0809", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 210"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0a12", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Dabai A"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0a13", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Dabai AL"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0812", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 345"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0813", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini 345Lg"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0816", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="CAM-5330"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0817", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="CAM-5530"
# OpenNI Modules # OpenNI Modules
SUBSYSTEM=="usb", ATTR{idProduct}=="0401", ATTR{idVendor}=="2bc5", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="astra" SUBSYSTEM=="usb", ATTR{idProduct}=="0401", ATTR{idVendor}=="2bc5", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="astra"