media_section.rs (6528B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 use std::convert::TryInto; 6 use std::os::raw::c_char; 7 use std::ptr; 8 9 use libc::size_t; 10 11 use nserror::{nsresult, NS_ERROR_INVALID_ARG, NS_OK}; 12 use rsdparsa::attribute_type::{SdpAttribute, SdpAttributeRtpmap}; 13 use rsdparsa::media_type::{SdpFormatList, SdpMedia, SdpMediaValue, SdpProtocolValue}; 14 use rsdparsa::{SdpBandwidth, SdpSession}; 15 16 use network::{get_bandwidth, RustSdpConnection}; 17 use types::StringView; 18 19 #[no_mangle] 20 pub unsafe extern "C" fn sdp_get_media_section( 21 session: *const SdpSession, 22 index: size_t, 23 ) -> *const SdpMedia { 24 return match (&(*session).media).get(index) { 25 Some(m) => m, 26 None => ptr::null(), 27 }; 28 } 29 30 #[repr(C)] 31 #[derive(Clone, Copy)] 32 pub enum RustSdpMediaValue { 33 Audio, 34 Video, 35 Application, 36 } 37 38 impl<'a> From<&'a SdpMediaValue> for RustSdpMediaValue { 39 fn from(val: &SdpMediaValue) -> Self { 40 match *val { 41 SdpMediaValue::Audio => RustSdpMediaValue::Audio, 42 SdpMediaValue::Video => RustSdpMediaValue::Video, 43 SdpMediaValue::Application => RustSdpMediaValue::Application, 44 } 45 } 46 } 47 48 #[no_mangle] 49 pub unsafe extern "C" fn sdp_rust_get_media_type(sdp_media: *const SdpMedia) -> RustSdpMediaValue { 50 RustSdpMediaValue::from((*sdp_media).get_type()) 51 } 52 53 #[repr(C)] 54 #[derive(Clone, Copy)] 55 pub enum RustSdpProtocolValue { 56 RtpSavpf, 57 UdpTlsRtpSavp, 58 TcpDtlsRtpSavp, 59 UdpTlsRtpSavpf, 60 TcpDtlsRtpSavpf, 61 DtlsSctp, 62 UdpDtlsSctp, 63 TcpDtlsSctp, 64 RtpAvp, 65 RtpAvpf, 66 RtpSavp, 67 } 68 69 impl<'a> From<&'a SdpProtocolValue> for RustSdpProtocolValue { 70 fn from(val: &SdpProtocolValue) -> Self { 71 match *val { 72 SdpProtocolValue::RtpSavpf => RustSdpProtocolValue::RtpSavpf, 73 SdpProtocolValue::UdpTlsRtpSavp => RustSdpProtocolValue::UdpTlsRtpSavp, 74 SdpProtocolValue::TcpDtlsRtpSavp => RustSdpProtocolValue::TcpDtlsRtpSavp, 75 SdpProtocolValue::UdpTlsRtpSavpf => RustSdpProtocolValue::UdpTlsRtpSavpf, 76 SdpProtocolValue::TcpDtlsRtpSavpf => RustSdpProtocolValue::TcpDtlsRtpSavpf, 77 SdpProtocolValue::DtlsSctp => RustSdpProtocolValue::DtlsSctp, 78 SdpProtocolValue::UdpDtlsSctp => RustSdpProtocolValue::UdpDtlsSctp, 79 SdpProtocolValue::TcpDtlsSctp => RustSdpProtocolValue::TcpDtlsSctp, 80 SdpProtocolValue::RtpAvp => RustSdpProtocolValue::RtpAvp, 81 SdpProtocolValue::RtpAvpf => RustSdpProtocolValue::RtpAvpf, 82 SdpProtocolValue::RtpSavp => RustSdpProtocolValue::RtpSavp, 83 } 84 } 85 } 86 87 #[no_mangle] 88 pub unsafe extern "C" fn sdp_get_media_protocol( 89 sdp_media: *const SdpMedia, 90 ) -> RustSdpProtocolValue { 91 RustSdpProtocolValue::from((*sdp_media).get_proto()) 92 } 93 94 #[repr(C)] 95 #[derive(Clone, Copy)] 96 pub enum RustSdpFormatType { 97 Integers, 98 Strings, 99 } 100 101 #[no_mangle] 102 pub unsafe extern "C" fn sdp_get_format_type(sdp_media: *const SdpMedia) -> RustSdpFormatType { 103 match *(*sdp_media).get_formats() { 104 SdpFormatList::Integers(_) => RustSdpFormatType::Integers, 105 SdpFormatList::Strings(_) => RustSdpFormatType::Strings, 106 } 107 } 108 109 #[no_mangle] 110 pub unsafe extern "C" fn sdp_get_format_string_vec( 111 sdp_media: *const SdpMedia, 112 ) -> *const Vec<String> { 113 if let SdpFormatList::Strings(ref formats) = *(*sdp_media).get_formats() { 114 formats 115 } else { 116 ptr::null() 117 } 118 } 119 120 #[no_mangle] 121 pub unsafe extern "C" fn sdp_get_format_u32_vec(sdp_media: *const SdpMedia) -> *const Vec<u32> { 122 if let SdpFormatList::Integers(ref formats) = *(*sdp_media).get_formats() { 123 formats 124 } else { 125 ptr::null() 126 } 127 } 128 129 #[no_mangle] 130 pub unsafe extern "C" fn sdp_set_media_port(sdp_media: *mut SdpMedia, port: u32) { 131 (*sdp_media).set_port(port); 132 } 133 134 #[no_mangle] 135 pub unsafe extern "C" fn sdp_get_media_port(sdp_media: *const SdpMedia) -> u32 { 136 (*sdp_media).get_port() 137 } 138 139 #[no_mangle] 140 pub unsafe extern "C" fn sdp_get_media_port_count(sdp_media: *const SdpMedia) -> u32 { 141 (*sdp_media).get_port_count() 142 } 143 144 #[no_mangle] 145 pub unsafe extern "C" fn sdp_get_media_bandwidth( 146 sdp_media: *const SdpMedia, 147 bandwidth_type: *const c_char, 148 ) -> u32 { 149 get_bandwidth((*sdp_media).get_bandwidth(), bandwidth_type) 150 } 151 152 #[no_mangle] 153 pub unsafe extern "C" fn sdp_get_media_bandwidth_vec( 154 sdp_media: *const SdpMedia, 155 ) -> *const Vec<SdpBandwidth> { 156 (*sdp_media).get_bandwidth() 157 } 158 159 #[no_mangle] 160 pub unsafe extern "C" fn sdp_media_has_connection(sdp_media: *const SdpMedia) -> bool { 161 (*sdp_media).get_connection().is_some() 162 } 163 164 #[no_mangle] 165 pub unsafe extern "C" fn sdp_get_media_connection( 166 sdp_media: *const SdpMedia, 167 ret: *mut RustSdpConnection, 168 ) -> nsresult { 169 if let &Some(ref connection) = (*sdp_media).get_connection() { 170 *ret = RustSdpConnection::from(connection); 171 return NS_OK; 172 } 173 NS_ERROR_INVALID_ARG 174 } 175 176 #[no_mangle] 177 pub unsafe extern "C" fn sdp_get_media_attribute_list( 178 sdp_media: *const SdpMedia, 179 ) -> *const Vec<SdpAttribute> { 180 (*sdp_media).get_attributes() 181 } 182 183 #[no_mangle] 184 pub unsafe extern "C" fn sdp_media_clear_codecs(sdp_media: *mut SdpMedia) { 185 (*sdp_media).remove_codecs() 186 } 187 188 #[no_mangle] 189 pub unsafe extern "C" fn sdp_media_add_codec( 190 sdp_media: *mut SdpMedia, 191 pt: u8, 192 codec_name: StringView, 193 clockrate: u32, 194 channels: u16, 195 ) -> nsresult { 196 let rtpmap = SdpAttributeRtpmap { 197 payload_type: pt, 198 codec_name: match codec_name.try_into() { 199 Ok(x) => x, 200 Err(boxed_error) => { 201 error!("Error while parsing string, description: {}", boxed_error); 202 return NS_ERROR_INVALID_ARG; 203 } 204 }, 205 frequency: clockrate, 206 channels: Some(channels as u32), 207 }; 208 209 match (*sdp_media).add_codec(rtpmap) { 210 Ok(_) => NS_OK, 211 Err(_) => NS_ERROR_INVALID_ARG, 212 } 213 } 214 215 #[no_mangle] 216 pub unsafe extern "C" fn sdp_media_add_datachannel( 217 sdp_media: *mut SdpMedia, 218 name: StringView, 219 port: u16, 220 streams: u16, 221 message_size: u32, 222 ) -> nsresult { 223 let name_str = match name.try_into() { 224 Ok(x) => x, 225 Err(_) => { 226 return NS_ERROR_INVALID_ARG; 227 } 228 }; 229 match (*sdp_media).add_datachannel(name_str, port, streams, message_size) { 230 Ok(_) => NS_OK, 231 Err(_) => NS_ERROR_INVALID_ARG, 232 } 233 }