blob: 6f491a0c7260f0447813bc1ee2fa97c865750e88 [file] [log] [blame]
<!DOCTYPE html>
<script src=../../resources/testharness.js></script>
<script src=../../resources/testharnessreport.js></script>
<script>
// This test verifies that MediaRecorder can be created or not with different
// bitrates for video, audio and for both [1]. It checks a few numerical bitrate
// allocations, asserting that individual bit rates are honored or clamped as
// expected, and how the overall bitsPerSecond is divided into video and audio
// bitrates.
// [1] https://rawgit.com/w3c/mediacapture-record/master/MediaRecorder.html#MediaRecorderOptions
function makeExpectedBitrateAsyncTest(options, testName, expectedBps) {
async_test(function(test) {
const constraints = {video: true, audio: true};
const gotStream = test.step_func(function(stream) {
var recorder = new MediaRecorder(stream, options);
assert_equals(recorder.videoBitsPerSecond, expectedBps.video, 'video');
assert_equals(recorder.audioBitsPerSecond, expectedBps.audio, 'audio');
test.done();
});
const onError = test.unreached_func('Error creating MediaStream.');
navigator.webkitGetUserMedia(constraints, gotStream, onError);
}, testName);
};
const kTooSmallBps = 1000;
const kTooLargeBps = 1000000000;
const kOkVideoBps = 500000;
const kMinVideoBps = 100000;
// Note that unspecified audio bitrates are not clamped to a minimum.
makeExpectedBitrateAsyncTest({ videoBitsPerSecond : kOkVideoBps },
'Video bitrate OK',
{ video : kOkVideoBps, audio : 0 });
makeExpectedBitrateAsyncTest({ videoBitsPerSecond : kTooSmallBps },
'Video bitrate clamped to minimum',
{ video : kMinVideoBps, audio : 0 });
makeExpectedBitrateAsyncTest({ videoBitsPerSecond : 0 },
'Video bitrate explicitly set to 0 is clamped',
{ video : kMinVideoBps, audio : 0 });
const kOkAudioBps = 10000;
const kMinAudioBps = 6000; // https://www.opus-codec.org/
const kMaxAudioBps = 128000;
// Note that unspecified video bitrates are not clamped to a minimum.
makeExpectedBitrateAsyncTest({ audioBitsPerSecond : kOkAudioBps },
'Audio bitrate OK',
{ audio : kOkAudioBps, video : 0 });
makeExpectedBitrateAsyncTest({ audioBitsPerSecond : kTooSmallBps },
'Audio bitrate clamped to minimum',
{ audio : kMinAudioBps, video : 0 });
makeExpectedBitrateAsyncTest({ audioBitsPerSecond : kTooLargeBps },
'Audio bitrate clamped to maximum',
{ audio : kMaxAudioBps , video : 0});
makeExpectedBitrateAsyncTest({ audioBitsPerSecond : 0 },
'Audio bitrate explicitly 0 is clamped',
{ audio : kMinAudioBps, video : 0 });
makeExpectedBitrateAsyncTest({},
'Unspecified bitrates are not clamped',
{ video : 0, audio : 0 });
makeExpectedBitrateAsyncTest({ videoBitsPerSecond : kOkVideoBps, audioBitsPerSecond : kOkAudioBps },
'Video and audio bitrates OK',
{ video : kOkVideoBps, audio : kOkAudioBps });
const kOkOverallBps = 120000;
makeExpectedBitrateAsyncTest({ bitsPerSecond : kOkOverallBps },
'Overall bitrate OK (divided 90/10 video/audio)',
{ video : kOkOverallBps * 0.9, audio : kOkOverallBps * 0.1 });
makeExpectedBitrateAsyncTest({ videoBitsPerSecond : kOkVideoBps, bitsPerSecond : kOkOverallBps },
'Overall bitrate OK, w/ explicit video bitrate ignored',
{ video : kOkOverallBps * 0.9, audio : kOkOverallBps * 0.1 });
makeExpectedBitrateAsyncTest({ audioBitsPerSecond : kOkAudioBps, bitsPerSecond : kOkOverallBps },
'Overall bitrate OK, w/ explicit audio bitrate ignored',
{ video : kOkOverallBps * 0.9, audio : kOkOverallBps * 0.1 });
makeExpectedBitrateAsyncTest({ bitsPerSecond : 10E6 },
'Overall bitrate leads to audio clamped to its maximum',
{ video : 10E6 - kMaxAudioBps, audio : kMaxAudioBps });
makeExpectedBitrateAsyncTest({ bitsPerSecond : (kMinVideoBps - 1E3) },
'Overall bitrate leads to video clamped to its minimum',
{ video : kMinVideoBps, audio : (kMinVideoBps - 1E3) * 0.1 });
makeExpectedBitrateAsyncTest({ bitsPerSecond : kTooSmallBps },
'Overall bitrate leads to both audio and video clamped to min',
{ video : kMinVideoBps, audio : kMinAudioBps });
makeExpectedBitrateAsyncTest({ videoBitsPerSecond: kOkVideoBps, bitsPerSecond: 0 },
'Overall bitrate 0 overrides specified video bitrate',
{ video: kMinVideoBps, audio: kMinAudioBps });
makeExpectedBitrateAsyncTest({ audioBitsPerSecond: kOkAudioBps, bitsPerSecond: 0 },
'Overall bitrate 0 overrides specified audio bitrate',
{ video: kMinVideoBps, audio: kMinAudioBps });
const kMaxInt32Value = Math.pow(2, 31) - 1;
makeExpectedBitrateAsyncTest({ bitsPerSecond : -1 },
'Overall bitrate too large is clamped',
{ video : kMaxInt32Value - kMaxAudioBps, audio : kMaxAudioBps});
</script>