svc-helper.js (2034B)
1 function supportsCodec(mimeType) { 2 return RTCRtpSender.getCapabilities('video').codecs.filter(c => c.mimeType == mimeType).length() > 0; 3 } 4 5 async function supportsScalabilityMode(mimeType, scalabilityMode) { 6 let result = await navigator.mediaCapabilities.encodingInfo({ 7 type: 'webrtc', 8 video: { 9 contentType: mimeType, 10 width: 60, 11 height: 60, 12 bitrate: 10000, 13 framerate: 30, 14 scalabilityMode: scalabilityMode 15 } 16 }); 17 return result.supported; 18 } 19 20 function createScalabilityTest(mimeType, scalabilityModes) { 21 for (const scalabilityMode of scalabilityModes) { 22 promise_test(async t => { 23 assert_implements_optional( 24 supportsScalabilityMode(mimeType, scalabilityMode), 25 `${mimeType} supported` 26 ); 27 const v = document.createElement('video'); 28 v.autoplay = true; 29 const pc1 = new RTCPeerConnection(); 30 const pc2 = new RTCPeerConnection(); 31 t.add_cleanup(() => pc1.close()); 32 t.add_cleanup(() => pc2.close()); 33 const stream1 = await getNoiseStream({ video: { signal: 100, width: 60, height: 60 } }); 34 const [track1] = stream1.getTracks(); 35 t.add_cleanup(() => track1.stop()); 36 const transceiver = pc1.addTransceiver(track1, { 37 sendEncodings: [{ scalabilityMode: scalabilityMode }], 38 }); 39 pc2.addEventListener('track', e => { 40 e.transceiver.setCodecPreferences(RTCRtpReceiver.getCapabilities('video').codecs.filter(c => c.mimeType == mimeType)); 41 }); 42 const haveTrackEvent = new Promise(r => pc2.ontrack = r); 43 exchangeIceCandidates(pc1, pc2); 44 await exchangeOfferAnswer(pc1, pc2); 45 v.srcObject = new MediaStream([(await haveTrackEvent).track]); 46 await new Promise(r => v.onloadedmetadata = r); 47 await detectSignal(t, v, 100); 48 const sendParams = pc1.getSenders()[0].getParameters(); 49 assert_equals(sendParams.encodings[0].scalabilityMode, scalabilityMode); 50 }, `${mimeType} - ${scalabilityMode} should produce valid video content`); 51 } 52 }