| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <title>MediaStream Recoder Browser Test (w/ MediaSource)</title> | 4 <title>MediaStream Recoder Browser Test (w/ MediaSource)</title> |
| 5 </head> | 5 </head> |
| 6 <body> | 6 <body> |
| 7 <div> Record Real-Time video content browser test.</div> | 7 <div> Record Real-Time video content browser test.</div> |
| 8 <video id="video" autoplay></video> | 8 <video id="video" autoplay></video> |
| 9 <video id="remoteVideo" autoplay></video> | 9 <video id="remoteVideo" autoplay></video> |
| 10 </body> | 10 </body> |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 | 85 |
| 86 function createAndStartMediaRecorder(stream, mimeType, slice) { | 86 function createAndStartMediaRecorder(stream, mimeType, slice) { |
| 87 return new Promise(function(resolve, reject) { | 87 return new Promise(function(resolve, reject) { |
| 88 document.getElementById('video').src = URL.createObjectURL(stream); | 88 document.getElementById('video').src = URL.createObjectURL(stream); |
| 89 var recorder = new MediaRecorder(stream, {'mimeType' : mimeType}); | 89 var recorder = new MediaRecorder(stream, {'mimeType' : mimeType}); |
| 90 console.log('Recorder object created, mimeType = ' + mimeType); | 90 console.log('Recorder object created, mimeType = ' + mimeType); |
| 91 if (slice != undefined) { | 91 if (slice != undefined) { |
| 92 recorder.start(slice); | 92 recorder.start(slice); |
| 93 console.log('Recorder started with time slice', slice); | 93 console.log('Recorder started with time slice', slice); |
| 94 } else { | 94 } else { |
| 95 recorder.start(); | 95 recorder.start(1); |
| 96 } | 96 } |
| 97 resolve(recorder); | 97 resolve(recorder); |
| 98 }); | 98 }); |
| 99 } | 99 } |
| 100 | 100 |
| 101 function createMediaRecorder(stream, mimeType) { | 101 function createMediaRecorder(stream, mimeType) { |
| 102 return new Promise(function(resolve, reject) { | 102 return new Promise(function(resolve, reject) { |
| 103 var recorder = new MediaRecorder(stream, {'mimeType' : mimeType}); | 103 var recorder = new MediaRecorder(stream, {'mimeType' : mimeType}); |
| 104 console.log('Recorder object created.'); | 104 console.log('Recorder object created.'); |
| 105 resolve(recorder); | 105 resolve(recorder); |
| 106 }); | 106 }); |
| 107 } | 107 } |
| 108 | 108 |
| 109 // Tests that the MediaRecorder's start() function will cause the |state| to be | 109 // Tests that the MediaRecorder's start(1) function will cause the |state| to be |
| 110 // 'recording' and that a 'start' event is fired. | 110 // 'recording' and that a 'start' event is fired. |
| 111 function testStartAndRecorderState() { | 111 function testStartAndRecorderState() { |
| 112 var startEventReceived = false; | 112 var startEventReceived = false; |
| 113 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) | 113 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) |
| 114 .then(function(stream) { | 114 .then(function(stream) { |
| 115 return createMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); | 115 return createMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); |
| 116 }) | 116 }) |
| 117 .then(function(recorder) { | 117 .then(function(recorder) { |
| 118 recorder = recorder; | 118 recorder = recorder; |
| 119 recorder.onstart = function(event) { | 119 recorder.onstart = function(event) { |
| 120 startEventReceived = true; | 120 startEventReceived = true; |
| 121 assertEquals('recording', recorder.state); | 121 assertEquals('recording', recorder.state); |
| 122 }; | 122 }; |
| 123 recorder.start(); | 123 recorder.start(1); |
| 124 }) | 124 }) |
| 125 .then(function() { | 125 .then(function() { |
| 126 return waitFor('Make sure the start event was received', | 126 return waitFor('Make sure the start event was received', |
| 127 function() { | 127 function() { |
| 128 return startEventReceived; | 128 return startEventReceived; |
| 129 }); | 129 }); |
| 130 }) | 130 }) |
| 131 .catch(function(err) { | 131 .catch(function(err) { |
| 132 return failTest(err.toString()); | 132 return failTest(err.toString()); |
| 133 }) | 133 }) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 158 }); | 158 }); |
| 159 }) | 159 }) |
| 160 .catch(function(err) { | 160 .catch(function(err) { |
| 161 return failTest(err.toString()); | 161 return failTest(err.toString()); |
| 162 }) | 162 }) |
| 163 .then(function() { | 163 .then(function() { |
| 164 reportTestSuccess(); | 164 reportTestSuccess(); |
| 165 }); | 165 }); |
| 166 } | 166 } |
| 167 | 167 |
| 168 // Tests that when MediaRecorder's start() function is called, some data is | 168 // Tests that when MediaRecorder's start(1) function is called, some data is |
| 169 // made available by media recorder via dataavailable events, containing non | 169 // made available by media recorder via dataavailable events, containing non |
| 170 // empty blob data. | 170 // empty blob data. |
| 171 function testStartAndDataAvailable(codec) { | 171 function testStartAndDataAvailable(codec) { |
| 172 var videoSize = 0; | 172 var videoSize = 0; |
| 173 var emptyBlobs = 0; | 173 var emptyBlobs = 0; |
| 174 var timeStamps = []; | 174 var timeStamps = []; |
| 175 const mimeType = codec ? "video/webm;codecs=" + String(codec) : ""; | 175 const mimeType = codec ? "video/webm;codecs=" + String(codec) : ""; |
| 176 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) | 176 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) |
| 177 .then(function(stream) { | 177 .then(function(stream) { |
| 178 return createAndStartMediaRecorder(stream, mimeType); | 178 return createAndStartMediaRecorder(stream, mimeType); |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 return setupPeerConnection(localStream); | 422 return setupPeerConnection(localStream); |
| 423 }) | 423 }) |
| 424 .then(function(remoteStream) { | 424 .then(function(remoteStream) { |
| 425 return createMediaRecorder(remoteStream, mimeType); | 425 return createMediaRecorder(remoteStream, mimeType); |
| 426 }) | 426 }) |
| 427 .then(function(recorder) { | 427 .then(function(recorder) { |
| 428 recorder.ondataavailable = function(event) { | 428 recorder.ondataavailable = function(event) { |
| 429 timeStamps.push(event.timeStamp); | 429 timeStamps.push(event.timeStamp); |
| 430 videoSize += event.data.size; | 430 videoSize += event.data.size; |
| 431 }; | 431 }; |
| 432 recorder.start(); | 432 recorder.start(1); |
| 433 }) | 433 }) |
| 434 .then(function() { | 434 .then(function() { |
| 435 return waitFor('Making sure the recording has data', | 435 return waitFor('Making sure the recording has data', |
| 436 function() { | 436 function() { |
| 437 return videoSize > 0 && timeStamps.length > 100; | 437 return videoSize > 0 && timeStamps.length > 100; |
| 438 }); | 438 }); |
| 439 }) | 439 }) |
| 440 .catch(function(err) { | 440 .catch(function(err) { |
| 441 return failTest(err.toString()); | 441 return failTest(err.toString()); |
| 442 }) | 442 }) |
| 443 .then(function() { | 443 .then(function() { |
| 444 reportTestSuccess(); | 444 reportTestSuccess(); |
| 445 }); | 445 }); |
| 446 } | 446 } |
| 447 | 447 |
| 448 // Tests that MediaRecorder's stop() throws an exception if |state| is not | 448 // Tests that MediaRecorder's stop() throws an exception if |state| is not |
| 449 // 'recording'. | 449 // 'recording'. |
| 450 function testIllegalStopThrowsDOMError() { | 450 function testIllegalStopThrowsDOMError() { |
| 451 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) | 451 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) |
| 452 .then(function(stream) { | 452 .then(function(stream) { |
| 453 return createMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); | 453 return createMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); |
| 454 }) | 454 }) |
| 455 .then(function(recorder) { | 455 .then(function(recorder) { |
| 456 assertThrows(function() {recorder.stop()}, 'Calling stop() in' + | 456 assertThrows(function() {recorder.stop()}, 'Calling stop() in' + |
| 457 ' inactive state should cause a DOM error'); | 457 ' inactive state should cause a DOM error'); |
| 458 }); | 458 }); |
| 459 } | 459 } |
| 460 | 460 |
| 461 // Tests that MediaRecorder's start() throws an exception if |state| is | 461 // Tests that MediaRecorder's start(1) throws an exception if |state| is |
| 462 // 'recording'. | 462 // 'recording'. |
| 463 function testIllegalStartInRecordingStateThrowsDOMError() { | 463 function testIllegalStartInRecordingStateThrowsDOMError() { |
| 464 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) | 464 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) |
| 465 .then(function(stream) { | 465 .then(function(stream) { |
| 466 return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); | 466 return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); |
| 467 }) | 467 }) |
| 468 .then(function(recorder) { | 468 .then(function(recorder) { |
| 469 assertThrows(function() {recorder.start()}, 'Calling start() in' + | 469 assertThrows(function() {recorder.start(1)}, 'Calling start(1) in' + |
| 470 ' recording state should cause a DOM error'); | 470 ' recording state should cause a DOM error'); |
| 471 }); | 471 }); |
| 472 } | 472 } |
| 473 | 473 |
| 474 // Tests that MediaRecorder's start() throws an exception if |state| is | 474 // Tests that MediaRecorder's start(1) throws an exception if |state| is |
| 475 // 'paused'. | 475 // 'paused'. |
| 476 function testIllegalStartInPausedStateThrowsDOMError() { | 476 function testIllegalStartInPausedStateThrowsDOMError() { |
| 477 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) | 477 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) |
| 478 .then(function(stream) { | 478 .then(function(stream) { |
| 479 return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); | 479 return createAndStartMediaRecorder(stream, DEFAULT_RECORDER_MIME_TYPE); |
| 480 }) | 480 }) |
| 481 .then(function(recorder) { | 481 .then(function(recorder) { |
| 482 recorder.pause(); | 482 recorder.pause(); |
| 483 assertThrows(function() {recorder.start()}, 'Calling start() in' + | 483 assertThrows(function() {recorder.start(1)}, 'Calling start(1) in' + |
| 484 ' paused state should cause a DOM error'); | 484 ' paused state should cause a DOM error'); |
| 485 }); | 485 }); |
| 486 } | 486 } |
| 487 | 487 |
| 488 // Tests that MediaRecorder can record a 2 Channel audio stream. | 488 // Tests that MediaRecorder can record a 2 Channel audio stream. |
| 489 function testTwoChannelAudio() { | 489 function testTwoChannelAudio() { |
| 490 var audioSize = 0; | 490 var audioSize = 0; |
| 491 var context = new OfflineAudioContext(2, NUM_SAMPLES, SAMPLING_RATE); | 491 var context = new OfflineAudioContext(2, NUM_SAMPLES, SAMPLING_RATE); |
| 492 var oscillator = context.createOscillator(); | 492 var oscillator = context.createOscillator(); |
| 493 oscillator.type = 'sine'; | 493 oscillator.type = 'sine'; |
| 494 oscillator.frequency.value = FREQUENCY; | 494 oscillator.frequency.value = FREQUENCY; |
| 495 var dest = context.createMediaStreamDestination(); | 495 var dest = context.createMediaStreamDestination(); |
| 496 dest.channelCount = 2; | 496 dest.channelCount = 2; |
| 497 oscillator.connect(dest); | 497 oscillator.connect(dest); |
| 498 createMediaRecorder(dest.stream, DEFAULT_RECORDER_MIME_TYPE) | 498 createMediaRecorder(dest.stream, DEFAULT_RECORDER_MIME_TYPE) |
| 499 .then(function(recorder) { | 499 .then(function(recorder) { |
| 500 recorder.ondataavailable = function(event) { | 500 recorder.ondataavailable = function(event) { |
| 501 audioSize += event.data.size; | 501 audioSize += event.data.size; |
| 502 }; | 502 }; |
| 503 recorder.start(); | 503 recorder.start(1); |
| 504 oscillator.start(); | 504 oscillator.start(); |
| 505 context.startRendering(); | 505 context.startRendering(); |
| 506 }) | 506 }) |
| 507 .then(function() { | 507 .then(function() { |
| 508 return waitFor('Make sure the recording has data', | 508 return waitFor('Make sure the recording has data', |
| 509 function() { | 509 function() { |
| 510 return audioSize > 0; | 510 return audioSize > 0; |
| 511 }); | 511 }); |
| 512 }) | 512 }) |
| 513 .catch(function(err) { | 513 .catch(function(err) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 540 var errorEventReceived = false; | 540 var errorEventReceived = false; |
| 541 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) | 541 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) |
| 542 .then(function(stream) { | 542 .then(function(stream) { |
| 543 theStream = stream; | 543 theStream = stream; |
| 544 return createMediaRecorder(stream); | 544 return createMediaRecorder(stream); |
| 545 }) | 545 }) |
| 546 .then(function(recorder) { | 546 .then(function(recorder) { |
| 547 recorder.onerror = function(event) { | 547 recorder.onerror = function(event) { |
| 548 errorEventReceived = true; | 548 errorEventReceived = true; |
| 549 }; | 549 }; |
| 550 recorder.start(); | 550 recorder.start(1); |
| 551 // Add a new track, copy of an existing one for simplicity. | 551 // Add a new track, copy of an existing one for simplicity. |
| 552 theStream.addTrack(theStream.getTracks()[1].clone()); | 552 theStream.addTrack(theStream.getTracks()[1].clone()); |
| 553 }) | 553 }) |
| 554 .then(function() { | 554 .then(function() { |
| 555 return waitFor('Waiting for the Error Event', | 555 return waitFor('Waiting for the Error Event', |
| 556 function() { | 556 function() { |
| 557 return errorEventReceived; | 557 return errorEventReceived; |
| 558 }); | 558 }); |
| 559 }) | 559 }) |
| 560 .catch(function(err) { | 560 .catch(function(err) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 572 var errorEventReceived = false; | 572 var errorEventReceived = false; |
| 573 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) | 573 navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS) |
| 574 .then(function(stream) { | 574 .then(function(stream) { |
| 575 theStream = stream; | 575 theStream = stream; |
| 576 return createMediaRecorder(stream); | 576 return createMediaRecorder(stream); |
| 577 }) | 577 }) |
| 578 .then(function(recorder) { | 578 .then(function(recorder) { |
| 579 recorder.onerror = function(event) { | 579 recorder.onerror = function(event) { |
| 580 errorEventReceived = true; | 580 errorEventReceived = true; |
| 581 }; | 581 }; |
| 582 recorder.start(); | 582 recorder.start(1); |
| 583 theStream.removeTrack(theStream.getTracks()[1]); | 583 theStream.removeTrack(theStream.getTracks()[1]); |
| 584 }) | 584 }) |
| 585 .then(function() { | 585 .then(function() { |
| 586 return waitFor('Waiting for the Error Event', | 586 return waitFor('Waiting for the Error Event', |
| 587 function() { | 587 function() { |
| 588 return errorEventReceived; | 588 return errorEventReceived; |
| 589 }); | 589 }); |
| 590 }) | 590 }) |
| 591 .catch(function(err) { | 591 .catch(function(err) { |
| 592 return failTest(err.toString()); | 592 return failTest(err.toString()); |
| 593 }) | 593 }) |
| 594 .then(function() { | 594 .then(function() { |
| 595 reportTestSuccess(); | 595 reportTestSuccess(); |
| 596 }); | 596 }); |
| 597 } | 597 } |
| 598 | 598 |
| 599 </script> | 599 </script> |
| 600 </body> | 600 </body> |
| 601 </html> | 601 </html> |
| OLD | NEW |