diff --git a/webrtc/Cargo.toml b/webrtc/Cargo.toml index 3f58fe9a5..95583813b 100644 --- a/webrtc/Cargo.toml +++ b/webrtc/Cargo.toml @@ -40,7 +40,7 @@ bytes = "1" thiserror = "1.0" waitgroup = "0.1.2" regex = "1.7.1" -smol_str = "0.2.0" +smol_str = { version = "0.2.0", features = ["serde"] } url = "2.2" rustls = { version = "0.19.0", features = ["dangerous_configuration"]} rcgen = { version = "0.10.0", features = ["pem", "x509-parser"]} diff --git a/webrtc/src/lib.rs b/webrtc/src/lib.rs index 9a7ee565f..3f1335fa7 100644 --- a/webrtc/src/lib.rs +++ b/webrtc/src/lib.rs @@ -12,8 +12,6 @@ pub use rtcp; pub use rtp; pub use sctp; pub use sdp; -use serde::{Deserialize, Serialize}; -use smol_str::SmolStr; pub use srtp; pub use stun; pub use turn; @@ -45,25 +43,3 @@ pub(crate) const SDP_ATTRIBUTE_RID: &str = "rid"; pub(crate) const GENERATED_CERTIFICATE_ORIGIN: &str = "WebRTC"; pub(crate) const SDES_REPAIR_RTP_STREAM_ID_URI: &str = "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"; - -#[derive(Clone, Debug, Default, PartialEq)] -pub struct SmallStr(SmolStr); - -impl Serialize for SmallStr { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - serializer.serialize_str(self.0.as_str()) - } -} - -impl<'de> Deserialize<'de> for SmallStr { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - Ok(SmallStr(SmolStr::new(s))) - } -} diff --git a/webrtc/src/peer_connection/mod.rs b/webrtc/src/peer_connection/mod.rs index 698b95340..8cdec1c27 100644 --- a/webrtc/src/peer_connection/mod.rs +++ b/webrtc/src/peer_connection/mod.rs @@ -66,7 +66,6 @@ use crate::sctp_transport::RTCSctpTransport; use crate::stats::StatsReport; use crate::track::track_local::TrackLocal; use crate::track::track_remote::TrackRemote; -use crate::SmallStr; use ::ice::candidate::candidate_base::unmarshal_candidate; use ::ice::candidate::Candidate; @@ -458,7 +457,7 @@ impl RTCPeerConnection { let mid = t.mid(); let m = mid .as_ref() - .and_then(|mid| get_by_mid(mid.0.as_str(), local_desc)); + .and_then(|mid| get_by_mid(mid.as_str(), local_desc)); // Step 5.2 if !t.stopped.load(Ordering::SeqCst) { if m.is_none() { @@ -499,7 +498,7 @@ impl RTCPeerConnection { if let Some(remote_desc) = ¤t_remote_description { if let Some(rm) = t .mid() - .and_then(|mid| get_by_mid(mid.0.as_str(), remote_desc)) + .and_then(|mid| get_by_mid(mid.as_str(), remote_desc)) { if get_peer_direction(m) != t.direction() && get_peer_direction(rm) != t.direction().reverse() @@ -518,7 +517,7 @@ impl RTCPeerConnection { }; let offered_direction = match t .mid() - .and_then(|mid| get_by_mid(mid.0.as_str(), remote_desc)) + .and_then(|mid| get_by_mid(mid.as_str(), remote_desc)) { Some(d) => { let dir = get_peer_direction(d); @@ -551,8 +550,8 @@ impl RTCPeerConnection { }; if let Some(remote_desc) = &*params.current_remote_description.lock().await { - return get_by_mid(search_mid.0.as_str(), local_desc).is_some() - || get_by_mid(search_mid.0.as_str(), remote_desc).is_some(); + return get_by_mid(search_mid.as_str(), local_desc).is_some() + || get_by_mid(search_mid.as_str(), remote_desc).is_some(); } } } @@ -802,13 +801,10 @@ impl RTCPeerConnection { } } - t.set_mid(crate::SmallStr(SmolStr::from(mid)))?; + t.set_mid(SmolStr::from(mid))?; } else { let greater_mid = self.internal.greater_mid.fetch_add(1, Ordering::SeqCst); - t.set_mid(crate::SmallStr(SmolStr::from(format!( - "{}", - greater_mid + 1 - ))))?; + t.set_mid(SmolStr::from(format!("{}", greater_mid + 1)))?; } } @@ -1368,7 +1364,7 @@ impl RTCPeerConnection { if let Some(t) = t { if t.mid().is_none() { - t.set_mid(crate::SmallStr(SmolStr::from(mid_value)))?; + t.set_mid(SmolStr::from(mid_value))?; } } else { let local_direction = @@ -1414,7 +1410,7 @@ impl RTCPeerConnection { self.internal.add_rtp_transceiver(Arc::clone(&t)).await; if t.mid().is_none() { - t.set_mid(SmallStr(SmolStr::from(mid_value)))?; + t.set_mid(SmolStr::from(mid_value))?; } } } diff --git a/webrtc/src/peer_connection/peer_connection_internal.rs b/webrtc/src/peer_connection/peer_connection_internal.rs index a77dc2f3c..fc06519f2 100644 --- a/webrtc/src/peer_connection/peer_connection_internal.rs +++ b/webrtc/src/peer_connection/peer_connection_internal.rs @@ -10,7 +10,7 @@ use crate::stats::{ StatsReportType, }; use crate::track::TrackStream; -use crate::{SmallStr, SDES_REPAIR_RTP_STREAM_ID_URI, SDP_ATTRIBUTE_RID}; +use crate::{SDES_REPAIR_RTP_STREAM_ID_URI, SDP_ATTRIBUTE_RID}; use arc_swap::ArcSwapOption; use std::collections::VecDeque; use std::sync::atomic::AtomicIsize; @@ -178,7 +178,7 @@ impl PeerConnectionInternal { for t in tracks { if !t.rid().is_empty() { if let Some(details) = - track_details_for_rid(&track_details, SmallStr(SmolStr::from(t.rid()))) + track_details_for_rid(&track_details, SmolStr::from(t.rid())) { t.set_id(details.id.clone()); t.set_stream_id(details.stream_id.clone()); @@ -669,7 +669,7 @@ impl PeerConnectionInternal { // TODO: This is dubious because of rollbacks. t.sender().await.set_negotiated(); media_sections.push(MediaSection { - id: t.mid().unwrap().0.to_string(), + id: t.mid().unwrap().to_string(), transceivers: vec![Arc::clone(t)], ..Default::default() }); @@ -783,7 +783,7 @@ impl PeerConnectionInternal { for t in &local_transceivers { t.sender().await.set_negotiated(); media_sections.push(MediaSection { - id: t.mid().unwrap().0.to_string(), + id: t.mid().unwrap().to_string(), transceivers: vec![Arc::clone(t)], ..Default::default() }); @@ -1004,7 +1004,7 @@ impl PeerConnectionInternal { let transceivers = self.rtp_transceivers.lock().await; for t in &*transceivers { - if t.mid().as_ref() != Some(&SmallStr(SmolStr::from(&mid))) { + if t.mid().as_ref() != Some(&SmolStr::from(&mid)) { continue; } @@ -1028,7 +1028,7 @@ impl PeerConnectionInternal { let track = receiver .receive_for_rid( - SmallStr(SmolStr::from(rid)), + SmolStr::from(rid), params, TrackStream { stream_info: Some(stream_info.clone()), @@ -1167,7 +1167,7 @@ impl PeerConnectionInternal { pub(super) async fn has_local_description_changed(&self, desc: &RTCSessionDescription) -> bool { let rtp_transceivers = self.rtp_transceivers.lock().await; for t in &*rtp_transceivers { - let m = match t.mid().and_then(|mid| get_by_mid(mid.0.as_str(), desc)) { + let m = match t.mid().and_then(|mid| get_by_mid(mid.as_str(), desc)) { Some(m) => m, None => return true, }; @@ -1204,7 +1204,7 @@ impl PeerConnectionInternal { // TODO: There's a lot of await points here that could run concurrently with `futures::join_all`. struct TrackInfo { ssrc: SSRC, - mid: SmallStr, + mid: SmolStr, track_id: String, kind: &'static str, } @@ -1329,8 +1329,8 @@ impl PeerConnectionInternal { struct TrackInfo { track_id: String, ssrc: SSRC, - mid: SmallStr, - rid: Option, + mid: SmolStr, + rid: Option, kind: &'static str, } let mut track_infos = vec![]; diff --git a/webrtc/src/peer_connection/sdp/mod.rs b/webrtc/src/peer_connection/sdp/mod.rs index b98836378..b40dea68d 100644 --- a/webrtc/src/peer_connection/sdp/mod.rs +++ b/webrtc/src/peer_connection/sdp/mod.rs @@ -19,7 +19,7 @@ pub mod sdp_type; pub mod session_description; use crate::peer_connection::MEDIA_SECTION_APPLICATION; -use crate::{SmallStr, SDP_ATTRIBUTE_RID}; +use crate::SDP_ATTRIBUTE_RID; use ice::candidate::candidate_base::unmarshal_candidate; use ice::candidate::Candidate; use sdp::description::common::{Address, ConnectionInformation}; @@ -38,13 +38,13 @@ use url::Url; /// This isn't keyed by SSRC because it also needs to support rid based sources #[derive(Default, Debug, Clone)] pub(crate) struct TrackDetails { - pub(crate) mid: SmallStr, + pub(crate) mid: SmolStr, pub(crate) kind: RTPCodecType, pub(crate) stream_id: String, pub(crate) id: String, pub(crate) ssrcs: Vec, pub(crate) repair_ssrc: SSRC, - pub(crate) rids: Vec, + pub(crate) rids: Vec, } pub(crate) fn track_details_for_ssrc( @@ -56,7 +56,7 @@ pub(crate) fn track_details_for_ssrc( pub(crate) fn track_details_for_rid( track_details: &[TrackDetails], - rid: SmallStr, + rid: SmolStr, ) -> Option<&TrackDetails> { track_details.iter().find(|x| x.rids.contains(&rid)) } @@ -186,8 +186,7 @@ pub(crate) fn track_details_from_sdp( } if track_idx < tracks_in_media_section.len() { - tracks_in_media_section[track_idx].mid = - SmallStr(SmolStr::from(mid_value)); + tracks_in_media_section[track_idx].mid = SmolStr::from(mid_value); tracks_in_media_section[track_idx].kind = codec_type; tracks_in_media_section[track_idx].stream_id = stream_id.to_owned(); tracks_in_media_section[track_idx].id = track_id.to_owned(); @@ -195,7 +194,7 @@ pub(crate) fn track_details_from_sdp( tracks_in_media_section[track_idx].repair_ssrc = repair_ssrc; } else { let track_details = TrackDetails { - mid: SmallStr(SmolStr::from(mid_value)), + mid: SmolStr::from(mid_value), kind: codec_type, stream_id: stream_id.to_owned(), id: track_id.to_owned(), @@ -214,7 +213,7 @@ pub(crate) fn track_details_from_sdp( let rids = get_rids(media); if !rids.is_empty() && !track_id.is_empty() && !stream_id.is_empty() { let mut simulcast_track = TrackDetails { - mid: SmallStr(SmolStr::from(mid_value)), + mid: SmolStr::from(mid_value), kind: codec_type, stream_id: stream_id.to_owned(), id: track_id.to_owned(), @@ -222,7 +221,7 @@ pub(crate) fn track_details_from_sdp( ..Default::default() }; for rid in rids.keys() { - simulcast_track.rids.push(SmallStr(SmolStr::from(rid))); + simulcast_track.rids.push(SmolStr::from(rid)); } if simulcast_track.rids.len() == tracks_in_media_section.len() { for track in &tracks_in_media_section { diff --git a/webrtc/src/rtp_transceiver/mod.rs b/webrtc/src/rtp_transceiver/mod.rs index 4b9616f92..56fd95c89 100644 --- a/webrtc/src/rtp_transceiver/mod.rs +++ b/webrtc/src/rtp_transceiver/mod.rs @@ -15,7 +15,6 @@ use interceptor::{ }; use smol_str::SmolStr; -use crate::SmallStr; use log::trace; use serde::{Deserialize, Serialize}; use std::fmt; @@ -96,7 +95,7 @@ pub struct RTCRtpRtxParameters { /// #[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct RTCRtpCodingParameters { - pub rid: SmallStr, + pub rid: SmolStr, pub ssrc: SSRC, pub payload_type: PayloadType, pub rtx: RTCRtpRtxParameters, @@ -175,7 +174,7 @@ pub type TriggerNegotiationNeededFnOption = /// RTPTransceiver represents a combination of an RTPSender and an RTPReceiver that share a common mid. pub struct RTCRtpTransceiver { - mid: OnceCell, //atomic.Value + mid: OnceCell, //atomic.Value sender: Mutex>, //atomic.Value receiver: Mutex>, //atomic.Value @@ -296,14 +295,14 @@ impl RTCRtpTransceiver { } /// set_mid sets the RTPTransceiver's mid. If it was already set, will return an error. - pub(crate) fn set_mid(&self, mid: SmallStr) -> Result<()> { + pub(crate) fn set_mid(&self, mid: SmolStr) -> Result<()> { self.mid .set(mid) .map_err(|_| Error::ErrRTPTransceiverCannotChangeMid) } /// mid gets the Transceiver's mid value. When not already set, this value will be set in CreateOffer or create_answer. - pub fn mid(&self) -> Option { + pub fn mid(&self) -> Option { self.mid.get().map(Clone::clone) } @@ -482,7 +481,7 @@ pub(crate) async fn find_by_mid( local_transceivers: &mut Vec>, ) -> Option> { for (i, t) in local_transceivers.iter().enumerate() { - if t.mid() == Some(SmallStr(SmolStr::from(mid))) { + if t.mid() == Some(SmolStr::from(mid)) { return Some(local_transceivers.remove(i)); } } diff --git a/webrtc/src/rtp_transceiver/rtp_receiver/mod.rs b/webrtc/src/rtp_transceiver/rtp_receiver/mod.rs index 608640127..9d3cc4bd5 100644 --- a/webrtc/src/rtp_transceiver/rtp_receiver/mod.rs +++ b/webrtc/src/rtp_transceiver/rtp_receiver/mod.rs @@ -15,7 +15,6 @@ use crate::rtp_transceiver::{ }; use crate::track::track_remote::TrackRemote; use crate::track::{TrackStream, TrackStreams}; -use crate::SmallStr; use arc_swap::ArcSwapOption; use interceptor::stream_info::RTPHeaderExtension; @@ -760,13 +759,13 @@ impl RTCRtpReceiver { /// It populates all the internal state for the given RID pub(crate) async fn receive_for_rid( &self, - rid: SmallStr, + rid: SmolStr, params: RTCRtpParameters, stream: TrackStream, ) -> Result> { let mut tracks = self.internal.tracks.write().await; for t in &mut *tracks { - if SmallStr(SmolStr::from(t.track.rid())) == rid { + if *t.track.rid() == rid { t.track.set_kind(self.kind); if let Some(codec) = params.codecs.first() { t.track.set_codec(codec.clone()); diff --git a/webrtc/src/stats/mod.rs b/webrtc/src/stats/mod.rs index 49f8b4e57..6a3dc5261 100644 --- a/webrtc/src/stats/mod.rs +++ b/webrtc/src/stats/mod.rs @@ -5,12 +5,12 @@ use crate::peer_connection::certificate::RTCCertificate; use crate::rtp_transceiver::rtp_codec::RTCRtpCodecParameters; use crate::rtp_transceiver::{PayloadType, SSRC}; use crate::sctp_transport::RTCSctpTransport; -use crate::SmallStr; use ice::agent::agent_stats::{CandidatePairStats, CandidateStats}; use ice::agent::Agent; use ice::candidate::{CandidatePairState, CandidateType}; use ice::network_type::NetworkType; +use smol_str::SmolStr; use stats_collector::StatsCollector; use serde::{Serialize, Serializer}; @@ -460,7 +460,7 @@ pub struct InboundRTPStats { // RTCInboundRtpStreamStats pub track_identifier: String, - pub mid: SmallStr, + pub mid: SmolStr, // TODO: `remoteId` // NB: `framesDecoded`, `frameWidth`, frameHeight`, `framesPerSecond`, `qpSum`, // `totalDecodeTime`, `totalInterFrameDelay`, and `totalSquaredInterFrameDelay` are all decoder @@ -505,9 +505,9 @@ pub struct OutboundRTPStats { // RTCOutboundRtpStreamStats // NB: non-canon in browsers this is available via `RTCMediaSourceStats` which we are unlikely to implement pub track_identifier: String, - pub mid: SmallStr, + pub mid: SmolStr, // TODO: `mediaSourceId` and `remoteId` - pub rid: Option, + pub rid: Option, pub header_bytes_sent: u64, // TODO: `retransmittedPacketsSent` and `retransmittedPacketsSent` // NB: `targetBitrate`, `totalEncodedBytesTarget`, `frameWidth` `frameHeight`, `framesPerSecond`, `framesSent`, diff --git a/webrtc/src/track/track_remote/mod.rs b/webrtc/src/track/track_remote/mod.rs index dd26629e0..4afcb0bdf 100644 --- a/webrtc/src/track/track_remote/mod.rs +++ b/webrtc/src/track/track_remote/mod.rs @@ -4,10 +4,10 @@ use crate::rtp_transceiver::rtp_codec::{RTCRtpCodecParameters, RTCRtpParameters, use crate::rtp_transceiver::{PayloadType, SSRC}; use crate::rtp_transceiver::rtp_receiver::RTPReceiverInternal; -use crate::SmallStr; use arc_swap::ArcSwapOption; use interceptor::{Attributes, Interceptor}; +use smol_str::SmolStr; use std::collections::VecDeque; use std::future::Future; use std::pin::Pin; @@ -47,7 +47,7 @@ pub struct TrackRemote { ssrc: AtomicU32, //SSRC, codec: SyncMutex, pub(crate) params: SyncMutex, - rid: SmallStr, + rid: SmolStr, media_engine: Arc, interceptor: Arc, @@ -78,7 +78,7 @@ impl TrackRemote { receive_mtu: usize, kind: RTPCodecType, ssrc: SSRC, - rid: SmallStr, + rid: SmolStr, receiver: Weak, media_engine: Arc, interceptor: Arc, @@ -135,7 +135,7 @@ impl TrackRemote { /// With Simulcast you will have multiple tracks with the same ID, but different RID values. /// In many cases a TrackRemote will not have an RID, so it is important to assert it is non-zero pub fn rid(&self) -> &str { - self.rid.0.as_str() + self.rid.as_str() } /// payload_type gets the PayloadType of the track