diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/webrtc/RTCRtpParameters-codecs.html | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webrtc/RTCRtpParameters-codecs.html')
-rw-r--r-- | testing/web-platform/tests/webrtc/RTCRtpParameters-codecs.html | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCRtpParameters-codecs.html b/testing/web-platform/tests/webrtc/RTCRtpParameters-codecs.html new file mode 100644 index 0000000000..f5fa65e2ac --- /dev/null +++ b/testing/web-platform/tests/webrtc/RTCRtpParameters-codecs.html @@ -0,0 +1,206 @@ +<!doctype html> +<meta charset=utf-8> +<title>RTCRtpParameters codecs</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="dictionary-helper.js"></script> +<script src="RTCRtpParameters-helper.js"></script> +<script> + 'use strict'; + + // Test is based on the following editor draft: + // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html + + // The following helper functions are called from RTCRtpParameters-helper.js: + // doOfferAnswerExchange + // validateSenderRtpParameters + + /* + 5.2. RTCRtpSender Interface + interface RTCRtpSender { + Promise<void> setParameters(optional RTCRtpParameters parameters); + RTCRtpParameters getParameters(); + }; + + dictionary RTCRtpParameters { + DOMString transactionId; + sequence<RTCRtpEncodingParameters> encodings; + sequence<RTCRtpHeaderExtensionParameters> headerExtensions; + RTCRtcpParameters rtcp; + sequence<RTCRtpCodecParameters> codecs; + }; + + dictionary RTCRtpCodecParameters { + [readonly] + unsigned short payloadType; + + [readonly] + DOMString mimeType; + + [readonly] + unsigned long clockRate; + + [readonly] + unsigned short channels; + + [readonly] + DOMString sdpFmtpLine; + }; + + getParameters + - The codecs sequence is populated based on the codecs that have been negotiated + for sending, and which the user agent is currently capable of sending. + + If setParameters has removed or reordered codecs, getParameters MUST return + the shortened/reordered list. However, every time codecs are renegotiated by + a new offer/answer exchange, the list of codecs MUST be restored to the full + negotiated set, in the priority order indicated by the remote description, + in effect discarding the effects of setParameters. + + codecs + - When using the setParameters method, the codecs sequence from the corresponding + call to getParameters can be reordered and entries can be removed, but entries + cannot be added, and the RTCRtpCodecParameters dictionary members cannot be modified. + */ + + // Get the first codec from param.codecs. + // Assert that param.codecs has at least one element + function getFirstCodec(param) { + const { codecs } = param; + assert_greater_than(codecs.length, 0); + return codecs[0]; + } + + /* + 5.2. setParameters + 7. If parameters.encodings.length is different from N, or if any parameter + in the parameters argument, marked as a Read-only parameter, has a value + that is different from the corresponding parameter value returned from + sender.getParameters(), abort these steps and return a promise rejected + with a newly created InvalidModificationError. Note that this also applies + to transactionId. + */ + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const { sender } = pc.addTransceiver('audio'); + await doOfferAnswerExchange(t, pc); + + const param = sender.getParameters(); + validateSenderRtpParameters(param); + + const codec = getFirstCodec(param); + + if(codec.payloadType === undefined) { + codec.payloadType = 8; + } else { + codec.payloadType += 1; + } + + return promise_rejects_dom(t, 'InvalidModificationError', + sender.setParameters(param)); + }, 'setParameters() with codec.payloadType modified should reject with InvalidModificationError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('audio'); + await doOfferAnswerExchange(t, pc); + const param = sender.getParameters(); + validateSenderRtpParameters(param); + + const codec = getFirstCodec(param); + + if(codec.mimeType === undefined) { + codec.mimeType = 'audio/piedpiper'; + } else { + codec.mimeType = `${codec.mimeType}-modified`; + } + + return promise_rejects_dom(t, 'InvalidModificationError', + sender.setParameters(param)); + }, 'setParameters() with codec.mimeType modified should reject with InvalidModificationError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('audio'); + await doOfferAnswerExchange(t, pc); + const param = sender.getParameters(); + validateSenderRtpParameters(param); + + const codec = getFirstCodec(param); + + if(codec.clockRate === undefined) { + codec.clockRate = 8000; + } else { + codec.clockRate += 1; + } + + return promise_rejects_dom(t, 'InvalidModificationError', + sender.setParameters(param)); + }, 'setParameters() with codec.clockRate modified should reject with InvalidModificationError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('audio'); + await doOfferAnswerExchange(t, pc); + const param = sender.getParameters(); + validateSenderRtpParameters(param); + + const codec = getFirstCodec(param); + + if(codec.channels === undefined) { + codec.channels = 6; + } else { + codec.channels += 1; + } + + return promise_rejects_dom(t, 'InvalidModificationError', + sender.setParameters(param)); + }, 'setParameters() with codec.channels modified should reject with InvalidModificationError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('audio'); + await doOfferAnswerExchange(t, pc); + const param = sender.getParameters(); + validateSenderRtpParameters(param); + + const codec = getFirstCodec(param); + + if(codec.sdpFmtpLine === undefined) { + codec.sdpFmtpLine = 'a=fmtp:98 0-15'; + } else { + codec.sdpFmtpLine = `${codec.sdpFmtpLine};foo=1`; + } + + return promise_rejects_dom(t, 'InvalidModificationError', + sender.setParameters(param)); + }, 'setParameters() with codec.sdpFmtpLine modified should reject with InvalidModificationError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('audio'); + await doOfferAnswerExchange(t, pc); + const param = sender.getParameters(); + validateSenderRtpParameters(param); + + const { codecs } = param; + + codecs.push({ + payloadType: 2, + mimeType: 'audio/piedpiper', + clockRate: 1000, + channels: 2 + }); + + return promise_rejects_dom(t, 'InvalidModificationError', + sender.setParameters(param)); + }, 'setParameters() with new codecs inserted should reject with InvalidModificationError'); + +</script> |