MediaRecorder-peerconnection.https.html (5326B)
1 <!doctype html> 2 <html> 3 <meta name="timeout" content="long"> 4 5 <head> 6 <title>MediaRecorder peer connection</title> 7 <meta name=variant content="?kinds=video&mimeType=''"> 8 <meta name=variant content="?kinds=audio&mimeType=''"> 9 <meta name=variant content="?kinds=video,audio&mimeType=''"> 10 <meta name=variant content="?kinds=audio&mimeType=audio/webm;codecs=opus"> 11 <meta name=variant content="?kinds=video&mimeType=video/webm;codecs=vp8"> 12 <meta name=variant content="?kinds=video,audio&mimeType=video/webm;codecs=vp8,opus"> 13 <meta name=variant content="?kinds=video&mimeType=video/webm;codecs=vp9"> 14 <meta name=variant content="?kinds=video,audio&mimeType=video/webm;codecs=vp9,opus"> 15 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=avc1.64003E,mp4a.40.2"> 16 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=avc3.64003E,mp4a.40.2"> 17 <meta name=variant content="?kinds=video&mimeType=video/mp4;codecs=vp9"> 18 <meta name=variant content="?kinds=audio&mimeType=audio/mp4;codecs=opus"> 19 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=vp9,opus"> 20 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=av01,opus"> 21 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=av01,mp4a.40.2"> 22 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,opus"> 23 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=hev1.1.6.L186.B0,opus"> 24 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,mp4a.40.2"> 25 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4;codecs=hev1.1.6.L186.B0,mp4a.40.2"> 26 <meta name=variant content="?kinds=video,audio&mimeType=video/x-matroska;codecs=hvc1.1.6.L186.B0,opus"> 27 <meta name=variant content="?kinds=video,audio&mimeType=video/x-matroska;codecs=hev1.1.6.L186.B0,opus"> 28 <meta name=variant content="?kinds=video,audio&mimeType=video/mp4"> 29 30 <link rel="help" 31 href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#dom-mediarecorder-mimeType"> 32 <script src="/resources/testharness.js"></script> 33 <script src="/resources/testharnessreport.js"></script> 34 <script src="/resources/testdriver.js"></script> 35 <script src="/resources/testdriver-vendor.js"></script> 36 <script src="../mediacapture-streams/permission-helper.js"></script> 37 <script src="utils/peerconnection.js"></script> 38 </head> 39 40 <body> 41 <video id="remote" autoplay width="240"></video> 42 43 <script> 44 const params = new URLSearchParams(window.location.search); 45 const mimeType = params.get('mimeType'); 46 const kinds = params.get('kinds'); 47 const tag = `kinds "${kinds} "mimeType "${mimeType}"`; 48 let stream; 49 let pc; 50 51 promise_setup(async () => { 52 const t = {add_cleanup: add_completion_callback}; 53 const [, connection_pc, connection_stream] = await startConnection(t, true, true); 54 pc = connection_pc; 55 56 let video = null; 57 if (kinds.indexOf('video') != -1) { 58 video = connection_stream.getVideoTracks()[0]; 59 } 60 61 let audio = null; 62 if (kinds.indexOf('audio') != -1) { 63 audio = connection_stream.getAudioTracks()[0]; 64 } 65 66 // Needed for the tests to get exercised in Chrome (bug) 67 document.getElementById('remote').srcObject = connection_stream; 68 stream = new MediaStream([audio, video].filter(n => n)); 69 }); 70 71 promise_test(async t => { 72 // Spec doesn't mandate codecs, so if not supported, test failure instead. 73 if (mimeType && !MediaRecorder.isTypeSupported(mimeType)) { 74 promise_test(async t => { 75 assert_throws_dom('NotSupportedError', 76 () => new MediaRecorder(stream, { mimeType })); 77 }, `MediaRecorder constructor throws on no support 1, ${tag}`); 78 return; 79 } 80 81 const recorder = new MediaRecorder(stream, { mimeType }); 82 recorder.start(200); 83 await new Promise(r => recorder.onstart = r); 84 let combinedSize = 0; 85 // Wait for a small amount of data to appear. Kept small for mobile tests 86 while (combinedSize < 2000) { 87 const {data} = await new Promise(r => recorder.ondataavailable = r); 88 combinedSize += data.size; 89 } 90 recorder.stop(); 91 }, `PeerConnection MediaRecorder receives data after onstart, ${tag}`); 92 93 promise_test(async t => { 94 // Spec doesn't mandate codecs, so if not supported, test failure instead. 95 if (mimeType && !MediaRecorder.isTypeSupported(mimeType)) { 96 promise_test(async t => { 97 assert_throws_dom('NotSupportedError', 98 () => new MediaRecorder(stream, { mimeType })); 99 }, `MediaRecorder constructor throws on no support 2, ${tag}`); 100 return; 101 } 102 103 const clone = stream.clone(); 104 const recorder = new MediaRecorder(clone, { mimeType }); 105 recorder.start(); 106 await new Promise(r => recorder.onstart = r); 107 await waitForReceivedFramesOrPackets(t, pc, kinds.audio, kinds.video, 10); 108 for (const track of clone.getTracks()) { 109 track.stop(); 110 } 111 // As the tracks ended, expect data from the recorder. 112 await Promise.all([ 113 new Promise(r => recorder.onstop = r), 114 new Promise(r => recorder.ondataavailable = r) 115 ]); 116 }, `PeerConnection MediaRecorder gets ondata on stopping tracks, ${tag}`); 117 118 </script> 119 </body> 120 </html>