| <!doctype html> | |
| <meta charset=utf-8> | |
| <title>Send additional codec supported by the other side</title> | |
| <meta name=timeout content=long> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="../RTCPeerConnection-helper.js"></script> | |
| <script> | |
| 'use strict'; | |
| // Tests behaviour from | |
| // https://www.rfc-editor.org/rfc/rfc8829.html#section-5.3.1 | |
| // in particular "but MAY include formats that are locally | |
| // supported but not present in the offer" | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc1.close()); | |
| const pc2 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc2.close()); | |
| exchangeIceCandidates(pc1, pc2); | |
| const stream = await getNoiseStream({video: true}); | |
| t.add_cleanup(() => stream.getTracks().forEach(t => t.stop())); | |
| pc1.addTrack(stream.getTracks()[0], stream); | |
| pc2.addTrack(stream.getTracks()[0], stream); | |
| // Only offer VP8. | |
| pc1.getTransceivers()[0].setCodecPreferences([{ | |
| clockRate: 90000, | |
| mimeType: 'video/VP8' | |
| }]); | |
| await pc1.setLocalDescription(); | |
| // Add H264 to the SDP. | |
| const sdp = pc1.localDescription.sdp.split('\n') | |
| .map(l => { | |
| if (l.startsWith('m=')) { | |
| return l.trim() + ' 63'; // 63 is the least-likely to be used PT. | |
| } | |
| return l.trim(); | |
| }).join('\r\n') + | |
| 'a=rtpmap:63 H264/90000\r\n' + | |
| 'a=fmtp:63 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\n' | |
| await pc2.setRemoteDescription({ | |
| type: 'offer', | |
| sdp: sdp.replaceAll('VP8', 'no-such-codec'), // Remove VP8 | |
| }); | |
| await pc2.setLocalDescription(); | |
| await pc1.setRemoteDescription(pc2.localDescription); | |
| await listenToConnected(pc2); | |
| const stats = await pc1.getStats(); | |
| const rtp = [...stats.values()].find(({type}) => type === 'outbound-rtp'); | |
| assert_true(!!rtp); | |
| assert_equals(stats.get(rtp.codecId).mimeType, 'video/H264'); | |
| }, 'Listing an additional codec in the answer causes it to be sent.'); | |
| </script> |