diff --git a/transports/webrtc/src/transport/internal/track_info_queue.rs b/transports/webrtc/src/transport/internal/track_info_queue.rs index 4121d44c..449cb0e7 100644 --- a/transports/webrtc/src/transport/internal/track_info_queue.rs +++ b/transports/webrtc/src/transport/internal/track_info_queue.rs @@ -7,32 +7,37 @@ pub struct MsidInfo { pub label: String, pub kind: String, pub name: String, + pub uuid: String, } #[derive(Default)] pub struct TrackInfoQueue { - pushed_track: HashMap, + pushed_track: HashMap, audios: VecDeque, videos: VecDeque, } impl TrackInfoQueue { - pub fn add(&mut self, _uuid: &str, label: &str, kind: &str, name: &str) { - if self.pushed_track.contains_key(name) { - return; + pub fn add(&mut self, uuid: &str, label: &str, kind: &str, name: &str) { + if let Some(old_uuid) = self.pushed_track.get(name) { + if old_uuid.eq(uuid) { + return; + } } - self.pushed_track.insert(name.to_string(), ()); + self.pushed_track.insert(name.to_string(), uuid.to_string()); match kind { "audio" | "Audio" | "AUDIO" => self.audios.push_back(MsidInfo { label: label.to_string(), kind: kind.to_string(), name: name.to_string(), + uuid: uuid.to_string(), }), "video" | "Video" | "VIDEO" => self.videos.push_back(MsidInfo { label: label.to_string(), kind: kind.to_string(), name: name.to_string(), + uuid: uuid.to_string(), }), _ => {} } @@ -61,6 +66,7 @@ mod test { label: "audio_label".to_string(), kind: "audio".to_string(), name: "audio_main".to_string(), + uuid: "audio_uuid".to_string(), }) ); assert_eq!( @@ -69,6 +75,7 @@ mod test { label: "video_label".to_string(), kind: "video".to_string(), name: "video_main".to_string(), + uuid: "video_uuid".to_string(), }) ); } @@ -83,10 +90,37 @@ mod test { label: "audio_label".to_string(), kind: "audio".to_string(), name: "name".to_string(), + uuid: "audio_uuid".to_string(), }) ); queue.add("audio_uuid", "audio_label", "audio", "name"); assert_eq!(queue.pop(str0m::media::MediaKind::Audio), None); } + + #[test] + fn rewrite_new_uuid() { + let mut queue = super::TrackInfoQueue::default(); + queue.add("audio_uuid1", "audio_label", "audio", "name"); + assert_eq!( + queue.pop(str0m::media::MediaKind::Audio), + Some(MsidInfo { + label: "audio_label".to_string(), + kind: "audio".to_string(), + name: "name".to_string(), + uuid: "audio_uuid1".to_string(), + }) + ); + + queue.add("audio_uuid2", "audio_label", "audio", "name"); + assert_eq!( + queue.pop(str0m::media::MediaKind::Audio), + Some(MsidInfo { + label: "audio_label".to_string(), + kind: "audio".to_string(), + name: "name".to_string(), + uuid: "audio_uuid2".to_string(), + }) + ); + } }