| function supportsCodec(mimeType) { |
| return RTCRtpSender.getCapabilities('video').codecs.filter(c => c.mimeType == mimeType).length() > 0; |
| } |
| |
| async function supportsScalabilityMode(mimeType, scalabilityMode) { |
| let result = await navigator.mediaCapabilities.encodingInfo({ |
| type: 'webrtc', |
| video: { |
| contentType: mimeType, |
| width: 60, |
| height: 60, |
| bitrate: 10000, |
| framerate: 30, |
| scalabilityMode: scalabilityMode |
| } |
| }); |
| return result.supported; |
| } |
| |
| function createScalabilityTest(mimeType, scalabilityModes) { |
| for (const scalabilityMode of scalabilityModes) { |
| promise_test(async t => { |
| assert_implements_optional( |
| supportsScalabilityMode(mimeType, scalabilityMode), |
| `${mimeType} supported` |
| ); |
| const v = document.createElement('video'); |
| v.autoplay = true; |
| const pc1 = new RTCPeerConnection(); |
| const pc2 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| t.add_cleanup(() => pc2.close()); |
| const stream1 = await getNoiseStream({ video: { signal: 100, width: 60, height: 60 } }); |
| const [track1] = stream1.getTracks(); |
| t.add_cleanup(() => track1.stop()); |
| const transceiver = pc1.addTransceiver(track1, { |
| sendEncodings: [{ scalabilityMode: scalabilityMode }], |
| }); |
| pc2.addEventListener('track', e => { |
| e.transceiver.setCodecPreferences(RTCRtpReceiver.getCapabilities('video').codecs.filter(c => c.mimeType == mimeType)); |
| }); |
| const haveTrackEvent = new Promise(r => pc2.ontrack = r); |
| exchangeIceCandidates(pc1, pc2); |
| await exchangeOfferAnswer(pc1, pc2); |
| v.srcObject = new MediaStream([(await haveTrackEvent).track]); |
| await new Promise(r => v.onloadedmetadata = r); |
| await detectSignal(t, v, 100); |
| const sendParams = pc1.getSenders()[0].getParameters(); |
| assert_equals(sendParams.encodings[0].scalabilityMode, scalabilityMode); |
| }, `${mimeType} - ${scalabilityMode} should produce valid video content`); |
| } |
| } |