Skip to content

Commit f33c5f5

Browse files
authored
Merge pull request #453 from lolPants/feat/smol-str-native-serde
Use native serde impl for SmolStr
2 parents f8a8b6f + a6b0c0e commit f33c5f5

File tree

9 files changed

+43
-74
lines changed

9 files changed

+43
-74
lines changed

webrtc/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ bytes = "1"
4040
thiserror = "1.0"
4141
waitgroup = "0.1.2"
4242
regex = "1.7.1"
43-
smol_str = "0.2.0"
43+
smol_str = { version = "0.2.0", features = ["serde"] }
4444
url = "2.2"
4545
rustls = { version = "0.19.0", features = ["dangerous_configuration"]}
4646
rcgen = { version = "0.10.0", features = ["pem", "x509-parser"]}

webrtc/src/lib.rs

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ pub use rtcp;
1212
pub use rtp;
1313
pub use sctp;
1414
pub use sdp;
15-
use serde::{Deserialize, Serialize};
16-
use smol_str::SmolStr;
1715
pub use srtp;
1816
pub use stun;
1917
pub use turn;
@@ -45,25 +43,3 @@ pub(crate) const SDP_ATTRIBUTE_RID: &str = "rid";
4543
pub(crate) const GENERATED_CERTIFICATE_ORIGIN: &str = "WebRTC";
4644
pub(crate) const SDES_REPAIR_RTP_STREAM_ID_URI: &str =
4745
"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id";
48-
49-
#[derive(Clone, Debug, Default, PartialEq)]
50-
pub struct SmallStr(SmolStr);
51-
52-
impl Serialize for SmallStr {
53-
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
54-
where
55-
S: serde::Serializer,
56-
{
57-
serializer.serialize_str(self.0.as_str())
58-
}
59-
}
60-
61-
impl<'de> Deserialize<'de> for SmallStr {
62-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
63-
where
64-
D: serde::Deserializer<'de>,
65-
{
66-
let s = String::deserialize(deserializer)?;
67-
Ok(SmallStr(SmolStr::new(s)))
68-
}
69-
}

webrtc/src/peer_connection/mod.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ use crate::sctp_transport::RTCSctpTransport;
6666
use crate::stats::StatsReport;
6767
use crate::track::track_local::TrackLocal;
6868
use crate::track::track_remote::TrackRemote;
69-
use crate::SmallStr;
7069

