summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/tests/mochitests/test_peerConnection_maxFsConstraint.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webrtc/tests/mochitests/test_peerConnection_maxFsConstraint.html')
-rw-r--r--dom/media/webrtc/tests/mochitests/test_peerConnection_maxFsConstraint.html112
1 files changed, 112 insertions, 0 deletions
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_maxFsConstraint.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_maxFsConstraint.html
new file mode 100644
index 0000000000..a2f2555020
--- /dev/null
+++ b/dom/media/webrtc/tests/mochitests/test_peerConnection_maxFsConstraint.html
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1393687",
+ title: "Enforce max-fs constraint on a PeerConnection",
+ visible: true
+ });
+
+ var mustRejectWith = (msg, reason, f) =>
+ f().then(() => ok(false, msg),
+ e => is(e.name, reason, msg));
+
+ var removeAllButCodec = (d, codec) =>
+ (d.sdp = d.sdp.replace(/m=video (\w) UDP\/TLS\/RTP\/SAVPF \w.*\r\n/,
+ "m=video $1 UDP/TLS/RTP/SAVPF " + codec + "\r\n"), d);
+
+ var mungeSDP = (d, forceH264) => {
+ if (forceH264) {
+ removeAllButCodec(d, 126);
+ d.sdp = d.sdp.replace(/a=fmtp:126 (.*);packetization-mode=1/, "a=fmtp:126 $1;packetization-mode=1;max-fs=100");
+ } else {
+ d.sdp = d.sdp.replace(/max-fs=\d+/, "max-fs=100");
+ }
+ return d;
+ };
+
+ const checkForH264Support = async () => {
+ const pc = new RTCPeerConnection();
+ const offer = await pc.createOffer({offerToReceiveVideo: true});
+ return offer.sdp.match(/a=rtpmap:[1-9][0-9]* H264/);
+ };
+
+ let resolutionAlignment = 1;
+
+ function testScale(codec) {
+ var v1 = createMediaElement('video', 'v1');
+ var v2 = createMediaElement('video', 'v2');
+
+ var pc1 = new RTCPeerConnection();
+ var pc2 = new RTCPeerConnection();
+
+ var add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed);
+ pc1.onicecandidate = e => add(pc2, e.candidate, generateErrorCallback());
+ pc2.onicecandidate = e => add(pc1, e.candidate, generateErrorCallback());
+
+ info("testing max-fs with" + codec);
+
+ pc1.onnegotiationneeded = e =>
+ pc1.createOffer()
+ .then(d => pc1.setLocalDescription(mungeSDP(d, codec == "H264")))
+ .then(() => pc2.setRemoteDescription(pc1.localDescription))
+ .then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(mungeSDP(d, codec =="H264")))
+ .then(() => pc1.setRemoteDescription(pc2.localDescription))
+ .catch(generateErrorCallback());
+
+ pc2.ontrack = e => {
+ v2.srcObject = e.streams[0];
+ };
+
+ var stream;
+
+ return navigator.mediaDevices.getUserMedia({ video: true })
+ .then(s => {
+ stream = s;
+ v1.srcObject = stream;
+ let track = stream.getVideoTracks()[0];
+ let sender = pc1.addTrack(track, stream);
+ is(v2.currentTime, 0, "v2.currentTime is zero at outset");
+ })
+ .then(() => wait(5000))
+ .then(() => {
+ if (v2.videoWidth == 0 && v2.videoHeight == 0) {
+ info("Skipping test, insufficient time for video to start.");
+ } else {
+ const expectedWidth = 184 - 184 % resolutionAlignment;
+ const expectedHeight = 138 - 138 % resolutionAlignment;
+ is(v2.videoWidth, expectedWidth,
+ `sink width should be ${expectedWidth} for ${codec}`);
+ is(v2.videoHeight, expectedHeight,
+ `sink height should be ${expectedHeight} for ${codec}`);
+ }})
+ .then(() => {
+ stream.getTracks().forEach(track => track.stop());
+ v1.srcObject = v2.srcObject = null;
+ }).catch(generateErrorCallback());
+ }
+
+ runNetworkTest(async () => {
+ await pushPrefs(['media.peerconnection.video.lock_scaling', true]);
+ if (await checkForH264Support()) {
+ if (navigator.userAgent.includes("Android")) {
+ // Android only has a hw encoder for h264
+ resolutionAlignment = 16;
+ }
+ await matchPlatformH264CodecPrefs();
+ await testScale("H264");
+ }
+
+ // Disable h264 hardware support, to ensure it is not prioritized over VP8
+ await pushPrefs(["media.webrtc.hw.h264.enabled", false]);
+ await testScale("VP8");
+ });
+</script>
+</pre>
+</body>
+</html>