<!DOCTYPE html>
<html>
<head>
<title>MediaStream Recoder Perf Test (w/ MediaSource)</title>
</head>
<body>
  <div>MediaRecorder Performance test.</div>
  <video id="video" autoplay></video>
</body>
<script>

'use strict';

var testProgress = 0;
var videoBuffer;
var elapsedTime = 0;
var videoBufferSize = 0;

const DEFAULT_CONSTRAINTS = {audio: true, video: {width: 1280, height: 720}};

function createAndStartMediaRecorder(stream, mimeType) {
  return new Promise(function(resolve, reject) {
    document.getElementById('video').srcObject = stream;
    var recorder = new MediaRecorder(stream, {'mimeType' : mimeType});
    console.log('Recorder object created.');
    recorder.start();
    resolve(recorder);
  });
}

// Creates a MediaRecorder and starts recording. Caller can check
// the generated histograms to verify whether HW encode is used.
function startRecording(codec) {
  var mimeType = 'video/webm; codecs=' + codec;
  var videoSize = 0;
  var emptyBlobs = 0;
  var startTime = 0;
  var timeStamps = [];
  var recordedChunks = [];
  navigator.mediaDevices.getUserMedia(DEFAULT_CONSTRAINTS)
      .then(function(stream) {
        return createAndStartMediaRecorder(stream, mimeType);
      })
      .then(function(recorder) {
        startTime = new Date().getTime();
        setTimeout(function() {
          recorder.stop();
        }, 20000);
        recorder.ondataavailable = function(event) {
          if (event.data.size > 0)
            recordedChunks.push(event.data);
        };
        recorder.onstop = function(event) {
          var endTime = new Date().getTime();
          var recordedBlob = new Blob(recordedChunks, {type: 'video/webm'});
          var reader = new FileReader();
          reader.addEventListener("loadend", function() {
            // reader.result contains the contents of blob as a typed array.
            videoBuffer = reader.result;
            videoBuffer = videoBuffer.substr(videoBuffer.indexOf(',') + 1);
            videoBufferSize = videoBuffer.length;
            elapsedTime = endTime - startTime;
            testProgress = 1;
          });
          reader.readAsDataURL(recordedBlob);
        };
      });
}

</script>
</body>
</html>
