medea_jason/platform/dart/send_encoding_parameters.rs
1//! Wrapper around [RTCRtpEncodingParameters][0].
2//!
3//! [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
4
5use dart_sys::Dart_Handle;
6use medea_macro::dart_bridge;
7
8use super::utils::{c_str_into_string, string_into_c_str};
9use crate::platform::dart::utils::{
10 NonNullDartValueArgExt as _, handle::DartHandle,
11};
12
13#[dart_bridge(
14 "flutter/lib/src/native/platform/send_encoding_parameters.g.dart"
15)]
16mod send_encoding_parameters {
17 use std::{os::raw::c_char, ptr};
18
19 use dart_sys::Dart_Handle;
20
21 use crate::{api::DartValueArg, platform::Error};
22
23 extern "C" {
24 /// Creates new [RTCRtpEncodingParameters][0].
25 ///
26 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
27 pub fn new_send_encoding_parameters(
28 rid: ptr::NonNull<c_char>,
29 active: bool,
30 ) -> Result<Dart_Handle, Error>;
31
32 /// Returns [RID] from the provided [RTCRtpEncodingParameters][0].
33 ///
34 /// [RID]: https://w3.org/TR/webrtc#dom-rtcrtpcodingparameters-rid
35 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
36 pub fn get_rid(
37 encoding: Dart_Handle,
38 ) -> Result<ptr::NonNull<c_char>, Error>;
39
40 /// Sets [activeness][1] of the provided [RTCRtpEncodingParameters][0].
41 ///
42 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
43 /// [1]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters-active
44 pub fn set_active(
45 encoding: Dart_Handle,
46 active: bool,
47 ) -> Result<(), Error>;
48
49 /// Returns [activeness][1] of the provided
50 /// [RTCRtpEncodingParameters][0].
51 ///
52 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
53 /// [1]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters-active
54 pub fn get_active(encoding: Dart_Handle) -> Result<bool, Error>;
55
56 /// Sets [maxBitrate][1] of the provided [RTCRtpEncodingParameters][0].
57 ///
58 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
59 /// [1]:https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters-maxbitrate
60 pub fn set_max_bitrate(
61 encoding: Dart_Handle,
62 max_bitrate: u32,
63 ) -> Result<(), Error>;
64
65 /// Returns [maxBitrate][1] of the provided
66 /// [RTCRtpEncodingParameters][0].
67 ///
68 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
69 /// [1]:https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters-maxbitrate
70 pub fn get_max_bitrate(
71 encoding: Dart_Handle,
72 ) -> Result<ptr::NonNull<DartValueArg<Option<u32>>>, Error>;
73
74 /// Sets [scaleResolutionDownBy][1] of the provided
75 /// [RTCRtpEncodingParameters][0].
76 ///
77 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
78 /// [1]: https://tinyurl.com/ypzzc75t
79 pub fn set_scale_resolution_down_by(
80 encoding: Dart_Handle,
81 scale_resolution_down_by: f64,
82 ) -> Result<(), Error>;
83
84 /// Returns [scaleResolutionDownBy][1] of the provided
85 /// [RTCRtpEncodingParameters][0].
86 ///
87 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
88 /// [1]: https://tinyurl.com/ypzzc75t
89 pub fn get_scale_resolution_down_by(
90 encoding: Dart_Handle,
91 ) -> Result<f64, Error>;
92
93 /// Sets [scalabilityMode][1] of the provided
94 /// [RTCRtpEncodingParameters][0].
95 ///
96 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
97 /// [1]: https://tinyurl.com/3zuaee45
98 pub fn set_scalability_mode(
99 encoding: Dart_Handle,
100 scalability_mode: ptr::NonNull<c_char>,
101 ) -> Result<(), Error>;
102
103 /// Returns [scalabilityMode][1] of the provided
104 /// [RTCRtpEncodingParameters][0].
105 ///
106 /// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
107 /// [1]: https://tinyurl.com/3zuaee45
108 pub fn get_scalability_mode(
109 encoding: Dart_Handle,
110 ) -> Result<ptr::NonNull<c_char>, Error>;
111 }
112}
113
114/// Wrapper around [RTCRtpEncodingParameters][0] providing handy methods for its
115/// direction changes.
116///
117/// [0]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters
118#[derive(Clone, Debug)]
119pub struct SendEncodingParameters(DartHandle);
120
121impl From<DartHandle> for SendEncodingParameters {
122 fn from(value: DartHandle) -> Self {
123 Self(value)
124 }
125}
126
127impl SendEncodingParameters {
128 /// Creates new [`SendEncodingParameters`].
129 #[must_use]
130 pub fn new(rid: String, active: bool) -> Self {
131 let handle = unsafe {
132 send_encoding_parameters::new_send_encoding_parameters(
133 string_into_c_str(rid),
134 active,
135 )
136 }
137 .unwrap();
138 Self(unsafe { DartHandle::new(handle) })
139 }
140
141 /// Returns the underlying [`Dart_Handle`] of these
142 /// [`SendEncodingParameters`].
143 #[must_use]
144 pub fn handle(&self) -> Dart_Handle {
145 self.0.get()
146 }
147
148 /// Returns [RID] of these [`SendEncodingParameters`].
149 ///
150 /// [RID]: https://w3.org/TR/webrtc#dom-rtcrtpcodingparameters-rid
151 #[expect(clippy::unwrap_in_result, reason = "unrelated and intended")]
152 #[must_use]
153 pub fn rid(&self) -> Option<String> {
154 let rid =
155 unsafe { send_encoding_parameters::get_rid(self.0.get()).unwrap() };
156
157 let rid = unsafe { c_str_into_string(rid) };
158
159 (!rid.is_empty()).then_some(rid)
160 }
161
162 /// Sets [activeness][1] of these [`SendEncodingParameters`].
163 ///
164 /// [1]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters-active
165 pub fn set_active(&self, active: bool) {
166 unsafe { send_encoding_parameters::set_active(self.0.get(), active) }
167 .unwrap();
168 }
169
170 /// Returns [activeness][1] of these [`SendEncodingParameters`].
171 ///
172 /// [1]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters-active
173 #[must_use]
174 pub fn active(&self) -> bool {
175 unsafe { send_encoding_parameters::get_active(self.0.get()) }.unwrap()
176 }
177
178 /// Sets [maxBitrate][1] of these [`SendEncodingParameters`].
179 ///
180 /// [1]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters-maxbitrate
181 pub fn set_max_bitrate(&self, max_bitrate: u32) {
182 unsafe {
183 send_encoding_parameters::set_max_bitrate(self.0.get(), max_bitrate)
184 }
185 .unwrap();
186 }
187
188 /// Returns [maxBitrate][1] of these [`SendEncodingParameters`].
189 ///
190 /// [1]: https://w3.org/TR/webrtc#dom-rtcrtpencodingparameters-maxbitrate
191 #[expect(clippy::unwrap_in_result, reason = "unrelated")]
192 #[must_use]
193 pub fn max_bitrate(&self) -> Option<u32> {
194 let max_bitrate =
195 unsafe { send_encoding_parameters::get_max_bitrate(self.0.get()) }
196 .unwrap();
197
198 Option::try_from(unsafe { max_bitrate.unbox() }).unwrap()
199 }
200
201 /// Sets [scaleResolutionDownBy][1] of these [`SendEncodingParameters`].
202 ///
203 /// [1]: https://tinyurl.com/ypzzc75t
204 pub fn set_scale_resolution_down_by(&self, scale_resolution_down_by: f64) {
205 unsafe {
206 send_encoding_parameters::set_scale_resolution_down_by(
207 self.0.get(),
208 scale_resolution_down_by,
209 )
210 }
211 .unwrap();
212 }
213
214 /// Returns [scaleResolutionDownBy][1] of these [`SendEncodingParameters`].
215 ///
216 /// [1]: https://tinyurl.com/ypzzc75t
217 #[must_use]
218 pub fn scale_resolution_down_by(&self) -> f64 {
219 unsafe {
220 send_encoding_parameters::get_scale_resolution_down_by(self.0.get())
221 }
222 .unwrap()
223 }
224
225 /// Sets [scalabilityMode][1] of these [`SendEncodingParameters`].
226 ///
227 /// [1]: https://tinyurl.com/3zuaee45
228 pub fn set_scalability_mode(&self, scalability_mode: String) {
229 unsafe {
230 send_encoding_parameters::set_scalability_mode(
231 self.0.get(),
232 string_into_c_str(scalability_mode),
233 )
234 }
235 .unwrap();
236 }
237
238 /// Returns [scalabilityMode][1] of these [`SendEncodingParameters`].
239 ///
240 /// [1]: https://tinyurl.com/3zuaee45
241 #[expect(clippy::unwrap_in_result, reason = "unrelated and intended")]
242 #[must_use]
243 pub fn scalability_mode(&self) -> Option<String> {
244 let mode = unsafe {
245 send_encoding_parameters::get_scalability_mode(self.0.get())
246 .unwrap()
247 };
248 let mode = unsafe { c_str_into_string(mode) };
249
250 (!mode.is_empty()).then_some(mode)
251 }
252}