depthai_sys/
lib.rs

1// Use autocxx to generate C++ bindings
2use autocxx::prelude::*;
3
4include_cpp! {
5    #include "autocxx_wrapper.h"
6
7    // Version information helpers
8    generate!("dai::dai_build_version")
9    generate!("dai::dai_build_version_major")
10    generate!("dai::dai_build_version_minor")
11    generate!("dai::dai_build_version_patch")
12    generate!("dai::dai_build_pre_release_type")
13    generate!("dai::dai_build_pre_release_version")
14    generate!("dai::dai_build_commit")
15    generate!("dai::dai_build_commit_datetime")
16    generate!("dai::dai_build_build_datetime")
17    generate!("dai::dai_build_device_version")
18    generate!("dai::dai_build_bootloader_version")
19    generate!("dai::dai_build_device_rvc3_version")
20    generate!("dai::dai_build_device_rvc4_version")
21
22    // Device functions
23    generate!("dai::dai_device_new")
24    generate!("dai::dai_device_clone")
25    generate!("dai::dai_device_delete")
26    generate!("dai::dai_device_is_closed")
27    generate!("dai::dai_device_close")
28    generate!("dai::dai_device_get_connected_camera_sockets")
29    generate!("dai::dai_pipeline_new_with_device")
30
31    // Pipeline functions
32    generate!("dai::dai_pipeline_start_default")
33    generate!("dai::dai_pipeline_get_default_device")
34    generate!("dai::dai_pipeline_new")
35    generate!("dai::dai_pipeline_new_ex")
36    generate!("dai::dai_pipeline_delete")
37    generate!("dai::dai_pipeline_start")
38    generate!("dai::dai_pipeline_is_running")
39    generate!("dai::dai_pipeline_is_built")
40    generate!("dai::dai_pipeline_build")
41    generate!("dai::dai_pipeline_wait")
42    generate!("dai::dai_pipeline_stop")
43    generate!("dai::dai_pipeline_run")
44    generate!("dai::dai_pipeline_process_tasks")
45    generate!("dai::dai_pipeline_set_xlink_chunk_size")
46    generate!("dai::dai_pipeline_set_sipp_buffer_size")
47    generate!("dai::dai_pipeline_set_sipp_dma_buffer_size")
48    generate!("dai::dai_pipeline_set_camera_tuning_blob_path")
49    generate!("dai::dai_pipeline_set_openvino_version")
50    generate!("dai::dai_pipeline_serialize_to_json")
51    generate!("dai::dai_pipeline_get_schema_json")
52    generate!("dai::dai_pipeline_get_all_nodes_json")
53    generate!("dai::dai_pipeline_get_source_nodes_json")
54    generate!("dai::dai_pipeline_get_node_by_id")
55    generate!("dai::dai_pipeline_remove_node")
56    generate!("dai::dai_pipeline_get_connections_json")
57    generate!("dai::dai_pipeline_get_connection_map_json")
58    generate!("dai::dai_pipeline_is_calibration_data_available")
59    generate!("dai::dai_pipeline_get_calibration_data_json")
60    generate!("dai::dai_pipeline_set_calibration_data_json")
61    generate!("dai::dai_pipeline_get_global_properties_json")
62    generate!("dai::dai_pipeline_set_global_properties_json")
63    generate!("dai::dai_pipeline_get_board_config_json")
64    generate!("dai::dai_pipeline_set_board_config_json")
65    generate!("dai::dai_pipeline_get_device_config_json")
66    generate!("dai::dai_pipeline_get_eeprom_data_json")
67    generate!("dai::dai_pipeline_set_eeprom_data_json")
68    generate!("dai::dai_pipeline_get_eeprom_id")
69    generate!("dai::dai_pipeline_enable_holistic_record_json")
70    generate!("dai::dai_pipeline_enable_holistic_replay")
71    generate!("dai::dai_pipeline_create_host_node")
72    generate!("dai::dai_pipeline_create_threaded_host_node")
73    generate!("dai::dai_rgbd_build")
74    generate!("dai::dai_rgbd_build_ex")
75    generate!("dai::dai_pipeline_create_camera")
76
77    // Generic node creation / linking
78    generate!("dai::dai_pipeline_create_node_by_name")
79    generate!("dai::dai_node_get_output")
80    generate!("dai::dai_node_get_input")
81    generate!("dai::dai_node_get_id")
82    generate!("dai::dai_node_get_alias")
83    generate!("dai::dai_node_set_alias")
84    generate!("dai::dai_node_get_name")
85    generate!("dai::dai_output_link")
86    generate!("dai::dai_output_link_input")
87    generate!("dai::dai_node_link")
88    generate!("dai::dai_node_unlink")
89
90    // Host node helpers
91    generate!("dai::dai_hostnode_get_input")
92    generate!("dai::dai_hostnode_run_sync_on_host")
93    generate!("dai::dai_hostnode_run_sync_on_device")
94    generate!("dai::dai_hostnode_send_processing_to_pipeline")
95    generate!("dai::dai_threaded_hostnode_create_input")
96    generate!("dai::dai_threaded_hostnode_create_output")
97    generate!("dai::dai_threaded_node_is_running")
98
99    // Device helpers
100    generate!("dai::dai_device_get_platform")
101    generate!("dai::dai_device_set_ir_laser_dot_projector_intensity")
102
103    // StereoDepth configuration helpers
104    generate!("dai::dai_stereo_set_subpixel")
105    generate!("dai::dai_stereo_set_extended_disparity")
106    generate!("dai::dai_stereo_set_default_profile_preset")
107    generate!("dai::dai_stereo_set_left_right_check")
108    generate!("dai::dai_stereo_set_rectify_edge_fill_color")
109    generate!("dai::dai_stereo_enable_distortion_correction")
110    generate!("dai::dai_stereo_set_output_size")
111    generate!("dai::dai_stereo_set_output_keep_aspect_ratio")
112    generate!("dai::dai_stereo_initial_set_left_right_check_threshold")
113    generate!("dai::dai_stereo_initial_set_threshold_filter_max_range")
114
115    // RGBD configuration helpers
116    generate!("dai::dai_rgbd_set_depth_unit")
117
118    // ImageAlign helpers
119    generate!("dai::dai_image_align_set_run_on_host")
120    generate!("dai::dai_image_align_set_output_size")
121    generate!("dai::dai_image_align_set_out_keep_aspect_ratio")
122
123    // ImageManip helpers
124    generate!("dai::dai_image_manip_set_num_frames_pool")
125    generate!("dai::dai_image_manip_set_max_output_frame_size")
126    generate!("dai::dai_image_manip_set_run_on_host")
127    generate!("dai::dai_image_manip_set_backend")
128    generate!("dai::dai_image_manip_set_performance_mode")
129    generate!("dai::dai_image_manip_run_on_host")
130    generate!("dai::dai_image_manip_run")
131    generate!("dai::dai_image_manip_config_new")
132    generate!("dai::dai_image_manip_get_initial_config")
133    generate!("dai::dai_image_manip_config_clear_ops")
134    generate!("dai::dai_image_manip_config_add_crop_xywh")
135    generate!("dai::dai_image_manip_config_add_crop_rect")
136    generate!("dai::dai_image_manip_config_add_crop_rotated_rect")
137    generate!("dai::dai_image_manip_config_add_scale")
138    generate!("dai::dai_image_manip_config_add_rotate_deg")
139    generate!("dai::dai_image_manip_config_add_rotate_deg_center")
140    generate!("dai::dai_image_manip_config_add_flip_horizontal")
141    generate!("dai::dai_image_manip_config_add_flip_vertical")
142    generate!("dai::dai_image_manip_config_add_transform_affine")
143    generate!("dai::dai_image_manip_config_add_transform_perspective")
144    generate!("dai::dai_image_manip_config_add_transform_four_points")
145    generate!("dai::dai_image_manip_config_set_output_size")
146    generate!("dai::dai_image_manip_config_set_output_center")
147    generate!("dai::dai_image_manip_config_set_colormap")
148    generate!("dai::dai_image_manip_config_set_background_color_rgb")
149    generate!("dai::dai_image_manip_config_set_background_color_gray")
150    generate!("dai::dai_image_manip_config_set_frame_type")
151    generate!("dai::dai_image_manip_config_set_undistort")
152    generate!("dai::dai_image_manip_config_get_undistort")
153    generate!("dai::dai_image_manip_config_set_reuse_previous_image")
154    generate!("dai::dai_image_manip_config_set_skip_current_image")
155    generate!("dai::dai_image_manip_config_get_reuse_previous_image")
156    generate!("dai::dai_image_manip_config_get_skip_current_image")
157
158    // VideoEncoder helpers
159    generate!("dai::dai_video_encoder_set_default_profile_preset")
160    generate!("dai::dai_video_encoder_set_num_frames_pool")
161    generate!("dai::dai_video_encoder_get_num_frames_pool")
162    generate!("dai::dai_video_encoder_set_rate_control_mode")
163    generate!("dai::dai_video_encoder_get_rate_control_mode")
164    generate!("dai::dai_video_encoder_set_profile")
165    generate!("dai::dai_video_encoder_get_profile")
166    generate!("dai::dai_video_encoder_set_bitrate")
167    generate!("dai::dai_video_encoder_get_bitrate")
168    generate!("dai::dai_video_encoder_set_bitrate_kbps")
169    generate!("dai::dai_video_encoder_get_bitrate_kbps")
170    generate!("dai::dai_video_encoder_set_keyframe_frequency")
171    generate!("dai::dai_video_encoder_get_keyframe_frequency")
172    generate!("dai::dai_video_encoder_set_num_bframes")
173    generate!("dai::dai_video_encoder_get_num_bframes")
174    generate!("dai::dai_video_encoder_set_quality")
175    generate!("dai::dai_video_encoder_get_quality")
176    generate!("dai::dai_video_encoder_set_lossless")
177    generate!("dai::dai_video_encoder_get_lossless")
178    generate!("dai::dai_video_encoder_set_frame_rate")
179    generate!("dai::dai_video_encoder_get_frame_rate")
180    generate!("dai::dai_video_encoder_set_max_output_frame_size")
181    generate!("dai::dai_video_encoder_get_max_output_frame_size")
182
183    // Camera functions
184    generate!("dai::dai_camera_request_output")
185    generate!("dai::dai_camera_request_full_resolution_output")
186    generate!("dai::dai_camera_request_full_resolution_output_ex")
187    generate!("dai::dai_camera_build")
188    generate!("dai::dai_camera_get_board_socket")
189    generate!("dai::dai_camera_get_max_width")
190    generate!("dai::dai_camera_get_max_height")
191    generate!("dai::dai_camera_set_sensor_type")
192    generate!("dai::dai_camera_get_sensor_type")
193    generate!("dai::dai_camera_set_raw_num_frames_pool")
194    generate!("dai::dai_camera_set_max_size_pool_raw")
195    generate!("dai::dai_camera_set_isp_num_frames_pool")
196    generate!("dai::dai_camera_set_max_size_pool_isp")
197    generate!("dai::dai_camera_set_num_frames_pools")
198    generate!("dai::dai_camera_set_max_size_pools")
199    generate!("dai::dai_camera_set_outputs_num_frames_pool")
200    generate!("dai::dai_camera_set_outputs_max_size_pool")
201    generate!("dai::dai_camera_get_raw_num_frames_pool")
202    generate!("dai::dai_camera_get_max_size_pool_raw")
203    generate!("dai::dai_camera_get_isp_num_frames_pool")
204    generate!("dai::dai_camera_get_max_size_pool_isp")
205    generate!("dai::dai_camera_get_outputs_num_frames_pool")
206    generate!("dai::dai_camera_get_outputs_max_size_pool")
207
208    // Queue/frame helpers
209    generate!("dai::dai_output_create_queue")
210    generate!("dai::dai_queue_delete")
211
212    // Generic queue controls / status
213    generate!("dai::dai_queue_get_name")
214    generate!("dai::dai_queue_set_name")
215    generate!("dai::dai_queue_is_closed")
216    generate!("dai::dai_queue_close")
217    generate!("dai::dai_queue_set_blocking")
218    generate!("dai::dai_queue_get_blocking")
219    generate!("dai::dai_queue_set_max_size")
220    generate!("dai::dai_queue_get_max_size")
221    generate!("dai::dai_queue_get_size")
222    generate!("dai::dai_queue_is_full")
223    generate!("dai::dai_queue_has")
224
225    // Generic message retrieval (untyped)
226    generate!("dai::dai_queue_get")
227    generate!("dai::dai_queue_try_get")
228    generate!("dai::dai_queue_front")
229    generate!("dai::dai_queue_try_get_all")
230    generate!("dai::dai_queue_get_all")
231
232    // Queue callbacks
233    generate!("dai::dai_queue_add_callback")
234    generate!("dai::dai_queue_remove_callback")
235
236    // Queue send helpers
237    generate!("dai::dai_queue_send")
238    generate!("dai::dai_queue_send_timeout")
239    generate!("dai::dai_queue_try_send")
240
241    generate!("dai::dai_queue_get_frame")
242    generate!("dai::dai_queue_try_get_frame")
243    generate!("dai::dai_queue_get_encoded_frame")
244    generate!("dai::dai_queue_try_get_encoded_frame")
245    generate!("dai::dai_queue_get_pointcloud")
246    generate!("dai::dai_queue_try_get_pointcloud")
247    generate!("dai::dai_queue_get_rgbd")
248    generate!("dai::dai_queue_try_get_rgbd")
249
250    // Generic datatype helpers
251    generate!("dai::dai_datatype_release")
252    generate!("dai::dai_datatype_clone")
253    generate!("dai::dai_datatype_get_datatype_enum")
254    generate!("dai::dai_datatype_as_img_frame")
255    generate!("dai::dai_datatype_as_encoded_frame")
256    generate!("dai::dai_datatype_as_pointcloud")
257    generate!("dai::dai_datatype_as_rgbd")
258    generate!("dai::dai_datatype_as_buffer")
259    generate!("dai::dai_datatype_as_message_group")
260    generate!("dai::dai_datatype_array_len")
261    generate!("dai::dai_datatype_array_take")
262    generate!("dai::dai_datatype_array_free")
263    generate!("dai::dai_frame_get_data")
264    generate!("dai::dai_frame_get_width")
265    generate!("dai::dai_frame_get_height")
266    generate!("dai::dai_frame_get_type")
267    generate!("dai::dai_frame_get_size")
268    generate!("dai::dai_frame_release")
269
270    // EncodedFrame accessors
271    generate!("dai::dai_encoded_frame_get_data")
272    generate!("dai::dai_encoded_frame_get_data_size")
273    generate!("dai::dai_encoded_frame_get_frame_offset")
274    generate!("dai::dai_encoded_frame_get_frame_size")
275    generate!("dai::dai_encoded_frame_get_width")
276    generate!("dai::dai_encoded_frame_get_height")
277    generate!("dai::dai_encoded_frame_get_profile")
278    generate!("dai::dai_encoded_frame_get_frame_type")
279    generate!("dai::dai_encoded_frame_get_quality")
280    generate!("dai::dai_encoded_frame_get_bitrate")
281    generate!("dai::dai_encoded_frame_get_lossless")
282    generate!("dai::dai_encoded_frame_get_instance_num")
283    generate!("dai::dai_encoded_frame_release")
284
285    // PointCloudData accessors
286    generate!("dai::dai_pointcloud_get_width")
287    generate!("dai::dai_pointcloud_get_height")
288    generate!("dai::dai_pointcloud_get_points_rgba")
289    generate!("dai::dai_pointcloud_get_points_rgba_len")
290    generate!("dai::dai_pointcloud_release")
291
292    // RGBDData accessors
293    generate!("dai::dai_rgbd_get_rgb_frame")
294    generate!("dai::dai_rgbd_get_depth_frame")
295    generate!("dai::dai_rgbd_release")
296
297    // Input queue helpers
298    generate!("dai::dai_input_get_buffer")
299    generate!("dai::dai_input_try_get_buffer")
300    generate!("dai::dai_input_get_img_frame")
301    generate!("dai::dai_input_try_get_img_frame")
302
303    // Host -> device input queue (depthai::InputQueue)
304    generate!("dai::dai_input_create_input_queue")
305    generate!("dai::dai_input_queue_delete")
306    generate!("dai::dai_input_queue_send")
307
308    // Output send helpers
309    generate!("dai::dai_output_send_buffer")
310    generate!("dai::dai_output_send_img_frame")
311
312    // MessageGroup helpers
313    generate!("dai::dai_message_group_clone")
314    generate!("dai::dai_message_group_release")
315    generate!("dai::dai_message_group_get_buffer")
316    generate!("dai::dai_message_group_get_img_frame")
317
318    // Buffer helpers
319    generate!("dai::dai_buffer_new")
320    generate!("dai::dai_buffer_release")
321    generate!("dai::dai_buffer_set_data")
322
323    // Utilities
324    generate!("dai::dai_camera_socket_name")
325    generate!("dai::dai_string_to_cstring")
326    generate!("dai::dai_free_cstring")
327    generate!("dai::dai_get_last_error")
328    generate!("dai::dai_clear_last_error")
329
330    safety!(unsafe_ffi)
331}
332
333// Define our own opaque handle types for type safety
334// These are just wrappers around void* but provide type distinction
335pub type DaiDevice = *mut autocxx::c_void;
336pub type DaiPipeline = *mut autocxx::c_void;
337pub type DaiNode = *mut autocxx::c_void;
338pub type DaiCameraNode = *mut autocxx::c_void;
339pub type DaiOutput = *mut autocxx::c_void;
340pub type DaiInput = *mut autocxx::c_void;
341pub type DaiDataQueue = *mut autocxx::c_void;
342pub type DaiDatatype = *mut autocxx::c_void;
343pub type DaiImgFrame = *mut autocxx::c_void;
344pub type DaiEncodedFrame = *mut autocxx::c_void;
345pub type DaiPointCloud = *mut autocxx::c_void;
346pub type DaiRGBDData = *mut autocxx::c_void;
347pub type DaiMessageGroup = *mut autocxx::c_void;
348pub type DaiBuffer = *mut autocxx::c_void;
349pub type DaiInputQueue = *mut autocxx::c_void;
350
351pub mod string_utils;
352
353// Re-export for convenience
354pub use ffi::*;
355
356pub mod depthai {
357    pub use crate::ffi::dai::*;
358
359    unsafe extern "C" {
360        pub fn dai_pipeline_create_host_node(
361            pipeline: super::DaiPipeline,
362            ctx: *mut std::ffi::c_void,
363            process_cb: Option<
364                unsafe extern "C" fn(
365                    ctx: *mut std::ffi::c_void,
366                    group: super::DaiMessageGroup,
367                ) -> super::DaiBuffer,
368            >,
369            on_start_cb: Option<unsafe extern "C" fn(ctx: *mut std::ffi::c_void)>,
370            on_stop_cb: Option<unsafe extern "C" fn(ctx: *mut std::ffi::c_void)>,
371            drop_cb: Option<unsafe extern "C" fn(ctx: *mut std::ffi::c_void)>,
372        ) -> super::DaiNode;
373
374        pub fn dai_pipeline_create_threaded_host_node(
375            pipeline: super::DaiPipeline,
376            ctx: *mut std::ffi::c_void,
377            run_cb: Option<unsafe extern "C" fn(ctx: *mut std::ffi::c_void)>,
378            on_start_cb: Option<unsafe extern "C" fn(ctx: *mut std::ffi::c_void)>,
379            on_stop_cb: Option<unsafe extern "C" fn(ctx: *mut std::ffi::c_void)>,
380            drop_cb: Option<unsafe extern "C" fn(ctx: *mut std::ffi::c_void)>,
381        ) -> super::DaiNode;
382    }
383}