fune/testing/web-platform/tests/webcodecs/temporal-svc-encoding.https.any.js
Eugene Zemtsov 39566eedbb Bug 1748745 [wpt PR 32261] - webcodecs: SVC encoding and reconfiguration for Av1VideoEncoder, a=testonly
Automatic update from web-platform-tests
webcodecs: SVC encoding and reconfiguration for Av1VideoEncoder

Bug: 1208280
Change-Id: I6046c52ebef18d1a0168bbb0928dd006025a8271
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3353821
Reviewed-by: Chrome Cunningham <chcunningham@chromium.org>
Commit-Queue: Eugene Zemtsov <eugene@chromium.org>
Cr-Commit-Position: refs/heads/main@{#956213}

--

wpt-commits: 8dc492b9b59d6e6d2998c0324adf1aa39738e8c6
wpt-pr: 32261
2022-01-11 14:12:30 +00:00

105 lines
2.9 KiB
JavaScript

// META: global=window,dedicatedworker
// META: script=/webcodecs/video-encoder-utils.js
// META: variant=?av1
// META: variant=?vp8
// META: variant=?vp9
// META: variant=?h264
var ENCODER_CONFIG = null;
promise_setup(async () => {
const config = {
'?av1': {codec: 'av01.0.04M.08'},
'?vp8': {codec: 'vp8'},
'?vp9': {codec: 'vp09.00.10.08'},
'?h264': {codec: 'avc1.42001E', avc: {format: 'annexb'}}
}[location.search];
config.hardwareAcceleration = 'prefer-software';
config.width = 320;
config.height = 200;
config.bitrate = 1000000;
config.bitrateMode = "constant";
config.framerate = 30;
ENCODER_CONFIG = config;
});
async function svc_test(t, layers, base_layer_decimator) {
let encoder_config = { ...ENCODER_CONFIG };
encoder_config.scalabilityMode = "L1T" + layers;
const w = encoder_config.width;
const h = encoder_config.height;
await checkEncoderSupport(t, encoder_config);
let frames_to_encode = 24;
let frames_decoded = 0;
let frames_encoded = 0;
let chunks = [];
let corrupted_frames = [];
const encoder_init = {
output(chunk, metadata) {
frames_encoded++;
// Filter out all frames, but base layer.
assert_own_property(metadata, "svc");
assert_own_property(metadata.svc, "temporalLayerId");
assert_less_than(metadata.svc.temporalLayerId, layers);
if (metadata.svc.temporalLayerId == 0)
chunks.push(chunk);
},
error(e) {
assert_unreached(e.message);
}
};
let encoder = new VideoEncoder(encoder_init);
encoder.configure(encoder_config);
for (let i = 0; i < frames_to_encode; i++) {
let frame = createDottedFrame(w, h, i);
encoder.encode(frame, { keyFrame: false });
frame.close();
}
await encoder.flush();
let decoder = new VideoDecoder({
output(frame) {
frames_decoded++;
// Check that we have intended number of dots and no more.
// Completely black frame shouldn't pass the test.
if(!validateBlackDots(frame, frame.timestamp) ||
validateBlackDots(frame, frame.timestamp + 1)) {
corrupted_frames.push(frame.timestamp)
}
frame.close();
},
error(e) {
assert_unreached(e.message);
}
});
let decoder_config = {
codec: encoder_config.codec,
hardwareAcceleration: encoder_config.hardwareAcceleration,
codedWidth: w,
codedHeight: h,
};
decoder.configure(decoder_config);
for (let chunk of chunks) {
decoder.decode(chunk);
}
await decoder.flush();
encoder.close();
decoder.close();
assert_equals(frames_encoded, frames_to_encode);
let base_layer_frames = frames_to_encode / base_layer_decimator;
assert_equals(chunks.length, base_layer_frames);
assert_equals(frames_decoded, base_layer_frames);
assert_equals(corrupted_frames.length, 0,
`corrupted_frames: ${corrupted_frames}`);
}
promise_test(async t => { return svc_test(t, 2, 2) }, "SVC L1T2");
promise_test(async t => { return svc_test(t, 3, 4) }, "SVC L1T3");