blob: eb188087bb3069d0b44acb2c953e6fc39b17c6ac [file] [log] [blame]
// META: global=window,dedicatedworker
// META: script=/wpt_internal/webcodecs/encoder_utils.js
async function change_encoding_params_test(codec, acc) {
let original_w = 800;
let original_h = 600;
let original_bitrate = 5_000_000;
let new_w = 640;
let new_h = 480;
let new_bitrate = 3_000_000;
let next_ts = 0
let reconf_ts = 0;
let frames_to_encode = 16;
let before_reconf_frames = 0;
let after_reconf_frames = 0;
let errors = 0;
let process_video_chunk = function (chunk, config) {
var data = new Uint8Array(chunk.data);
assert_greater_than_equal(data.length, 0);
let after_reconf = (reconf_ts != 0) && (chunk.timestamp >= reconf_ts);
if (after_reconf) {
after_reconf_frames++;
if (config) {
assert_equals(config.codedWidth, new_w);
assert_equals(config.codedHeight, new_h);
}
} else {
before_reconf_frames++;
if (config) {
assert_equals(config.codedWidth, original_w);
assert_equals(config.codedHeight, original_h);
}
}
};
const init = {
output: process_video_chunk,
error: (e) => {
errors++;
console.log(e.message);
},
};
const params = {
codec: codec,
hardwareAcceleration: acc,
width: original_w,
height: original_h,
bitrate: original_bitrate,
framerate: 30,
};
let encoder = new VideoEncoder(init);
encoder.configure(params);
// Encode |frames_to_encode| frames with original settings
for (let i = 0; i < frames_to_encode; i++) {
var frame = await createFrame(original_w, original_h, next_ts++);
encoder.encode(frame, {});
await delay(1);
}
params.width = new_w;
params.height = new_h;
params.bitrate = new_bitrate;
// Reconfigure encoder and run |frames_to_encode| frames with new settings
encoder.configure(params);
reconf_ts = next_ts;
for (let i = 0; i < frames_to_encode; i++) {
var frame = await createFrame(new_w, new_h, next_ts++);
encoder.encode(frame, {});
await delay(1);
}
await encoder.flush();
// Configure back to original config
params.width = original_w;
params.height = original_h;
params.bitrate = original_bitrate;
encoder.configure(params);
await encoder.flush();
encoder.close();
assert_equals(before_reconf_frames, frames_to_encode);
assert_equals(after_reconf_frames, frames_to_encode);
assert_equals(errors, 0);
}
promise_test(change_encoding_params_test.bind(null, "vp8", "allow"),
"reconfiguring vp8");
promise_test(change_encoding_params_test.bind(null, "vp09.00.10.08", "allow"),
"reconfiguring vp9 profile0");
promise_test(change_encoding_params_test.bind(null, "vp09.02.10.10", "allow"),
"reconfiguring vp9 profile2");
promise_test(change_encoding_params_test.bind(null, "avc1.42001E", "allow"),
"reconfiguring avc1.42001E");
/* Uncomment this for manual testing, before we have GPU tests for that */
//promise_test(change_encoding_params_test.bind(null, "avc1.42001E", "require"),
// "reconfiguring avc1.42001E hw");