function prepareFrames(width, height, count) {
const canvas = new OffscreenCanvas(width, height);
const ctx = canvas.getContext('2d');
const duration = 1_000_000 / 30; // 1/30 s
let timestamp = 0;
const frames = [];
for (let i = 0; i < count; i++) {
fourColorsFrame(ctx, width, height, timestamp.toString());
let frame = new VideoFrame(canvas, {timestamp: timestamp});
frames.push(frame);
timestamp += duration;
}
return frames;
}
async function testEncodingConfiguration(name, width, height, count, acc) {
const encoder_config = {
codec: "avc1.42001F",
hardwareAcceleration: acc,
width: width,
height: height,
bitrate: 2000000,
framerate: 30
};
let support = await VideoEncoder.isConfigSupported(encoder_config);
if (!support.supported) {
PerfTestRunner.log("Skipping test. Unsupported encoder config" +
JSON.stringify(encoder_config));
return;
}
const warm_up_frames = 5;
let frames = prepareFrames(width, height, count + warm_up_frames);
let is_done = false;
const init = {
output(chunk, metadata) {},
error(e) {
PerfTestRunner.logFatalError("Encoding error: " + e);
}
};
async function runTest() {
const encoder = new VideoEncoder(init);
encoder.configure(encoder_config);
PerfTestRunner.addRunTestStartMarker();
// Encode first several frames without timing it, this will given the
// encoder chance to finish initialization.
for (let i = 0; i < warm_up_frames; i++) {
encoder.encode(frames[i], {keyFrame: false});
}
await encoder.flush().catch(e => {
PerfTestRunner.logFatalError("Test error: " + e);
});
let start_time = PerfTestRunner.now();
for (let frame of frames.slice(warm_up_frames)) {
encoder.encode(frame, { keyFrame: false });
}
encoder.flush().then(
_ => {
let run_time = PerfTestRunner.now() - start_time;
PerfTestRunner.measureValueAsync(run_time);
PerfTestRunner.addRunTestEndMarker();
encoder.close();
if (!is_done)
runTest();
},
e => {
PerfTestRunner.logFatalError("Test error: " + e);
});
}
PerfTestRunner.startMeasureValuesAsync({
unit: 'ms',
done: function () {
is_done = true;
for (let frame of frames)
frame.close();
},
run: function() {
runTest();
},
warmUpCount: 0,
iterationCount: 3,
description: name,
});
}