commit 3573bf613ad51e114c28548ee185753aac041e48
parent 556e42ef986205b7734fcdaee09395238c4a30b1
Author: Andreas Pehrson <apehrson@mozilla.com>
Date: Wed, 22 Oct 2025 05:15:20 +0000
Bug 1995517 - In sdpUtils et al. fix "all but" munging functions. r=bwc
Differential Revision: https://phabricator.services.mozilla.com/D269481
Diffstat:
6 files changed, 45 insertions(+), 33 deletions(-)
diff --git a/dom/media/webrtc/tests/mochitests/sdpUtils.js b/dom/media/webrtc/tests/mochitests/sdpUtils.js
@@ -197,11 +197,37 @@ var sdputils = {
return updated_sdp;
},
- removeAllButPayloadType(sdp, pt) {
- return sdp.replace(
- new RegExp("m=(\\w+ \\w+) UDP/TLS/RTP/SAVPF .*" + pt + ".*\\r\\n", "gi"),
- "m=$1 UDP/TLS/RTP/SAVPF " + pt + "\r\n"
- );
+ // Returns an array of objects with keys {pt, codec}.
+ enumerateCodecs(sdp) {
+ const codecs = [];
+ const regex = /a=rtpmap:(\d+)\s+([^\/]+)\/[0-9\/]+/gi;
+ let match;
+ while ((match = regex.exec(sdp))) {
+ if (match.length < 3) {
+ continue;
+ }
+ const pt = parseInt(match[1]);
+ if (isNaN(pt)) {
+ continue;
+ }
+ const codec = match[2];
+ codecs.push({ pt, codec });
+ }
+ return codecs;
+ },
+
+ removeAllButPayloadType(sdp, payloadType) {
+ const codecs = this.enumerateCodecs(sdp);
+ const pts = codecs.map(({ pt }) => pt).filter(pt => pt != payloadType);
+ return this.removeCodecs(sdp, pts);
+ },
+
+ removeAllButCodec(sdp, codecToKeep) {
+ const codecs = this.enumerateCodecs(sdp);
+ const pts = codecs
+ .filter(({ codec }) => codec.toLowerCase() != codecToKeep.toLowerCase())
+ .map(({ pt }) => pt);
+ return this.removeCodecs(sdp, pts);
},
removeRtpMapForPayloadType(sdp, pt) {
diff --git a/dom/media/webrtc/tests/mochitests/templates.js b/dom/media/webrtc/tests/mochitests/templates.js
@@ -567,9 +567,9 @@ function PC_LOCAL_REMOVE_ALL_BUT_H264_FROM_OFFER(test) {
-1,
"H.264 should be present in the SDP offer"
);
- test.originalOffer.sdp = sdputils.removeCodecs(
+ test.originalOffer.sdp = sdputils.removeAllButCodec(
test.originalOffer.sdp,
- [120, 121, 97]
+ "H264"
);
info("Updated H264 only offer: " + JSON.stringify(test.originalOffer));
}
@@ -580,12 +580,10 @@ function PC_LOCAL_REMOVE_ALL_BUT_AV1_FROM_OFFER(test) {
-1,
"AV1 should be present in the SDP offer"
);
- for (const codec of [103, 105, 120, 121, 126, 97]) {
- test.originalOffer.sdp = sdputils.removeCodec(
- test.originalOffer.sdp,
- codec
- );
- }
+ test.originalOffer.sdp = sdputils.removeAllButCodec(
+ test.originalOffer.sdp,
+ "AV1"
+ );
info("Updated AV1 only offer: " + JSON.stringify(test.originalOffer));
}
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_audioCodecs.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_audioCodecs.html
@@ -26,28 +26,16 @@
test.chain.insertBefore("PC_LOCAL_SET_LOCAL_DESCRIPTION", [
function PC_LOCAL_FILTER_OUT_CODECS() {
let otherCodec = codecs.find(c => c != codec);
+ let id = sdputils.findCodecId(test.originalOffer.sdp, codec);
let otherId = sdputils.findCodecId(test.originalOffer.sdp, otherCodec);
- let id = sdputils.findCodecId(test.originalOffer.sdp, codec);
test.originalOffer.sdp =
- sdputils.removeAllButPayloadType(test.originalOffer.sdp, id);
+ sdputils.removeAllButCodec(test.originalOffer.sdp, codec);
ok(!test.originalOffer.sdp.match(new RegExp(`m=.*UDP/TLS/RTP/SAVPF.* ${otherId}[^0-9]`, "gi")),
`Other codec ${otherId} should be removed after filtering`);
ok(test.originalOffer.sdp.match(new RegExp(`m=.*UDP/TLS/RTP/SAVPF.* ${id}[^0-9]`, "gi")),
`Tested codec ${id} should remain after filtering`);
-
- for (let c of codecs.filter(c => c != codec)) {
- // Remove rtpmaps for the other codecs so sdp sanity tests pass.
- let id = sdputils.findCodecId(test.originalOffer.sdp, c);
- test.originalOffer.sdp =
- sdputils.removeRtpMapForPayloadType(test.originalOffer.sdp, id);
- }
-
- ok(!test.originalOffer.sdp.match(new RegExp(`a=rtpmap:${otherId}.*\\r\\n`, "gi")),
- `Rtpmap of other codec ${otherId} should be removed after filtering`);
- ok(test.originalOffer.sdp.match(new RegExp(`a=rtpmap:${id}.*\\r\\n`, "gi")),
- `Rtpmap of tested codec should remain after filtering`);
},
]);
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html
@@ -32,6 +32,10 @@
`payload types, like RTX, are removed too.`);
test.originalOffer.sdp =
sdputils.removeAllButPayloadType(test.originalOffer.sdp, payloadType);
+ ok(test.originalOffer.sdp.match(new RegExp(`m=.*UDP/TLS/RTP/SAVPF.* ${payloadType}[^0-9]`, "gi")),
+ `Tested codec ${payloadType} should remain after filtering`);
+ ok(test.originalOffer.sdp.match(new RegExp(`a=rtpmap:${payloadType}[^0-9]`, "gi")),
+ `Tested codec ${payloadType} rtpmap should remain after filtering`);
},
]);
await test.run();
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution.html
@@ -60,9 +60,7 @@
is(parameters.encodings[0].maxBitrate, 60000, "Should be able to set maxBitrate");
let offer = await pc1.createOffer();
- if (codec == "H264") {
- offer.sdp = sdputils.removeAllButPayloadType(offer.sdp, 126);
- }
+ offer.sdp = sdputils.removeAllButCodec(offer.sdp, codec);
await pc1.setLocalDescription(offer);
await pc2.setRemoteDescription(pc1.localDescription);
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution_oldSetParameters.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution_oldSetParameters.html
@@ -63,9 +63,7 @@
scaleResolutionDownBy: 2 }] });
let offer = await pc1.createOffer();
- if (codec == "H264") {
- offer.sdp = sdputils.removeAllButPayloadType(offer.sdp, 126);
- }
+ offer.sdp = sdputils.removeAllButCodec(offer.sdp, codec);
await pc1.setLocalDescription(offer);
await pc2.setRemoteDescription(pc1.localDescription);