1#![allow(non_camel_case_types)]
10#![allow(clippy::missing_safety_doc)]
11
12use std::os::raw::{c_char, c_int, c_void};
13
14pub type adamo_protocol_t = u32;
15pub const ADAMO_PROTOCOL_UDP: adamo_protocol_t = 0;
16pub const ADAMO_PROTOCOL_QUIC: adamo_protocol_t = 1;
17pub const ADAMO_PROTOCOL_TCP: adamo_protocol_t = 2;
18
19pub type adamo_regime_t = u32;
20pub const ADAMO_REGIME_STABLE: adamo_regime_t = 0;
21pub const ADAMO_REGIME_DEGRADING: adamo_regime_t = 1;
22pub const ADAMO_REGIME_VOLATILE: adamo_regime_t = 2;
23pub const ADAMO_REGIME_RECOVERING: adamo_regime_t = 3;
24
25pub type adamo_video_backend_t = i32;
26pub const ADAMO_VIDEO_BACKEND_AUTO: adamo_video_backend_t = 0;
27pub const ADAMO_VIDEO_BACKEND_GSTREAMER: adamo_video_backend_t = 1;
28pub const ADAMO_VIDEO_BACKEND_HW_PIPELINE: adamo_video_backend_t = 2;
29
30#[repr(C)]
34pub struct adamo_session_t {
35 _priv: [u8; 0],
36 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
37}
38#[repr(C)]
39pub struct adamo_publisher_t {
40 _priv: [u8; 0],
41 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
42}
43#[repr(C)]
44pub struct adamo_subscriber_t {
45 _priv: [u8; 0],
46 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
47}
48#[repr(C)]
49pub struct adamo_cb_sub_t {
50 _priv: [u8; 0],
51 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
52}
53#[repr(C)]
54pub struct adamo_liveliness_token_t {
55 _priv: [u8; 0],
56 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
57}
58#[repr(C)]
59pub struct adamo_liveliness_sub_t {
60 _priv: [u8; 0],
61 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
62}
63#[repr(C)]
64pub struct adamo_state_t {
65 _priv: [u8; 0],
66 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
67}
68#[repr(C)]
69pub struct adamo_task_runner_t {
70 _priv: [u8; 0],
71 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
72}
73#[repr(C)]
74pub struct adamo_robot_t {
75 _priv: [u8; 0],
76 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
77}
78#[repr(C)]
79pub struct adamo_video_track_t {
80 _priv: [u8; 0],
81 _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
82}
83
84#[repr(C)]
85pub struct adamo_sample_t {
86 pub key: *mut c_char,
87 pub payload: *mut u8,
88 pub payload_len: usize,
89 pub is_delete: i32,
90 pub timestamp_us: u64,
91}
92
93#[repr(C)]
94pub struct adamo_latency_stats_t {
95 pub regime: adamo_regime_t,
96 pub jitter_hint_ms: f32,
97 pub garch_sigma_ms: f32,
98 pub target_bitrate_kbps: u32,
99 pub loss_rate: f32,
100 pub queuing_delay_ms: f32,
101 pub timestamp_ms: u64,
102}
103
104#[repr(C)]
105#[derive(Clone, Copy)]
106pub struct adamo_video_options_t {
107 pub width: u32,
108 pub height: u32,
109 pub pixel_format: *const c_char,
110 pub codec: *const c_char,
111 pub encoder: *const c_char,
112 pub bitrate_kbps: u32,
113 pub adaptive_bitrate: i32,
114 pub min_bitrate_kbps: u32,
115 pub max_bitrate_kbps: u32,
116 pub bitrate_priority: f32,
117 pub fps: u32,
118 pub keyframe_distance: f64,
119 pub stereo: i32,
120 pub backend: adamo_video_backend_t,
121 pub shm_publish: *const c_char,
124 pub reliability: *const c_char,
126 pub passthrough: i32,
129}
130
131pub type adamo_sample_cb_t =
132 Option<unsafe extern "C" fn(sample: *const adamo_sample_t, user: *mut c_void)>;
133pub type adamo_liveliness_cb_t =
134 Option<unsafe extern "C" fn(key: *const c_char, alive: c_int, user: *mut c_void)>;
135
136#[cfg(not(docsrs))]
139unsafe extern "C" {
140 pub fn adamo_last_error() -> *const c_char;
141
142 pub fn adamo_last_error_code() -> core::ffi::c_int;
146
147 pub fn adamo_sample_free(sample: *mut adamo_sample_t);
148
149 pub fn adamo_open(api_key: *const c_char, protocol: adamo_protocol_t) -> *mut adamo_session_t;
150 pub fn adamo_open_default(api_key: *const c_char) -> *mut adamo_session_t;
151 pub fn adamo_open_mtls(
152 api_key: *const c_char,
153 protocol: adamo_protocol_t,
154 ) -> *mut adamo_session_t;
155 pub fn adamo_session_free(sess: *mut adamo_session_t);
156 pub fn adamo_session_org(sess: *const adamo_session_t) -> *const c_char;
157 pub fn adamo_session_org_len(sess: *const adamo_session_t) -> usize;
158
159 pub fn adamo_put(
160 sess: *const adamo_session_t,
161 key: *const c_char,
162 payload: *const u8,
163 payload_len: usize,
164 priority: u8,
165 express: i32,
166 ) -> i32;
167
168 pub fn adamo_publisher(
169 sess: *const adamo_session_t,
170 key: *const c_char,
171 priority: u8,
172 express: i32,
173 reliable: i32,
174 ) -> *mut adamo_publisher_t;
175 pub fn adamo_publisher_put(
176 pub_: *const adamo_publisher_t,
177 payload: *const u8,
178 payload_len: usize,
179 ) -> i32;
180 pub fn adamo_publisher_free(pub_: *mut adamo_publisher_t);
181
182 pub fn adamo_subscribe(
183 sess: *const adamo_session_t,
184 key: *const c_char,
185 ) -> *mut adamo_subscriber_t;
186 pub fn adamo_sub_recv(
187 sub: *const adamo_subscriber_t,
188 timeout_ms: u64,
189 ) -> *mut adamo_sample_t;
190 pub fn adamo_sub_try_recv(sub: *const adamo_subscriber_t) -> *mut adamo_sample_t;
191 pub fn adamo_sub_free(sub: *mut adamo_subscriber_t);
192
193 pub fn adamo_subscribe_cb(
194 sess: *const adamo_session_t,
195 key: *const c_char,
196 cb: adamo_sample_cb_t,
197 user: *mut c_void,
198 ) -> *mut adamo_cb_sub_t;
199 pub fn adamo_cb_sub_free(sub: *mut adamo_cb_sub_t);
200
201 pub fn adamo_get(
202 sess: *const adamo_session_t,
203 key: *const c_char,
204 timeout_ms: u64,
205 count_out: *mut usize,
206 ) -> *mut *mut adamo_sample_t;
207 pub fn adamo_get_replies_free(replies: *mut *mut adamo_sample_t, count: usize);
208
209 pub fn adamo_state_declare(
210 sess: *const adamo_session_t,
211 robot: *const c_char,
212 ) -> *mut adamo_state_t;
213 pub fn adamo_state_set(
214 state: *const adamo_state_t,
215 key: *const c_char,
216 payload: *const u8,
217 payload_len: usize,
218 ) -> i32;
219 pub fn adamo_state_get(
220 state: *const adamo_state_t,
221 key: *const c_char,
222 out_payload: *mut *mut u8,
223 out_len: *mut usize,
224 ) -> i32;
225 pub fn adamo_state_delete(state: *const adamo_state_t, key: *const c_char) -> i32;
226 pub fn adamo_state_bytes_free(payload: *mut u8, payload_len: usize);
227 pub fn adamo_state_free(state: *mut adamo_state_t);
228
229 pub fn adamo_task_runner_declare(
230 sess: *const adamo_session_t,
231 robot: *const c_char,
232 ) -> *mut adamo_task_runner_t;
233 pub fn adamo_task_runner_select(
234 runner: *const adamo_task_runner_t,
235 task_set_id: *const c_char,
236 name: *const c_char,
237 ids: *const *const c_char,
238 names: *const *const c_char,
239 count: usize,
240 ) -> i32;
241 pub fn adamo_task_runner_advance(runner: *const adamo_task_runner_t) -> i32;
242 pub fn adamo_task_runner_reset(runner: *const adamo_task_runner_t) -> i32;
243 pub fn adamo_task_runner_free(runner: *mut adamo_task_runner_t);
244
245 pub fn adamo_liveliness_declare(
246 sess: *const adamo_session_t,
247 token_key: *const c_char,
248 ) -> *mut adamo_liveliness_token_t;
249 pub fn adamo_liveliness_token_free(tok: *mut adamo_liveliness_token_t);
250 pub fn adamo_liveliness_get(
251 sess: *const adamo_session_t,
252 pattern: *const c_char,
253 count_out: *mut usize,
254 ) -> *mut *mut c_char;
255 pub fn adamo_liveliness_tokens_free(tokens: *mut *mut c_char, count: usize);
256 pub fn adamo_liveliness_subscribe(
257 sess: *const adamo_session_t,
258 pattern: *const c_char,
259 history: c_int,
260 cb: adamo_liveliness_cb_t,
261 user: *mut c_void,
262 ) -> *mut adamo_liveliness_sub_t;
263 pub fn adamo_liveliness_sub_free(sub: *mut adamo_liveliness_sub_t);
264
265 pub fn adamo_robot_new(
266 api_key: *const c_char,
267 name: *const c_char,
268 protocol: adamo_protocol_t,
269 ) -> *mut adamo_robot_t;
270 pub fn adamo_robot_new_default(
271 api_key: *const c_char,
272 name: *const c_char,
273 ) -> *mut adamo_robot_t;
274 pub fn adamo_video_options_default() -> adamo_video_options_t;
275 pub fn adamo_robot_video(
276 robot: *mut adamo_robot_t,
277 name: *const c_char,
278 width: u32,
279 height: u32,
280 pixel_format: *const c_char,
281 fps: u32,
282 bitrate_kbps: u32,
283 stereo: bool,
284 ) -> *mut adamo_video_track_t;
285 pub fn adamo_robot_video_with_options(
286 robot: *mut adamo_robot_t,
287 name: *const c_char,
288 width: u32,
289 height: u32,
290 pixel_format: *const c_char,
291 fps: u32,
292 bitrate_kbps: u32,
293 stereo: bool,
294 encoder: *const c_char,
295 hw_pipeline: bool,
296 ) -> *mut adamo_video_track_t;
297 pub fn adamo_robot_video_configured(
298 robot: *mut adamo_robot_t,
299 name: *const c_char,
300 opts: *const adamo_video_options_t,
301 ) -> *mut adamo_video_track_t;
302 pub fn adamo_robot_attach_video_v4l2(
303 robot: *mut adamo_robot_t,
304 name: *const c_char,
305 device: *const c_char,
306 width: u32,
307 height: u32,
308 fps: u32,
309 bitrate_kbps: u32,
310 stereo: bool,
311 ) -> i32;
312 pub fn adamo_robot_attach_video_v4l2_configured(
313 robot: *mut adamo_robot_t,
314 name: *const c_char,
315 device: *const c_char,
316 opts: *const adamo_video_options_t,
317 ) -> i32;
318 pub fn adamo_robot_attach_video_gst(
319 robot: *mut adamo_robot_t,
320 name: *const c_char,
321 pipeline: *const c_char,
322 width: u32,
323 height: u32,
324 fps: u32,
325 bitrate_kbps: u32,
326 stereo: bool,
327 ) -> i32;
328 pub fn adamo_robot_attach_video_gst_with_format(
329 robot: *mut adamo_robot_t,
330 name: *const c_char,
331 pipeline: *const c_char,
332 width: u32,
333 height: u32,
334 fps: u32,
335 bitrate_kbps: u32,
336 stereo: bool,
337 source_format: *const c_char,
338 ) -> i32;
339 pub fn adamo_robot_attach_video_gst_configured(
340 robot: *mut adamo_robot_t,
341 name: *const c_char,
342 pipeline: *const c_char,
343 opts: *const adamo_video_options_t,
344 ) -> i32;
345 pub fn adamo_robot_attach_video_shm(
346 robot: *mut adamo_robot_t,
347 name: *const c_char,
348 service: *const c_char,
349 width: u32,
350 height: u32,
351 pixel_format: *const c_char,
352 fps: u32,
353 bitrate_kbps: u32,
354 stereo: bool,
355 ) -> i32;
356 pub fn adamo_robot_attach_video_shm_configured(
357 robot: *mut adamo_robot_t,
358 name: *const c_char,
359 service: *const c_char,
360 opts: *const adamo_video_options_t,
361 ) -> i32;
362 pub fn adamo_video_track_send(
363 track: *mut adamo_video_track_t,
364 payload: *const u8,
365 payload_len: usize,
366 ) -> i32;
367 pub fn adamo_video_track_free(track: *mut adamo_video_track_t);
368 pub fn adamo_robot_run(robot: *mut adamo_robot_t) -> i32;
369 pub fn adamo_robot_free(robot: *mut adamo_robot_t);
370
371 pub fn adamo_detect_encoder() -> *const c_char;
372
373 pub fn adamo_fabric_now_us() -> u64;
374 pub fn adamo_fabric_synced() -> i32;
375 pub fn adamo_relay_rtt_us(sess: *const adamo_session_t, out_us: *mut u64) -> i32;
376
377 pub fn adamo_parse_heartbeat(
378 payload: *const u8,
379 payload_len: usize,
380 out: *mut adamo_latency_stats_t,
381 ) -> i32;
382 pub fn adamo_heartbeat_topic(
383 robot: *const c_char,
384 out: *mut c_char,
385 out_cap: usize,
386 ) -> isize;
387 pub fn adamo_ping_topic(
388 robot: *const c_char,
389 out: *mut c_char,
390 out_cap: usize,
391 ) -> isize;
392 pub fn adamo_pong_topic(
393 robot: *const c_char,
394 out: *mut c_char,
395 out_cap: usize,
396 ) -> isize;
397 pub fn adamo_measure_rtt(
398 sess: *const adamo_session_t,
399 robot: *const c_char,
400 timeout_ms: u64,
401 out_us: *mut u64,
402 ) -> i32;
403}
404
405#[doc(hidden)]
408pub const _IMPORTS: (Option<c_int>, Option<*mut c_void>) = (None, None);