RsdparsaSdpInc.h (15121B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 #ifndef _RUSTSDPINC_H_ 7 #define _RUSTSDPINC_H_ 8 9 #include <stdbool.h> 10 #include <stdint.h> 11 12 #include "nsError.h" 13 14 struct BandwidthVec; 15 struct RustSdpSession; 16 struct RustSdpError; 17 struct RustMediaSection; 18 struct RustAttributeList; 19 struct StringVec; 20 struct U8Vec; 21 struct U32Vec; 22 struct U16Vec; 23 struct F32Vec; 24 struct SsrcVec; 25 struct RustHeapString; 26 27 enum class RustSdpAddressType { kRustAddrIp4, kRustAddrIp6 }; 28 29 struct StringView { 30 const char* buf; 31 size_t len; 32 }; 33 34 struct RustAddress { 35 char ipAddress[50]; 36 StringView fqdn; 37 bool isFqdn; 38 }; 39 40 struct RustExplicitlyTypedAddress { 41 RustSdpAddressType addressType; 42 RustAddress address; 43 }; 44 45 struct RustSdpConnection { 46 RustExplicitlyTypedAddress addr; 47 uint8_t ttl; 48 uint64_t amount; 49 }; 50 51 struct RustSdpOrigin { 52 StringView username; 53 uint64_t sessionId; 54 uint64_t sessionVersion; 55 RustExplicitlyTypedAddress addr; // TODO address 56 }; 57 58 enum class RustSdpMediaValue { kRustAudio, kRustVideo, kRustApplication }; 59 60 enum class RustSdpProtocolValue { 61 kRustRtpSavpf, 62 kRustUdpTlsRtpSavp, 63 kRustTcpDtlsRtpSavp, 64 kRustUdpTlsRtpSavpf, 65 kRustTcpDtlsRtpSavpf, 66 kRustDtlsSctp, 67 kRustUdpDtlsSctp, 68 kRustTcpDtlsSctp, 69 kRustRtpAvp, 70 kRustRtpAvpf, 71 kRustRtpSavp, 72 }; 73 74 enum class RustSdpFormatType { kRustIntegers, kRustStrings }; 75 76 enum class RustSdpAttributeFingerprintHashAlgorithm : uint16_t { 77 kSha1, 78 kSha224, 79 kSha256, 80 kSha384, 81 kSha512, 82 }; 83 84 struct RustSdpAttributeFingerprint { 85 RustSdpAttributeFingerprintHashAlgorithm hashAlgorithm; 86 U8Vec* fingerprint; 87 }; 88 89 enum class RustSdpSetup { 90 kRustActive, 91 kRustActpass, 92 kRustHoldconn, 93 kRustPassive 94 }; 95 96 enum class RustSdpAttributeDtlsMessageType : uint8_t { 97 kClient, 98 kServer, 99 }; 100 101 struct RustSdpAttributeDtlsMessage { 102 RustSdpAttributeDtlsMessageType role; 103 StringView value; 104 }; 105 106 struct RustSdpAttributeSsrc { 107 uint32_t id; 108 StringView attribute; 109 StringView value; 110 }; 111 112 enum class RustSdpAttributeSsrcGroupSemantic { 113 kRustDup, 114 kRustFid, 115 kRustFec, 116 kRustFecFr, 117 kRustSim, 118 }; 119 120 struct RustSdpAttributeSsrcGroup { 121 RustSdpAttributeSsrcGroupSemantic semantic; 122 SsrcVec* ssrcs; 123 }; 124 125 struct RustSdpAttributeRtpmap { 126 uint8_t payloadType; 127 StringView codecName; 128 uint32_t frequency; 129 uint32_t channels; 130 }; 131 132 struct RustSdpAttributeRtcpFb { 133 uint32_t payloadType; 134 uint32_t feedbackType; 135 StringView parameter; 136 StringView extra; 137 }; 138 139 struct RustSdpAttributeRidParameters { 140 uint32_t max_width; 141 uint32_t max_height; 142 uint32_t max_fps; 143 uint32_t max_fs; 144 uint32_t max_br; 145 uint32_t max_pps; 146 StringVec* unknown; 147 }; 148 149 struct RustSdpAttributeRid { 150 StringView id; 151 uint32_t direction; 152 U16Vec* formats; 153 RustSdpAttributeRidParameters params; 154 StringVec* depends; 155 }; 156 157 struct RustSdpAttributeImageAttrXYRange { 158 uint32_t min; 159 uint32_t max; 160 uint32_t step; 161 U32Vec* discrete_values; 162 }; 163 164 struct RustSdpAttributeImageAttrSRange { 165 float min; 166 float max; 167 F32Vec* discrete_values; 168 }; 169 170 struct RustSdpAttributeImageAttrPRange { 171 float min; 172 float max; 173 }; 174 175 struct RustSdpAttributeImageAttrSet { 176 RustSdpAttributeImageAttrXYRange x; 177 RustSdpAttributeImageAttrXYRange y; 178 bool has_sar; 179 RustSdpAttributeImageAttrSRange sar; 180 bool has_par; 181 RustSdpAttributeImageAttrPRange par; 182 float q; 183 }; 184 185 struct RustSdpAttributeImageAttrSetVec; 186 struct RustSdpAttributeImageAttrSetList { 187 RustSdpAttributeImageAttrSetVec* sets; 188 }; 189 190 struct RustSdpAttributeImageAttr { 191 uint32_t payloadType; 192 RustSdpAttributeImageAttrSetList send; 193 RustSdpAttributeImageAttrSetList recv; 194 }; 195 196 struct RustAv1FmtpParameters { 197 uint8_t profile; 198 bool has_profile; 199 uint8_t level_idx; 200 bool has_level_idx; 201 uint8_t tier; 202 bool has_tier; 203 }; 204 205 struct RustRtxFmtpParameters { 206 uint8_t apt; 207 bool has_rtx_time; 208 uint32_t rtx_time; 209 }; 210 211 struct RustSdpAttributeFmtpParameters { 212 // H264 213 uint32_t packetization_mode; 214 bool level_asymmetry_allowed; 215 uint32_t profile_level_id; 216 uint32_t max_fs; 217 uint32_t max_cpb; 218 uint32_t max_dpb; 219 uint32_t max_br; 220 uint32_t max_mbps; 221 222 // VP8 and VP9 223 // max_fs, already defined in H264 224 uint32_t max_fr; 225 226 // Opus 227 uint32_t maxplaybackrate; 228 uint32_t maxaveragebitrate; 229 bool usedtx; 230 bool stereo; 231 bool useinbandfec; 232 bool cbr; 233 uint32_t ptime; 234 uint32_t minptime; 235 uint32_t maxptime; 236 237 // telephone-event 238 StringView dtmf_tones; 239 240 // AV1 241 RustAv1FmtpParameters av1; 242 243 // RTX 244 RustRtxFmtpParameters rtx; 245 246 // Red codecs 247 U8Vec* encodings; 248 249 // Unknown 250 StringVec* unknown_tokens; 251 }; 252 253 struct RustSdpAttributeFmtp { 254 uint8_t payloadType; 255 StringView codecName; 256 RustSdpAttributeFmtpParameters parameters; 257 }; 258 259 struct RustSdpAttributeFlags { 260 bool iceLite; 261 bool rtcpMux; 262 bool rtcpRsize; 263 bool bundleOnly; 264 bool endOfCandidates; 265 bool extmapAllowMixed; 266 }; 267 268 struct RustSdpAttributeMsid { 269 StringView id; 270 StringView appdata; 271 }; 272 273 struct RustSdpAttributeMsidSemantic { 274 StringView semantic; 275 StringVec* msids; 276 }; 277 278 enum class RustSdpAttributeGroupSemantic { 279 kRustLipSynchronization, 280 kRustFlowIdentification, 281 kRustSingleReservationFlow, 282 kRustAlternateNetworkAddressType, 283 kRustForwardErrorCorrection, 284 kRustDecodingDependency, 285 kRustBundle, 286 }; 287 288 struct RustSdpAttributeGroup { 289 RustSdpAttributeGroupSemantic semantic; 290 StringVec* tags; 291 }; 292 293 struct RustSdpAttributeRtcp { 294 uint32_t port; 295 RustExplicitlyTypedAddress unicastAddr; 296 bool has_address; 297 }; 298 299 struct RustSdpAttributeSctpmap { 300 uint32_t port; 301 uint32_t channels; 302 }; 303 304 struct RustSdpAttributeSimulcastId { 305 StringView id; 306 bool paused; 307 }; 308 309 struct RustSdpAttributeSimulcastIdVec; 310 struct RustSdpAttributeSimulcastVersion { 311 RustSdpAttributeSimulcastIdVec* ids; 312 }; 313 314 struct RustSdpAttributeSimulcastVersionVec; 315 struct RustSdpAttributeSimulcast { 316 RustSdpAttributeSimulcastVersionVec* send; 317 RustSdpAttributeSimulcastVersionVec* recv; 318 }; 319 320 enum class RustDirection { 321 kRustRecvonly, 322 kRustSendonly, 323 kRustSendrecv, 324 kRustInactive 325 }; 326 327 struct RustSdpAttributeRemoteCandidate { 328 uint32_t component; 329 RustAddress address; 330 uint32_t port; 331 }; 332 333 struct RustSdpAttributeExtmap { 334 uint16_t id; 335 bool direction_specified; 336 RustDirection direction; 337 StringView url; 338 StringView extensionAttributes; 339 }; 340 341 extern "C" { 342 343 size_t string_vec_len(const StringVec* vec); 344 nsresult string_vec_get_view(const StringVec* vec, size_t index, 345 StringView* str); 346 nsresult free_boxed_string_vec(StringVec* vec); 347 348 size_t f32_vec_len(const F32Vec* vec); 349 nsresult f32_vec_get(const F32Vec* vec, size_t index, float* ret); 350 351 size_t u32_vec_len(const U32Vec* vec); 352 nsresult u32_vec_get(const U32Vec* vec, size_t index, uint32_t* ret); 353 354 size_t u16_vec_len(const U16Vec* vec); 355 nsresult u16_vec_get(const U16Vec* vec, size_t index, uint16_t* ret); 356 357 size_t u8_vec_len(const U8Vec* vec); 358 nsresult u8_vec_get(const U8Vec* vec, size_t index, uint8_t* ret); 359 360 size_t ssrc_vec_len(const SsrcVec* vec); 361 nsresult ssrc_vec_get_id(const SsrcVec* vec, size_t index, uint32_t* ret); 362 363 void sdp_free_string(char* string); 364 365 nsresult parse_sdp(StringView sdp, bool fail_on_warning, RustSdpSession** ret, 366 RustSdpError** err); 367 RustSdpSession* sdp_new_reference(RustSdpSession* aSess); 368 RustSdpSession* create_sdp_clone(const RustSdpSession* aSess); 369 void sdp_free_session(RustSdpSession* ret); 370 size_t sdp_get_error_line_num(const RustSdpError* err); 371 char* sdp_get_error_message(const RustSdpError* err); 372 void sdp_free_error_message(char* message); 373 void sdp_free_error(RustSdpError* err); 374 375 RustSdpOrigin sdp_get_origin(const RustSdpSession* aSess); 376 377 uint32_t get_sdp_bandwidth(const RustSdpSession* aSess, 378 const char* aBandwidthType); 379 BandwidthVec* sdp_get_session_bandwidth_vec(const RustSdpSession* aSess); 380 BandwidthVec* sdp_get_media_bandwidth_vec(const RustMediaSection* aMediaSec); 381 char* sdp_serialize_bandwidth(const BandwidthVec* bandwidths); 382 bool sdp_session_has_connection(const RustSdpSession* aSess); 383 nsresult sdp_get_session_connection(const RustSdpSession* aSess, 384 RustSdpConnection* ret); 385 RustAttributeList* get_sdp_session_attributes(const RustSdpSession* aSess); 386 387 size_t sdp_media_section_count(const RustSdpSession* aSess); 388 RustMediaSection* sdp_get_media_section(const RustSdpSession* aSess, 389 size_t aLevel); 390 nsresult sdp_add_media_section(RustSdpSession* aSess, uint32_t aMediaType, 391 uint32_t aDirection, uint16_t aPort, 392 uint32_t aProtocol, uint32_t aAddrType, 393 StringView aAddr); 394 RustSdpMediaValue sdp_rust_get_media_type(const RustMediaSection* aMediaSec); 395 RustSdpProtocolValue sdp_get_media_protocol(const RustMediaSection* aMediaSec); 396 RustSdpFormatType sdp_get_format_type(const RustMediaSection* aMediaSec); 397 StringVec* sdp_get_format_string_vec(const RustMediaSection* aMediaSec); 398 U32Vec* sdp_get_format_u32_vec(const RustMediaSection* aMediaSec); 399 void sdp_set_media_port(const RustMediaSection* aMediaSec, uint32_t aPort); 400 uint32_t sdp_get_media_port(const RustMediaSection* aMediaSec); 401 uint32_t sdp_get_media_port_count(const RustMediaSection* aMediaSec); 402 uint32_t sdp_get_media_bandwidth(const RustMediaSection* aMediaSec, 403 const char* aBandwidthType); 404 bool sdp_media_has_connection(const RustMediaSection* aMediaSec); 405 nsresult sdp_get_media_connection(const RustMediaSection* aMediaSec, 406 RustSdpConnection* ret); 407 408 RustAttributeList* sdp_get_media_attribute_list( 409 const RustMediaSection* aMediaSec); 410 411 nsresult sdp_media_add_codec(const RustMediaSection* aMediaSec, uint8_t aPT, 412 StringView aCodecName, uint32_t aClockrate, 413 uint16_t channels); 414 void sdp_media_clear_codecs(const RustMediaSection* aMediaSec); 415 nsresult sdp_media_add_datachannel(const RustMediaSection* aMediaSec, 416 StringView aName, uint16_t aPort, 417 uint16_t streams, uint32_t aMessageSize); 418 419 nsresult sdp_get_iceufrag(const RustAttributeList* aList, StringView* ret); 420 nsresult sdp_get_icepwd(const RustAttributeList* aList, StringView* ret); 421 nsresult sdp_get_identity(const RustAttributeList* aList, StringView* ret); 422 nsresult sdp_get_iceoptions(const RustAttributeList* aList, StringVec** ret); 423 424 nsresult sdp_get_dtls_message(const RustAttributeList* aList, 425 RustSdpAttributeDtlsMessage* ret); 426 427 size_t sdp_get_fingerprint_count(const RustAttributeList* aList); 428 void sdp_get_fingerprints(const RustAttributeList* aList, size_t listSize, 429 RustSdpAttributeFingerprint* ret); 430 431 nsresult sdp_get_setup(const RustAttributeList* aList, RustSdpSetup* ret); 432 433 size_t sdp_get_ssrc_count(const RustAttributeList* aList); 434 void sdp_get_ssrcs(const RustAttributeList* aList, size_t listSize, 435 RustSdpAttributeSsrc* ret); 436 437 size_t sdp_get_ssrc_group_count(const RustAttributeList* aList); 438 void sdp_get_ssrc_groups(const RustAttributeList* aList, size_t listSize, 439 RustSdpAttributeSsrcGroup* ret); 440 441 size_t sdp_get_rtpmap_count(const RustAttributeList* aList); 442 void sdp_get_rtpmaps(const RustAttributeList* aList, size_t listSize, 443 RustSdpAttributeRtpmap* ret); 444 445 size_t sdp_get_fmtp_count(const RustAttributeList* aList); 446 size_t sdp_get_fmtp(const RustAttributeList* aList, size_t listSize, 447 RustSdpAttributeFmtp* ret); 448 449 int64_t sdp_get_ptime(const RustAttributeList* aList); 450 int64_t sdp_get_max_msg_size(const RustAttributeList* aList); 451 int64_t sdp_get_sctp_port(const RustAttributeList* aList); 452 nsresult sdp_get_maxptime(const RustAttributeList* aList, uint64_t* aMaxPtime); 453 454 RustSdpAttributeFlags sdp_get_attribute_flags(const RustAttributeList* aList); 455 456 nsresult sdp_get_mid(const RustAttributeList* aList, StringView* ret); 457 458 size_t sdp_get_msid_count(const RustAttributeList* aList); 459 void sdp_get_msids(const RustAttributeList* aList, size_t listSize, 460 RustSdpAttributeMsid* ret); 461 462 size_t sdp_get_msid_semantic_count(RustAttributeList* aList); 463 void sdp_get_msid_semantics(const RustAttributeList* aList, size_t listSize, 464 RustSdpAttributeMsidSemantic* ret); 465 466 size_t sdp_get_group_count(const RustAttributeList* aList); 467 void sdp_get_groups(const RustAttributeList* aList, size_t listSize, 468 RustSdpAttributeGroup* ret); 469 470 nsresult sdp_get_rtcp(const RustAttributeList* aList, 471 RustSdpAttributeRtcp* ret); 472 473 size_t sdp_get_rtcpfb_count(const RustAttributeList* aList); 474 void sdp_get_rtcpfbs(const RustAttributeList* aList, size_t listSize, 475 RustSdpAttributeRtcpFb* ret); 476 477 size_t sdp_get_imageattr_count(const RustAttributeList* aList); 478 void sdp_get_imageattrs(const RustAttributeList* aList, size_t listSize, 479 RustSdpAttributeImageAttr* ret); 480 481 size_t sdp_imageattr_get_set_count(const RustSdpAttributeImageAttrSetVec* sets); 482 void sdp_imageattr_get_sets(const RustSdpAttributeImageAttrSetVec* sets, 483 size_t listSize, RustSdpAttributeImageAttrSet* ret); 484 485 size_t sdp_get_sctpmap_count(const RustAttributeList* aList); 486 void sdp_get_sctpmaps(const RustAttributeList* aList, size_t listSize, 487 RustSdpAttributeSctpmap* ret); 488 489 nsresult sdp_get_simulcast(const RustAttributeList* aList, 490 RustSdpAttributeSimulcast* ret); 491 492 size_t sdp_simulcast_get_version_count( 493 const RustSdpAttributeSimulcastVersionVec* aVersionList); 494 void sdp_simulcast_get_versions( 495 const RustSdpAttributeSimulcastVersionVec* aversionList, size_t listSize, 496 RustSdpAttributeSimulcastVersion* ret); 497 498 size_t sdp_simulcast_get_ids_count(const RustSdpAttributeSimulcastIdVec* aAlts); 499 void sdp_simulcast_get_ids(const RustSdpAttributeSimulcastIdVec* aAlts, 500 size_t listSize, RustSdpAttributeSimulcastId* ret); 501 502 RustDirection sdp_get_direction(const RustAttributeList* aList); 503 504 size_t sdp_get_remote_candidate_count(const RustAttributeList* aList); 505 void sdp_get_remote_candidates(const RustAttributeList* aList, size_t listSize, 506 RustSdpAttributeRemoteCandidate* ret); 507 508 size_t sdp_get_candidate_count(const RustAttributeList* aList); 509 void sdp_get_candidates(const RustAttributeList* aLisst, size_t listSize, 510 StringVec** ret); 511 512 size_t sdp_get_rid_count(const RustAttributeList* aList); 513 void sdp_get_rids(const RustAttributeList* aList, size_t listSize, 514 RustSdpAttributeRid* ret); 515 516 size_t sdp_get_extmap_count(const RustAttributeList* aList); 517 void sdp_get_extmaps(const RustAttributeList* aList, size_t listSize, 518 RustSdpAttributeExtmap* ret); 519 520 } // extern "C" 521 522 #endif