diff --git a/webrtc/src/api/media_engine/media_engine_test.rs b/webrtc/src/api/media_engine/media_engine_test.rs index cbf3b503b..22b3fc9ef 100644 --- a/webrtc/src/api/media_engine/media_engine_test.rs +++ b/webrtc/src/api/media_engine/media_engine_test.rs @@ -123,6 +123,29 @@ a=fmtp:112 minptime=10; useinbandfec=1 assert_eq!(opus_codec.capability.mime_type, MIME_TYPE_OPUS); } + //"Ambiguous Payload Type" + { + const OPUS_AMBIGUOUS_PAYLOAD: &str = "v=0 +o=- 4596489990601351948 2 IN IP4 127.0.0.1 +s=- +t=0 0 +m=audio 9 UDP/TLS/RTP/SAVPF 96 +a=rtpmap:96 opus/48000/2 +a=fmtp:96 minptime=10; useinbandfec=1 +"; + + let mut m = MediaEngine::default(); + m.register_default_codecs()?; + m.update_from_remote_description(&must_parse(OPUS_AMBIGUOUS_PAYLOAD)?) + .await?; + + assert!(!m.negotiated_video.load(Ordering::SeqCst)); + assert!(m.negotiated_audio.load(Ordering::SeqCst)); + + let (opus_codec, _) = m.get_codec_by_payload(96).await?; + assert_eq!(opus_codec.capability.mime_type, MIME_TYPE_OPUS); + } + //"Case Insensitive" { const OPUS_UPCASE: &str = "v=0 diff --git a/webrtc/src/api/media_engine/mod.rs b/webrtc/src/api/media_engine/mod.rs index 82955534e..cec29baa4 100644 --- a/webrtc/src/api/media_engine/mod.rs +++ b/webrtc/src/api/media_engine/mod.rs @@ -465,7 +465,7 @@ impl MediaEngine { &self, payload_type: PayloadType, ) -> Result<(RTCRtpCodecParameters, RTPCodecType)> { - { + if self.negotiated_video.load(Ordering::SeqCst) { let negotiated_video_codecs = self.negotiated_video_codecs.lock(); for codec in &*negotiated_video_codecs { if codec.payload_type == payload_type { @@ -473,7 +473,7 @@ impl MediaEngine { } } } - { + if self.negotiated_audio.load(Ordering::SeqCst) { let negotiated_audio_codecs = self.negotiated_audio_codecs.lock(); for codec in &*negotiated_audio_codecs { if codec.payload_type == payload_type { @@ -481,6 +481,20 @@ impl MediaEngine { } } } + if !self.negotiated_video.load(Ordering::SeqCst) { + for codec in &self.video_codecs { + if codec.payload_type == payload_type { + return Ok((codec.clone(), RTPCodecType::Video)); + } + } + } + if !self.negotiated_audio.load(Ordering::SeqCst) { + for codec in &self.audio_codecs { + if codec.payload_type == payload_type { + return Ok((codec.clone(), RTPCodecType::Audio)); + } + } + } Err(Error::ErrCodecNotFound) }