azure_kinect_sys/
api.rs

1use crate::loader::Module;
2use crate::Error;
3
4const K4A_LIBNAME: &'static str = "k4a.dll";
5const K4ARECORD_LIBNAME: &'static str = "k4arecord.dll";
6
7macro_rules! proc_address {
8    ($m:ident, $proc_name:ident) => {
9        std::mem::transmute($m.get_proc_address(concat!(stringify!($proc_name), "\0").as_ptr())?)
10    };
11}
12
13pub struct Api {
14    #[allow(dead_code)]
15    module_k4a: Module, //  Module manages a dynamic link library
16    pub funcs: super::k4a::Funcs,
17}
18
19impl Api {
20    pub(crate) fn with_module(module_k4a: Module) -> Result<Api, Error> {
21        unsafe {
22            let funcs = super::k4a::Funcs {
23                k4a_device_get_installed_count: proc_address!(
24                    module_k4a,
25                    k4a_device_get_installed_count
26                ),
27                k4a_set_debug_message_handler: proc_address!(
28                    module_k4a,
29                    k4a_set_debug_message_handler
30                ),
31                k4a_set_allocator: proc_address!(module_k4a, k4a_set_allocator),
32                k4a_device_open: proc_address!(module_k4a, k4a_device_open),
33                k4a_device_close: proc_address!(module_k4a, k4a_device_close),
34                k4a_device_get_capture: proc_address!(module_k4a, k4a_device_get_capture),
35                k4a_device_get_imu_sample: proc_address!(module_k4a, k4a_device_get_imu_sample),
36                k4a_capture_create: proc_address!(module_k4a, k4a_capture_create),
37                k4a_capture_release: proc_address!(module_k4a, k4a_capture_release),
38                k4a_capture_reference: proc_address!(module_k4a, k4a_capture_reference),
39                k4a_capture_get_color_image: proc_address!(module_k4a, k4a_capture_get_color_image),
40                k4a_capture_get_depth_image: proc_address!(module_k4a, k4a_capture_get_depth_image),
41                k4a_capture_get_ir_image: proc_address!(module_k4a, k4a_capture_get_ir_image),
42                k4a_capture_set_color_image: proc_address!(module_k4a, k4a_capture_set_color_image),
43                k4a_capture_set_depth_image: proc_address!(module_k4a, k4a_capture_set_depth_image),
44                k4a_capture_set_ir_image: proc_address!(module_k4a, k4a_capture_set_ir_image),
45                k4a_capture_set_temperature_c: proc_address!(
46                    module_k4a,
47                    k4a_capture_set_temperature_c
48                ),
49                k4a_capture_get_temperature_c: proc_address!(
50                    module_k4a,
51                    k4a_capture_get_temperature_c
52                ),
53                k4a_image_create: proc_address!(module_k4a, k4a_image_create),
54                k4a_image_create_from_buffer: proc_address!(
55                    module_k4a,
56                    k4a_image_create_from_buffer
57                ),
58                k4a_image_get_buffer: proc_address!(module_k4a, k4a_image_get_buffer),
59                k4a_image_get_size: proc_address!(module_k4a, k4a_image_get_size),
60                k4a_image_get_format: proc_address!(module_k4a, k4a_image_get_format),
61                k4a_image_get_width_pixels: proc_address!(module_k4a, k4a_image_get_width_pixels),
62                k4a_image_get_height_pixels: proc_address!(module_k4a, k4a_image_get_height_pixels),
63                k4a_image_get_stride_bytes: proc_address!(module_k4a, k4a_image_get_stride_bytes),
64                k4a_image_get_timestamp_usec: proc_address!(
65                    module_k4a,
66                    k4a_image_get_timestamp_usec
67                ),
68                k4a_image_get_device_timestamp_usec: proc_address!(
69                    module_k4a,
70                    k4a_image_get_device_timestamp_usec
71                ),
72                k4a_image_get_system_timestamp_nsec: proc_address!(
73                    module_k4a,
74                    k4a_image_get_system_timestamp_nsec
75                ),
76                k4a_image_get_exposure_usec: proc_address!(module_k4a, k4a_image_get_exposure_usec),
77                k4a_image_get_white_balance: proc_address!(module_k4a, k4a_image_get_white_balance),
78                k4a_image_get_iso_speed: proc_address!(module_k4a, k4a_image_get_iso_speed),
79                k4a_image_set_device_timestamp_usec: proc_address!(
80                    module_k4a,
81                    k4a_image_set_device_timestamp_usec
82                ),
83                k4a_image_set_timestamp_usec: proc_address!(
84                    module_k4a,
85                    k4a_image_set_timestamp_usec
86                ),
87                k4a_image_set_system_timestamp_nsec: proc_address!(
88                    module_k4a,
89                    k4a_image_set_system_timestamp_nsec
90                ),
91                k4a_image_set_exposure_usec: proc_address!(module_k4a, k4a_image_set_exposure_usec),
92                k4a_image_set_exposure_time_usec: proc_address!(
93                    module_k4a,
94                    k4a_image_set_exposure_time_usec
95                ),
96                k4a_image_set_white_balance: proc_address!(module_k4a, k4a_image_set_white_balance),
97                k4a_image_set_iso_speed: proc_address!(module_k4a, k4a_image_set_iso_speed),
98                k4a_image_reference: proc_address!(module_k4a, k4a_image_reference),
99                k4a_image_release: proc_address!(module_k4a, k4a_image_release),
100                k4a_device_start_cameras: proc_address!(module_k4a, k4a_device_start_cameras),
101                k4a_device_stop_cameras: proc_address!(module_k4a, k4a_device_stop_cameras),
102                k4a_device_start_imu: proc_address!(module_k4a, k4a_device_start_imu),
103                k4a_device_stop_imu: proc_address!(module_k4a, k4a_device_stop_imu),
104                k4a_device_get_serialnum: proc_address!(module_k4a, k4a_device_get_serialnum),
105                k4a_device_get_version: proc_address!(module_k4a, k4a_device_get_version),
106                k4a_device_get_color_control_capabilities: proc_address!(
107                    module_k4a,
108                    k4a_device_get_color_control_capabilities
109                ),
110                k4a_device_get_color_control: proc_address!(
111                    module_k4a,
112                    k4a_device_get_color_control
113                ),
114                k4a_device_set_color_control: proc_address!(
115                    module_k4a,
116                    k4a_device_set_color_control
117                ),
118                k4a_device_get_raw_calibration: proc_address!(
119                    module_k4a,
120                    k4a_device_get_raw_calibration
121                ),
122                k4a_device_get_calibration: proc_address!(module_k4a, k4a_device_get_calibration),
123                k4a_device_get_sync_jack: proc_address!(module_k4a, k4a_device_get_sync_jack),
124                k4a_calibration_get_from_raw: proc_address!(
125                    module_k4a,
126                    k4a_calibration_get_from_raw
127                ),
128                k4a_calibration_3d_to_3d: proc_address!(module_k4a, k4a_calibration_3d_to_3d),
129                k4a_calibration_2d_to_3d: proc_address!(module_k4a, k4a_calibration_2d_to_3d),
130                k4a_calibration_3d_to_2d: proc_address!(module_k4a, k4a_calibration_3d_to_2d),
131                k4a_calibration_2d_to_2d: proc_address!(module_k4a, k4a_calibration_2d_to_2d),
132                k4a_calibration_color_2d_to_depth_2d: proc_address!(
133                    module_k4a,
134                    k4a_calibration_color_2d_to_depth_2d
135                ),
136                k4a_transformation_create: proc_address!(module_k4a, k4a_transformation_create),
137                k4a_transformation_destroy: proc_address!(module_k4a, k4a_transformation_destroy),
138                k4a_transformation_depth_image_to_color_camera: proc_address!(
139                    module_k4a,
140                    k4a_transformation_depth_image_to_color_camera
141                ),
142                k4a_transformation_depth_image_to_color_camera_custom: proc_address!(
143                    module_k4a,
144                    k4a_transformation_depth_image_to_color_camera_custom
145                ),
146                k4a_transformation_color_image_to_depth_camera: proc_address!(
147                    module_k4a,
148                    k4a_transformation_color_image_to_depth_camera
149                ),
150                k4a_transformation_depth_image_to_point_cloud: proc_address!(
151                    module_k4a,
152                    k4a_transformation_depth_image_to_point_cloud
153                ),
154            };
155
156            Ok(Api { module_k4a, funcs })
157        }
158    }
159
160    pub fn new() -> Result<Api, Error> {
161        Self::with_library_directory(
162            std::env::current_exe()
163                .map_err(|_| Error::Failed)?
164                .parent()
165                .ok_or(Error::Failed)?
166                .to_str()
167                .ok_or(Error::Failed)?,
168        )
169    }
170
171    pub fn with_library_directory(lib_dir: &str) -> Result<Api, Error> {
172        Self::with_module(Module::load_library(lib_dir, K4A_LIBNAME)?)
173    }
174
175    pub fn with_get_module() -> Result<Api, Error> {
176        Self::with_module(Module::get_module(K4A_LIBNAME)?)
177    }
178}
179
180pub struct ApiRecord {
181    #[allow(dead_code)]
182    pub(crate) module_k4arecord: Module, //  Module manages a dynamic link library
183    pub funcs: super::k4arecord::Funcs,
184}
185
186impl ApiRecord {
187    pub(crate) fn with_module(module_k4arecord: Module) -> Result<ApiRecord, Error> {
188        unsafe {
189            let funcs = super::k4arecord::Funcs {
190                k4a_record_create: proc_address!(module_k4arecord, k4a_record_create),
191                k4a_record_add_tag: proc_address!(module_k4arecord, k4a_record_add_tag),
192                k4a_record_add_imu_track: proc_address!(module_k4arecord, k4a_record_add_imu_track),
193                k4a_record_add_attachment: proc_address!(
194                    module_k4arecord,
195                    k4a_record_add_attachment
196                ),
197                k4a_record_add_custom_video_track: proc_address!(
198                    module_k4arecord,
199                    k4a_record_add_custom_video_track
200                ),
201                k4a_record_add_custom_subtitle_track: proc_address!(
202                    module_k4arecord,
203                    k4a_record_add_custom_subtitle_track
204                ),
205                k4a_record_write_header: proc_address!(module_k4arecord, k4a_record_write_header),
206                k4a_record_write_capture: proc_address!(module_k4arecord, k4a_record_write_capture),
207                k4a_record_write_imu_sample: proc_address!(
208                    module_k4arecord,
209                    k4a_record_write_imu_sample
210                ),
211                k4a_record_write_custom_track_data: proc_address!(
212                    module_k4arecord,
213                    k4a_record_write_custom_track_data
214                ),
215                k4a_record_flush: proc_address!(module_k4arecord, k4a_record_flush),
216                k4a_record_close: proc_address!(module_k4arecord, k4a_record_close),
217                k4a_playback_open: proc_address!(module_k4arecord, k4a_playback_open),
218                k4a_playback_get_raw_calibration: proc_address!(
219                    module_k4arecord,
220                    k4a_playback_get_raw_calibration
221                ),
222                k4a_playback_get_calibration: proc_address!(
223                    module_k4arecord,
224                    k4a_playback_get_calibration
225                ),
226                k4a_playback_get_record_configuration: proc_address!(
227                    module_k4arecord,
228                    k4a_playback_get_record_configuration
229                ),
230                k4a_playback_check_track_exists: proc_address!(
231                    module_k4arecord,
232                    k4a_playback_check_track_exists
233                ),
234                k4a_playback_get_track_count: proc_address!(
235                    module_k4arecord,
236                    k4a_playback_get_track_count
237                ),
238                k4a_playback_get_track_name: proc_address!(
239                    module_k4arecord,
240                    k4a_playback_get_track_name
241                ),
242                k4a_playback_track_is_builtin: proc_address!(
243                    module_k4arecord,
244                    k4a_playback_track_is_builtin
245                ),
246                k4a_playback_track_get_video_settings: proc_address!(
247                    module_k4arecord,
248                    k4a_playback_track_get_video_settings
249                ),
250                k4a_playback_track_get_codec_id: proc_address!(
251                    module_k4arecord,
252                    k4a_playback_track_get_codec_id
253                ),
254                k4a_playback_track_get_codec_context: proc_address!(
255                    module_k4arecord,
256                    k4a_playback_track_get_codec_context
257                ),
258                k4a_playback_get_tag: proc_address!(module_k4arecord, k4a_playback_get_tag),
259                k4a_playback_set_color_conversion: proc_address!(
260                    module_k4arecord,
261                    k4a_playback_set_color_conversion
262                ),
263                k4a_playback_get_attachment: proc_address!(
264                    module_k4arecord,
265                    k4a_playback_get_attachment
266                ),
267                k4a_playback_get_next_capture: proc_address!(
268                    module_k4arecord,
269                    k4a_playback_get_next_capture
270                ),
271                k4a_playback_get_previous_capture: proc_address!(
272                    module_k4arecord,
273                    k4a_playback_get_previous_capture
274                ),
275                k4a_playback_get_next_imu_sample: proc_address!(
276                    module_k4arecord,
277                    k4a_playback_get_next_imu_sample
278                ),
279                k4a_playback_get_previous_imu_sample: proc_address!(
280                    module_k4arecord,
281                    k4a_playback_get_previous_imu_sample
282                ),
283                k4a_playback_get_next_data_block: proc_address!(
284                    module_k4arecord,
285                    k4a_playback_get_next_data_block
286                ),
287                k4a_playback_get_previous_data_block: proc_address!(
288                    module_k4arecord,
289                    k4a_playback_get_previous_data_block
290                ),
291                k4a_playback_data_block_get_device_timestamp_usec: proc_address!(
292                    module_k4arecord,
293                    k4a_playback_data_block_get_device_timestamp_usec
294                ),
295                k4a_playback_data_block_get_buffer_size: proc_address!(
296                    module_k4arecord,
297                    k4a_playback_data_block_get_buffer_size
298                ),
299                k4a_playback_data_block_get_buffer: proc_address!(
300                    module_k4arecord,
301                    k4a_playback_data_block_get_buffer
302                ),
303                k4a_playback_data_block_release: proc_address!(
304                    module_k4arecord,
305                    k4a_playback_data_block_release
306                ),
307                k4a_playback_seek_timestamp: proc_address!(
308                    module_k4arecord,
309                    k4a_playback_seek_timestamp
310                ),
311                k4a_playback_get_recording_length_usec: proc_address!(
312                    module_k4arecord,
313                    k4a_playback_get_recording_length_usec
314                ),
315                k4a_playback_get_last_timestamp_usec: proc_address!(
316                    module_k4arecord,
317                    k4a_playback_get_last_timestamp_usec
318                ),
319                k4a_playback_close: proc_address!(module_k4arecord, k4a_playback_close),
320            };
321
322            Ok(ApiRecord {
323                module_k4arecord,
324                funcs,
325            })
326        }
327    }
328
329    pub fn new() -> Result<ApiRecord, Error> {
330        Self::with_library_directory(
331            std::env::current_exe()
332                .map_err(|_| Error::Failed)?
333                .parent()
334                .ok_or(Error::Failed)?
335                .to_str()
336                .ok_or(Error::Failed)?,
337        )
338    }
339
340    pub fn with_library_directory(lib_dir: &str) -> Result<ApiRecord, Error> {
341        Self::with_module(Module::load_library(lib_dir, K4ARECORD_LIBNAME)?)
342    }
343}