From 75212c7b6135f188075751fd1b071b1bb0d5210b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Brzezi=C5=84ski?= Date: Fri, 28 Feb 2025 13:20:05 +0100 Subject: [PATCH] webrtcsink: Fix compatibility with audio level header extension Browsers send back SDP with vad=on (default) stripped, so our caps end up incompatible. Let's re-add the explicit vad=on variant for compatibility. Tested with Chrome, Safari and Firefox, audiolevel correctly shows up browser-side. Part-of: --- net/webrtc/src/webrtcsink/imp.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/net/webrtc/src/webrtcsink/imp.rs b/net/webrtc/src/webrtcsink/imp.rs index 5a5fe249d..9323c18ce 100644 --- a/net/webrtc/src/webrtcsink/imp.rs +++ b/net/webrtc/src/webrtcsink/imp.rs @@ -1439,6 +1439,19 @@ impl SessionInner { filtered_s.extend(s.iter().filter_map(|(key, value)| { if key.starts_with("a-") { None + } else if key.starts_with("extmap-") + && value + .get::<&str>() + .is_ok_and(|v| v == "urn:ietf:params:rtp-hdrext:ssrc-audio-level") + { + // Workaround for the audio-level header extension: our extmap for this will usually be an array + // with "vad=on", but browsers strip that (because it's the default) and just give us a string + // with the uri. To make the capsfilter work, lets re-add the vad=on variant to the caps. + let vad_on_array = + gst::Array::new(["", "urn:ietf:params:rtp-hdrext:ssrc-audio-level", "vad=on"]) + .to_send_value(); + let list = gst::List::new([vad_on_array, value.to_owned()]).to_send_value(); + Some((key, list)) } else { Some((key, value.to_owned())) }