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 pub type TrackNum = u64;
19
20 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
21 #[repr(i32)]
22 pub enum ResultCode {
23 Ok = 0,
25
26 BadParam = -1,
28
29 UnknownLibwebmError = -2,
33 }
34
35 pub const OPUS_CODEC_ID: u32 = 0;
37 pub const VORBIS_CODEC_ID: u32 = 1;
38
39 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 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 #[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}