7170
use ::ice::candidate::candidate_base::unmarshal_candidate;
7271
use ::ice::candidate::Candidate;
@@ -458,7 +457,7 @@ impl RTCPeerConnection {
458457
let mid = t.mid();
459458
let m = mid
460459
.as_ref()
461-
.and_then(|mid| get_by_mid(mid.0.as_str(), local_desc));
460+
.and_then(|mid| get_by_mid(mid.as_str(), local_desc));
462461
// Step 5.2
463462
if !t.stopped.load(Ordering::SeqCst) {
464463
if m.is_none() {
@@ -499,7 +498,7 @@ impl RTCPeerConnection {
499498
if let Some(remote_desc) = &current_remote_description {
500499
if let Some(rm) = t
501500
.mid()
502-
.and_then(|mid| get_by_mid(mid.0.as_str(), remote_desc))
501+
.and_then(|mid| get_by_mid(mid.as_str(), remote_desc))
503502
{
504503
if get_peer_direction(m) != t.direction()
505504
&& get_peer_direction(rm) != t.direction().reverse()
@@ -518,7 +517,7 @@ impl RTCPeerConnection {
518517
};
519518
let offered_direction = match t
520519
.mid()
521-
.and_then(|mid| get_by_mid(mid.0.as_str(), remote_desc))
520+
.and_then(|mid| get_by_mid(mid.as_str(), remote_desc))
522521
{
523522
Some(d) => {
524523
let dir = get_peer_direction(d);
@@ -551,8 +550,8 @@ impl RTCPeerConnection {
551550
};
552551

553552
if let Some(remote_desc) = &*params.current_remote_description.lock().await {
554-
return get_by_mid(search_mid.0.as_str(), local_desc).is_some()
555-
|| get_by_mid(search_mid.0.as_str(), remote_desc).is_some();
553+
return get_by_mid(search_mid.as_str(), local_desc).is_some()
554+
|| get_by_mid(search_mid.as_str(), remote_desc).is_some();
556555
}
557556
}
558557
}
@@ -802,13 +801,10 @@ impl RTCPeerConnection {
802801
}
803802
}
804803

805-
t.set_mid(crate::SmallStr(SmolStr::from(mid)))?;
804+
t.set_mid(SmolStr::from(mid))?;
806805
} else {
807806
let greater_mid = self.internal.greater_mid.fetch_add(1, Ordering::SeqCst);
808-
t.set_mid(crate::SmallStr(SmolStr::from(format!(
809-
"{}",
810-
greater_mid + 1
811-
))))?;
807+
t.set_mid(SmolStr::from(format!("{}", greater_mid + 1)))?;
812808
}
813809
}
814810

@@ -1368,7 +1364,7 @@ impl RTCPeerConnection {
13681364

13691365
if let Some(t) = t {
13701366
if t.mid().is_none() {
1371-
t.set_mid(crate::SmallStr(SmolStr::from(mid_value)))?;
1367+
t.set_mid(SmolStr::from(mid_value))?;
13721368
}
13731369
} else {
13741370
let local_direction =
@@ -1414,7 +1410,7 @@ impl RTCPeerConnection {
14141410
self.internal.add_rtp_transceiver(Arc::clone(&t)).await;
14151411

14161412
if t.mid().is_none() {
1417-
t.set_mid(SmallStr(SmolStr::from(mid_value)))?;
1413+
t.set_mid(SmolStr::from(mid_value))?;
14181414
}
14191415
}
14201416
}

webrtc/src/peer_connection/peer_connection_internal.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::stats::{
1010
StatsReportType,
1111
};
1212
use crate::track::TrackStream;
13-
use crate::{SmallStr, SDES_REPAIR_RTP_STREAM_ID_URI, SDP_ATTRIBUTE_RID};
13+
use crate::{SDES_REPAIR_RTP_STREAM_ID_URI, SDP_ATTRIBUTE_RID};
1414
use arc_swap::ArcSwapOption;
1515
use std::collections::VecDeque;
1616
use std::sync::atomic::AtomicIsize;
@@ -178,7 +178,7 @@ impl PeerConnectionInternal {
178178
for t in tracks {
179179
if !t.rid().is_empty() {
180180
if let Some(details) =
181-
track_details_for_rid(&track_details, SmallStr(SmolStr::from(t.rid())))
181+
track_details_for_rid(&track_details, SmolStr::from(t.rid()))
182182
{
183183
t.set_id(details.id.clone());
184184
t.set_stream_id(details.stream_id.clone());
@@ -669,7 +669,7 @@ impl PeerConnectionInternal {
669669
// TODO: This is dubious because of rollbacks.
670670
t.sender().await.set_negotiated();
671671
media_sections.push(MediaSection {
672-
id: t.mid().unwrap().0.to_string(),
672+
id: t.mid().unwrap().to_string(),
673673
transceivers: vec![Arc::clone(t)],
674674
..Default::default()
675675
});
@@ -783,7 +783,7 @@ impl PeerConnectionInternal {
783783
for t in &local_transceivers {
784784
t.sender().await.set_negotiated();
785785
media_sections.push(MediaSection {
786-
id: t.mid().unwrap().0.to_string(),
786+
id: t.mid().unwrap().to_string(),
787787
transceivers: vec![Arc::clone(t)],
788788
..Default::default()
789789
});
@@ -1004,7 +1004,7 @@ impl PeerConnectionInternal {
10041004

10051005
let transceivers = self.rtp_transceivers.lock().await;
10061006
for t in &*transceivers {
1007-
if t.mid().as_ref() != Some(&SmallStr(SmolStr::from(&mid))) {
1007+
if t.mid().as_ref() != Some(&SmolStr::from(&mid)) {
10081008
continue;
10091009
}
10101010

@@ -1028,7 +1028,7 @@ impl PeerConnectionInternal {
10281028

10291029
let track = receiver
10301030
.receive_for_rid(
1031-
SmallStr(SmolStr::from(rid)),
1031+
SmolStr::from(rid),
10321032
params,
10331033
TrackStream {
10341034
stream_info: Some(stream_info.clone()),
@@ -1167,7 +1167,7 @@ impl PeerConnectionInternal {
11671167
pub(super) async fn has_local_description_changed(&self, desc: &RTCSessionDescription) -> bool {
11681168
let rtp_transceivers = self.rtp_transceivers.lock().await;
11691169
for t in &*rtp_transceivers {
1170-
let m = match t.mid().and_then(|mid| get_by_mid(mid.0.as_str(), desc)) {
1170+
let m = match t.mid().and_then(|mid| get_by_mid(mid.as_str(), desc)) {
11711171
Some(m) => m,
11721172
None => return true,
11731173
};
@@ -1204,7 +1204,7 @@ impl PeerConnectionInternal {
12041204
// TODO: There's a lot of await points here that could run concurrently with `futures::join_all`.
12051205
struct TrackInfo {
12061206
ssrc: SSRC,
1207-
mid: SmallStr,
1207+
mid: SmolStr,
12081208
track_id: String,
12091209
kind: &'static str,
12101210
}
@@ -1329,8 +1329,8 @@ impl PeerConnectionInternal {
13291329
struct TrackInfo {
13301330
track_id: String,
13311331
ssrc: SSRC,
1332-
mid: SmallStr,
1333-
rid: Option<SmallStr>,
1332+
mid: SmolStr,
1333+
rid: Option<SmolStr>,
13341334
kind: &'static str,
13351335
}
13361336
let mut track_infos = vec![];

webrtc/src/peer_connection/sdp/mod.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub mod sdp_type;
1919
pub mod session_description;
2020

2121
use crate::peer_connection::MEDIA_SECTION_APPLICATION;
22-
use crate::{SmallStr, SDP_ATTRIBUTE_RID};
22+
use crate::SDP_ATTRIBUTE_RID;
2323
use ice::candidate::candidate_base::unmarshal_candidate;
2424
use ice::candidate::Candidate;
2525
use sdp::description::common::{Address, ConnectionInformation};
@@ -38,13 +38,13 @@ use url::Url;
3838
/// This isn't keyed by SSRC because it also needs to support rid based sources
3939
#[derive(Default, Debug, Clone)]
4040
pub(crate) struct TrackDetails {
41-
pub(crate) mid: SmallStr,
41+
pub(crate) mid: SmolStr,
4242
pub(crate) kind: RTPCodecType,
4343
pub(crate) stream_id: String,
4444
pub(crate) id: String,
4545
pub(crate) ssrcs: Vec<SSRC>,
4646
pub(crate) repair_ssrc: SSRC,
47-
pub(crate) rids: Vec<SmallStr>,
47+
pub(crate) rids: Vec<SmolStr>,
4848
}
4949

5050
pub(crate) fn track_details_for_ssrc(
@@ -56,7 +56,7 @@ pub(crate) fn track_details_for_ssrc(
5656

5757
pub(crate) fn track_details_for_rid(
5858
track_details: &[TrackDetails],
59-
rid: SmallStr,
59+
rid: SmolStr,
6060
) -> Option<&TrackDetails> {
6161
track_details.iter().find(|x| x.rids.contains(&rid))
6262
}
@@ -186,16 +186,15 @@ pub(crate) fn track_details_from_sdp(
186186
}
187187

188188
if track_idx < tracks_in_media_section.len() {
189-
tracks_in_media_section[track_idx].mid =
190-
SmallStr(SmolStr::from(mid_value));
189+
tracks_in_media_section[track_idx].mid = SmolStr::from(mid_value);
191190
tracks_in_media_section[track_idx].kind = codec_type;
192191
tracks_in_media_section[track_idx].stream_id = stream_id.to_owned();
193192
tracks_in_media_section[track_idx].id = track_id.to_owned();
194193
tracks_in_media_section[track_idx].ssrcs = vec![ssrc];
195194
tracks_in_media_section[track_idx].repair_ssrc = repair_ssrc;
196195
} else {
197196
let track_details = TrackDetails {
198-
mid: SmallStr(SmolStr::from(mid_value)),
197+
mid: SmolStr::from(mid_value),
199198
kind: codec_type,
200199
stream_id: stream_id.to_owned(),
201200
id: track_id.to_owned(),
@@ -214,15 +213,15 @@ pub(crate) fn track_details_from_sdp(
214213
let rids = get_rids(media);
215214
if !rids.is_empty() && !track_id.is_empty() && !stream_id.is_empty() {
216215
let mut simulcast_track = TrackDetails {
217-
mid: SmallStr(SmolStr::from(mid_value)),
216+
mid: SmolStr::from(mid_value),
218217
kind: codec_type,
219218
stream_id: stream_id.to_owned(),
220219
id: track_id.to_owned(),
221220
rids: vec![],
222221
..Default::default()
223222
};
224223
for rid in rids.keys() {
225-
simulcast_track.rids.push(SmallStr(SmolStr::from(rid)));
224+
simulcast_track.rids.push(SmolStr::from(rid));
226225
}
227226
if simulcast_track.rids.len() == tracks_in_media_section.len() {
228227
for track in &tracks_in_media_section {

webrtc/src/rtp_transceiver/mod.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use interceptor::{
1515
};
1616
use smol_str::SmolStr;
1717

18-
use crate::SmallStr;
1918
use log::trace;
2019
use serde::{Deserialize, Serialize};
2120
use std::fmt;
@@ -96,7 +95,7 @@ pub struct RTCRtpRtxParameters {
9695
/// <http://draft.ortc.org/#dom-rtcrtpcodingparameters>
9796
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
9897
pub struct RTCRtpCodingParameters {
99-
pub rid: SmallStr,
98+
pub rid: SmolStr,
10099
pub ssrc: SSRC,
101100
pub payload_type: PayloadType,
102101
pub rtx: RTCRtpRtxParameters,
@@ -175,7 +174,7 @@ pub type TriggerNegotiationNeededFnOption =
175174

176175
/// RTPTransceiver represents a combination of an RTPSender and an RTPReceiver that share a common mid.
177176
pub struct RTCRtpTransceiver {
178-
mid: OnceCell<SmallStr>, //atomic.Value
177+
mid: OnceCell<SmolStr>, //atomic.Value
179178
sender: Mutex<Arc<RTCRtpSender>>, //atomic.Value
180179
receiver: Mutex<Arc<RTCRtpReceiver>>, //atomic.Value
181180

@@ -296,14 +295,14 @@ impl RTCRtpTransceiver {
296295
}
297296

298297
/// set_mid sets the RTPTransceiver's mid. If it was already set, will return an error.
299-
pub(crate) fn set_mid(&self, mid: SmallStr) -> Result<()> {
298+
pub(crate) fn set_mid(&self, mid: SmolStr) -> Result<()> {
300299
self.mid
301300
.set(mid)
302301
.map_err(|_| Error::ErrRTPTransceiverCannotChangeMid)
303302
}
304303

305304
/// mid gets the Transceiver's mid value. When not already set, this value will be set in CreateOffer or create_answer.
306-
pub fn mid(&self) -> Option<SmallStr> {
305+
pub fn mid(&self) -> Option<SmolStr> {
307306
self.mid.get().map(Clone::clone)
308307
}
309308

@@ -482,7 +481,7 @@ pub(crate) async fn find_by_mid(
482481
local_transceivers: &mut Vec<Arc<RTCRtpTransceiver>>,
483482
) -> Option<Arc<RTCRtpTransceiver>> {
484483
for (i, t) in local_transceivers.iter().enumerate() {
485-
if t.mid() == Some(SmallStr(SmolStr::from(mid))) {
484+
if t.mid() == Some(SmolStr::from(mid)) {
486485
return Some(local_transceivers.remove(i));
487486
}
488487
}

webrtc/src/rtp_transceiver/rtp_receiver/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use crate::rtp_transceiver::{
1515
};
1616
use crate::track::track_remote::TrackRemote;
1717
use crate::track::{TrackStream, TrackStreams};
18-
use crate::SmallStr;
1918

2019
use arc_swap::ArcSwapOption;
2120
use interceptor::stream_info::RTPHeaderExtension;
@@ -760,13 +759,13 @@ impl RTCRtpReceiver {
760759
/// It populates all the internal state for the given RID
761760
pub(crate) async fn receive_for_rid(
762761
&self,
763-
rid: SmallStr,
762+
rid: SmolStr,
764763
params: RTCRtpParameters,
765764
stream: TrackStream,
766765
) -> Result<Arc<TrackRemote>> {
767766
let mut tracks = self.internal.tracks.write().await;
768767
for t in &mut *tracks {
769-
if SmallStr(SmolStr::from(t.track.rid())) == rid {
768+
if *t.track.rid() == rid {
770769
t.track.set_kind(self.kind);
771770
if let Some(codec) = params.codecs.first() {
772771
t.track.set_codec(codec.clone());

webrtc/src/stats/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ use crate::peer_connection::certificate::RTCCertificate;
55
use crate::rtp_transceiver::rtp_codec::RTCRtpCodecParameters;
66
use crate::rtp_transceiver::{PayloadType, SSRC};
77
use crate::sctp_transport::RTCSctpTransport;
8-
use crate::SmallStr;
98

109
use ice::agent::agent_stats::{CandidatePairStats, CandidateStats};
1110
use ice::agent::Agent;
1211
use ice::candidate::{CandidatePairState, CandidateType};
1312
use ice::network_type::NetworkType;
13+
use smol_str::SmolStr;
1414
use stats_collector::StatsCollector;
1515

1616
use serde::{Serialize, Serializer};
@@ -460,7 +460,7 @@ pub struct InboundRTPStats {
460460

461461
// RTCInboundRtpStreamStats
462462
pub track_identifier: String,
463-
pub mid: SmallStr,
463+
pub mid: SmolStr,
464464
// TODO: `remoteId`
465465
// NB: `framesDecoded`, `frameWidth`, frameHeight`, `framesPerSecond`, `qpSum`,
466466
// `totalDecodeTime`, `totalInterFrameDelay`, and `totalSquaredInterFrameDelay` are all decoder
@@ -505,9 +505,9 @@ pub struct OutboundRTPStats {
505505
// RTCOutboundRtpStreamStats
506506
// NB: non-canon in browsers this is available via `RTCMediaSourceStats` which we are unlikely to implement
507507
pub track_identifier: String,
508-
pub mid: SmallStr,
508+
pub mid: SmolStr,
509509
// TODO: `mediaSourceId` and `remoteId`
510-
pub rid: Option<SmallStr>,
510+
pub rid: Option<SmolStr>,
511511
pub header_bytes_sent: u64,
512512
// TODO: `retransmittedPacketsSent` and `retransmittedPacketsSent`
513513
// NB: `targetBitrate`, `totalEncodedBytesTarget`, `frameWidth` `frameHeight`, `framesPerSecond`, `framesSent`,

0 commit comments

Comments
 (0)