Skip to content

Commit

Permalink
media_engine: Properly return codec when not negotiated (#595)
Browse files Browse the repository at this point in the history
* test: media_engine: Add Ambiguous payload type test

Ported from pion

* media_engine: Properly return codec when not negotiated
  • Loading branch information
haaspors authored Jul 19, 2024
1 parent 4bb9614 commit c32345d
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
23 changes: 23 additions & 0 deletions webrtc/src/api/media_engine/media_engine_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 16 additions & 2 deletions webrtc/src/api/media_engine/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -465,22 +465,36 @@ 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 {
return Ok((codec.clone(), RTPCodecType::Video));
}
}
}
{
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 {
return Ok((codec.clone(), RTPCodecType::Audio));
}
}
}
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)
}
Expand Down

0 comments on commit c32345d

Please sign in to comment.