test_mediarecorder_bitrate.html (4153B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test MediaRecorder Bitrate</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 7 <script type="text/javascript" src="manifest.js"></script> 8 </head> 9 <body> 10 <pre id="test"> 11 <script class="testbody" type="text/javascript"> 12 var manager = new MediaTestManager; 13 var results = []; 14 15 /** 16 * Starts a test on every media recorder file included to check that 17 * the bitrate control works 18 */ 19 function startTest(test, token) { 20 manager.started(token); 21 runTest(test, token, 1000000); 22 runTest(test, token, 100000); 23 } 24 25 function runTest(test, token, bitrate) { 26 var element = document.createElement('video'); 27 28 element.token = token; 29 30 element.src = test.name; 31 element.preload = "metadata"; 32 element.onloadedmetadata = function () { 33 info("loadedmetadata"); 34 const stream = element.mozCaptureStreamUntilEnded(); 35 element.onloadedmetadata = null; 36 element.play(); 37 38 const mediaRecorder = new MediaRecorder(stream, {videoBitsPerSecond: bitrate}); 39 mediaRecorder.start(); 40 is(mediaRecorder.state, 'recording', 'Media recorder should be recording'); 41 is(mediaRecorder.stream, stream, 42 'Media recorder stream = element stream at the start of recording'); 43 44 var onStopFired = false; 45 var onDataAvailableFired = false; 46 var encoded_size = 0; 47 48 mediaRecorder.onerror = function () { 49 ok(false, 'Unexpected onerror callback fired'); 50 }; 51 52 mediaRecorder.onwarning = function () { 53 ok(false, 'Unexpected onwarning callback fired'); 54 }; 55 56 // This handler verifies that only a single onstop event handler is fired. 57 mediaRecorder.onstop = function () { 58 if (onStopFired) { 59 ok(false, 'onstop unexpectedly fired more than once'); 60 } else { 61 onStopFired = true; 62 63 // ondataavailable should always fire before onstop 64 if (onDataAvailableFired) { 65 ok(true, 'onstop fired after ondataavailable'); 66 info("test " + test.name + " encoded@" + bitrate + "=" + encoded_size); 67 if (results[test.name]) { 68 var big, small, temp; 69 big = {}; 70 big.bitrate = bitrate; 71 big.size = encoded_size; 72 small = results[test.name]; 73 // Don't assume the order that these will finish in 74 if (results[test.name].bitrate > bitrate) { 75 temp = big; 76 big = small; 77 small = temp; 78 } 79 // Ensure there is a big enough difference in the encoded 80 // sizes 81 ok(small.size*1.25 < big.size, 82 test.name + ' encoded@' + big.bitrate + '=' + big.size + 83 ' > encoded@' + small.bitrate + '=' + small.size); 84 manager.finished(token); 85 } else { 86 results[test.name] = {}; 87 results[test.name].bitrate = bitrate; 88 results[test.name].size = encoded_size; 89 } 90 } else { 91 ok(false, 'onstop fired without an ondataavailable event first'); 92 } 93 } 94 }; 95 96 // This handler verifies that only a single ondataavailable event handler 97 // is fired with the blob generated having greater than zero size 98 // and a correct mime type. 99 mediaRecorder.ondataavailable = function (evt) { 100 if (onDataAvailableFired) { 101 ok(false, 'ondataavailable unexpectedly fired more than once'); 102 } else { 103 onDataAvailableFired = true; 104 105 ok(evt instanceof BlobEvent, 106 'Events fired from ondataavailable should be BlobEvent'); 107 is(evt.type, 'dataavailable', 108 'Event type should dataavailable'); 109 ok(evt.data.size > 0, 110 'Blob data received should be greater than zero'); 111 encoded_size = evt.data.size; 112 113 // onstop should not have fired before ondataavailable 114 if (onStopFired) { 115 ok(false, 'ondataavailable unexpectedly fired later than onstop'); 116 manager.finished(token); 117 } 118 } 119 }; 120 }; 121 } 122 123 manager.runTests(gMediaRecorderVideoTests, startTest); 124 </script> 125 </pre> 126 </body> 127 </html>