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}