webm_sys/
lib.rs

1pub mod mux {
2    use core::ffi::{c_char, c_void};
3    use core::ptr::NonNull;
4
5    #[repr(C)]
6    pub struct IWriter {
7        _opaque_c_aligned: *mut c_void,
8    }
9    pub type WriterMutPtr = *mut IWriter;
10    pub type WriterNonNullPtr = NonNull<IWriter>;
11
12    pub type WriterWriteFn = extern "C" fn(*mut c_void, *const c_void, usize) -> bool;
13    pub type WriterGetPosFn = extern "C" fn(*mut c_void) -> u64;
14    pub type WriterSetPosFn = extern "C" fn(*mut c_void, u64) -> bool;
15    pub type WriterElementStartNotifyFn = extern "C" fn(*mut c_void, u64, i64);
16
17    /// An opaque number used to identify an added track.
18    pub type TrackNum = u64;
19
20    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
21    #[repr(i32)]
22    pub enum ResultCode {
23        /// The function completed without error
24        Ok = 0,
25
26        /// An invalid parameter was passed (e.g. a null pointer or an invalid track number)
27        BadParam = -1,
28
29        /// `libwebm` returned an error, and no more specific error info is known. No assumptions
30        /// should be made about whether this is an issue with the caller, or something internal
31        /// to `libwebm`.
32        UnknownLibwebmError = -2,
33    }
34
35    // audio
36    pub const OPUS_CODEC_ID: u32 = 0;
37    pub const VORBIS_CODEC_ID: u32 = 1;
38
39    // video
40    pub const VP8_CODEC_ID: u32 = 0;
41    pub const VP9_CODEC_ID: u32 = 1;
42    pub const AV1_CODEC_ID: u32 = 2;
43
44    // segment modes
45    pub const SEGMENT_MODE_LIVE: u32 = 0x1;
46    pub const SEGMENT_MODE_FILE: u32 = 0x2;
47
48    #[repr(C)]
49    pub struct Segment {
50        _opaque_c_aligned: *mut c_void,
51    }
52    pub type SegmentMutPtr = *mut Segment;
53    pub type SegmentNonNullPtr = NonNull<Segment>;
54
55    #[link(name = "webmadapter", kind = "static")]
56    unsafe extern "C" {
57        #[link_name = "mux_new_writer"]
58        pub fn new_writer(
59            write: Option<WriterWriteFn>,
60            get_pos: Option<WriterGetPosFn>,
61            set_pos: Option<WriterSetPosFn>,
62            element_start_notify: Option<WriterElementStartNotifyFn>,
63            user_data: *mut c_void,
64        ) -> WriterMutPtr;
65        #[link_name = "mux_delete_writer"]
66        pub fn delete_writer(writer: WriterMutPtr);
67
68        #[link_name = "mux_new_segment"]
69        pub fn new_segment() -> SegmentMutPtr;
70        #[link_name = "mux_initialize_segment"]
71        pub fn initialize_segment(segment: SegmentMutPtr, writer: WriterMutPtr) -> ResultCode;
72        #[link_name = "mux_set_color"]
73        pub fn mux_set_color(
74            segment: SegmentMutPtr,
75            video_track_num: TrackNum,
76            bits_per_channel: u8,
77            sampling_horiz: u8,
78            sampling_vert: u8,
79            color_range: u8,
80        ) -> ResultCode;
81
82        // HDR10 metadata functions
83        #[link_name = "mux_set_transfer_characteristics"]
84        pub fn mux_set_transfer_characteristics(
85            segment: SegmentMutPtr,
86            video_track_num: TrackNum,
87            transfer_characteristics: u64,
88        ) -> ResultCode;
89
90        #[link_name = "mux_set_primaries"]
91        pub fn mux_set_primaries(
92            segment: SegmentMutPtr,
93            video_track_num: TrackNum,
94            primaries: u64,
95        ) -> ResultCode;
96
97        #[link_name = "mux_set_matrix_coefficients"]
98        pub fn mux_set_matrix_coefficients(
99            segment: SegmentMutPtr,
100            video_track_num: TrackNum,
101            matrix_coefficients: u64,
102        ) -> ResultCode;
103
104        #[link_name = "mux_set_max_cll"]
105        pub fn mux_set_max_cll(
106            segment: SegmentMutPtr,
107            video_track_num: TrackNum,
108            max_cll: u64,
109        ) -> ResultCode;
110
111        #[link_name = "mux_set_max_fall"]
112        pub fn mux_set_max_fall(
113            segment: SegmentMutPtr,
114            video_track_num: TrackNum,
115            max_fall: u64,
116        ) -> ResultCode;
117
118        #[link_name = "mux_set_mastering_metadata"]
119        pub fn mux_set_mastering_metadata(
120            segment: SegmentMutPtr,
121            video_track_num: TrackNum,
122            luminance_max: f32,
123            luminance_min: f32,
124            red_x: f32,
125            red_y: f32,
126            green_x: f32,
127            green_y: f32,
128            blue_x: f32,
129            blue_y: f32,
130            white_x: f32,
131            white_y: f32,
132        ) -> ResultCode;
133
134        #[link_name = "mux_set_writing_app"]
135        pub fn mux_set_writing_app(segment: SegmentMutPtr, name: *const c_char);
136        #[link_name = "mux_finalize_segment"]
137        pub fn finalize_segment(segment: SegmentMutPtr, duration: u64) -> ResultCode;
138        #[link_name = "mux_delete_segment"]
139        pub fn delete_segment(segment: SegmentMutPtr);
140        #[link_name = "mux_segment_set_mode"]
141        pub fn segment_set_mode(segment: SegmentMutPtr, mode: u32) -> ResultCode;
142
143        #[link_name = "mux_segment_add_video_track"]
144        pub fn segment_add_video_track(
145            segment: SegmentMutPtr,
146            width: i32,
147            height: i32,
148            number: i32,
149            codec_id: u32,
150            track_num_out: *mut TrackNum,
151        ) -> ResultCode;
152        #[link_name = "mux_segment_add_audio_track"]
153        pub fn segment_add_audio_track(
154            segment: SegmentMutPtr,
155            sample_rate: i32,
156            channels: i32,
157            number: i32,
158            codec_id: u32,
159            track_num_out: *mut TrackNum,
160        ) -> ResultCode;
161        #[link_name = "mux_segment_add_frame"]
162        pub fn segment_add_frame(
163            segment: SegmentMutPtr,
164            track_num: TrackNum,
165            frame: *const u8,
166            length: usize,
167            timestamp_ns: u64,
168            keyframe: bool,
169        ) -> ResultCode;
170        #[link_name = "mux_segment_set_codec_private"]
171        pub fn segment_set_codec_private(
172            segment: SegmentMutPtr,
173            track_num: TrackNum,
174            data: *const u8,
175            len: i32,
176        ) -> ResultCode;
177    }
178}
179
180#[test]
181fn smoke_test() {
182    unsafe {
183        let segment = mux::new_segment();
184        assert!(!segment.is_null());
185        mux::delete_segment(segment);
186    }
187}