Skip to main content

adamo_sys/
lib.rs

1//! Raw FFI bindings to the Adamo SDK.
2//!
3//! This crate is a thin, `unsafe` interface — prefer the safe wrappers in
4//! [`adamo`](https://docs.rs/adamo) for normal use.
5//!
6//! All declarations match the C header generated by `cbindgen` for the
7//! `adamo-c` crate (`include/adamo/adamo.h`). Keep them in sync.
8
9#![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
19// Opaque handles. Zero-sized placeholders — callers only ever see pointers
20// to them. `PhantomData<*mut ()>` keeps them `!Send + !Sync` by default;
21// the safe wrapper re-asserts thread-safety where the C API documents it.
22#[repr(C)]
23pub struct adamo_session_t {
24    _priv: [u8; 0],
25    _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
26}
27#[repr(C)]
28pub struct adamo_publisher_t {
29    _priv: [u8; 0],
30    _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
31}
32#[repr(C)]
33pub struct adamo_subscriber_t {
34    _priv: [u8; 0],
35    _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
36}
37#[repr(C)]
38pub struct adamo_cb_sub_t {
39    _priv: [u8; 0],
40    _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
41}
42#[repr(C)]
43pub struct adamo_robot_t {
44    _priv: [u8; 0],
45    _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
46}
47#[repr(C)]
48pub struct adamo_video_track_t {
49    _priv: [u8; 0],
50    _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
51}
52
53#[repr(C)]
54pub struct adamo_sample_t {
55    pub key: *mut c_char,
56    pub payload: *mut u8,
57    pub payload_len: usize,
58    pub is_delete: i32,
59}
60
61pub type adamo_sample_cb_t =
62    Option<unsafe extern "C" fn(sample: *const adamo_sample_t, user: *mut c_void)>;
63
64// docs.rs builds can't link libadamo; stub the extern block out there so
65// rustdoc still succeeds.
66#[cfg(not(docsrs))]
67unsafe extern "C" {
68    pub fn adamo_last_error() -> *const c_char;
69
70    pub fn adamo_sample_free(sample: *mut adamo_sample_t);
71
72    pub fn adamo_open(api_key: *const c_char, protocol: adamo_protocol_t) -> *mut adamo_session_t;
73    pub fn adamo_session_free(sess: *mut adamo_session_t);
74    pub fn adamo_session_org(sess: *const adamo_session_t) -> *const c_char;
75    pub fn adamo_session_org_len(sess: *const adamo_session_t) -> usize;
76
77    pub fn adamo_put(
78        sess: *const adamo_session_t,
79        key: *const c_char,
80        payload: *const u8,
81        payload_len: usize,
82        priority: u8,
83        express: i32,
84    ) -> i32;
85
86    pub fn adamo_publisher(
87        sess: *const adamo_session_t,
88        key: *const c_char,
89        priority: u8,
90        express: i32,
91        reliable: i32,
92    ) -> *mut adamo_publisher_t;
93    pub fn adamo_publisher_put(
94        pub_: *const adamo_publisher_t,
95        payload: *const u8,
96        payload_len: usize,
97    ) -> i32;
98    pub fn adamo_publisher_free(pub_: *mut adamo_publisher_t);
99
100    pub fn adamo_subscribe(
101        sess: *const adamo_session_t,
102        key: *const c_char,
103    ) -> *mut adamo_subscriber_t;
104    pub fn adamo_sub_recv(
105        sub: *const adamo_subscriber_t,
106        timeout_ms: u64,
107    ) -> *mut adamo_sample_t;
108    pub fn adamo_sub_try_recv(sub: *const adamo_subscriber_t) -> *mut adamo_sample_t;
109    pub fn adamo_sub_free(sub: *mut adamo_subscriber_t);
110
111    pub fn adamo_subscribe_cb(
112        sess: *const adamo_session_t,
113        key: *const c_char,
114        cb: adamo_sample_cb_t,
115        user: *mut c_void,
116    ) -> *mut adamo_cb_sub_t;
117    pub fn adamo_cb_sub_free(sub: *mut adamo_cb_sub_t);
118
119    pub fn adamo_robot_new(
120        api_key: *const c_char,
121        name: *const c_char,
122        protocol: adamo_protocol_t,
123    ) -> *mut adamo_robot_t;
124    pub fn adamo_robot_video(
125        robot: *mut adamo_robot_t,
126        name: *const c_char,
127        width: u32,
128        height: u32,
129        pixel_format: *const c_char,
130        fps: u32,
131        bitrate_kbps: u32,
132    ) -> *mut adamo_video_track_t;
133    pub fn adamo_robot_attach_video_v4l2(
134        robot: *mut adamo_robot_t,
135        name: *const c_char,
136        device: *const c_char,
137        width: u32,
138        height: u32,
139        fps: u32,
140        bitrate_kbps: u32,
141    ) -> i32;
142    pub fn adamo_robot_attach_video_gst(
143        robot: *mut adamo_robot_t,
144        name: *const c_char,
145        pipeline: *const c_char,
146        width: u32,
147        height: u32,
148        fps: u32,
149        bitrate_kbps: u32,
150    ) -> i32;
151    pub fn adamo_video_track_send(
152        track: *mut adamo_video_track_t,
153        payload: *const u8,
154        payload_len: usize,
155    ) -> i32;
156    pub fn adamo_video_track_free(track: *mut adamo_video_track_t);
157    pub fn adamo_robot_run(robot: *mut adamo_robot_t) -> i32;
158    pub fn adamo_robot_free(robot: *mut adamo_robot_t);
159
160    pub fn adamo_detect_encoder() -> *const c_char;
161
162    pub fn adamo_fabric_now_us() -> u64;
163    pub fn adamo_fabric_synced() -> i32;
164}
165
166// Silence `unused_imports` if someone pulls in the crate without calling
167// anything (e.g. docs builds).
168#[doc(hidden)]
169pub const _IMPORTS: (Option<c_int>, Option<*mut c_void>) = (None, None);