Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test has a WPT meta file that expects 3 subtest issues.
- This WPT test may be referenced by the following Test IDs:
- /webcodecs/video-encoder-orientation.https.any.html - WPT Dashboard Interop Dashboard
- /webcodecs/video-encoder-orientation.https.any.worker.html - WPT Dashboard Interop Dashboard
// META: global=window,dedicatedworker
// META: script=/common/media.js
// META: script=/webcodecs/utils.js
// META: script=/webcodecs/video-encoder-utils.js
const defaultConfig = {
codec: 'vp8',
width: 640,
height: 480
};
promise_test(async t => {
let output_chunks = [];
let codecInit = getDefaultCodecInit(t);
let decoderConfig = null;
codecInit.output = (chunk, metadata) => {
assert_not_equals(metadata, null);
if (metadata.decoderConfig)
decoderConfig = metadata.decoderConfig;
output_chunks.push(chunk);
}
let encoder = new VideoEncoder(codecInit);
let config = defaultConfig;
encoder.configure(config);
let frame = createFrame(640, 480, 0, {rotation: 90, flip: true});
encoder.encode(frame);
frame.close();
await encoder.flush();
encoder.close();
assert_equals(output_chunks.length, 1);
assert_equals(decoderConfig.rotation, 90);
assert_equals(decoderConfig.flip, true);
}, 'Encode video frame with orientation');
promise_test(async t => {
let output_chunks = [];
let codecInit = getDefaultCodecInit(t);
let decoderConfig = null;
codecInit.output = (chunk, metadata) => {
assert_not_equals(metadata, null);
if (metadata.decoderConfig)
decoderConfig = metadata.decoderConfig;
output_chunks.push(chunk);
}
let encoder = new VideoEncoder(codecInit);
let config = defaultConfig;
encoder.configure(config);
let frame1 = createFrame(640, 480, 0, {rotation: 90, flip: true});
let frame2 = createFrame(640, 480, 33333, {rotation: 90, flip: false});
let frame3 = createFrame(640, 480, 66666, {rotation: 180, flip: true});
let frame4 = createFrame(640, 480, 99999, {rotation: 90, flip: true});
encoder.encode(frame1);
assert_throws_dom('DataError', () => encoder.encode(frame2));
assert_throws_dom('DataError', () => encoder.encode(frame3));
encoder.encode(frame4);
frame1.close();
frame2.close();
frame3.close();
frame4.close();
await encoder.flush();
encoder.close();
assert_equals(output_chunks.length, 2);
assert_equals(decoderConfig.rotation, 90);
assert_equals(decoderConfig.flip, true);
}, 'Encode video frames with different orientation has non-fatal failures');
promise_test(async t => {
let output_chunks = [];
let codecInit = getDefaultCodecInit(t);
let decoderConfig = null;
codecInit.output = (chunk, metadata) => {
assert_not_equals(metadata, null);
if (metadata.decoderConfig)
decoderConfig = metadata.decoderConfig;
output_chunks.push(chunk);
}
let encoder = new VideoEncoder(codecInit);
let config = defaultConfig;
encoder.configure(config);
let frame = createFrame(640, 480, 0, {rotation: 90, flip: true});
encoder.encode(frame);
frame.close();
await encoder.flush();
assert_equals(output_chunks.length, 1);
assert_equals(decoderConfig.rotation, 90);
assert_equals(decoderConfig.flip, true);
encoder.configure(config);
frame = createFrame(640, 480, 0, {rotation: 270, flip: false});
encoder.encode(frame);
frame.close();
await encoder.flush();
assert_equals(output_chunks.length, 2);
assert_equals(decoderConfig.rotation, 270);
assert_equals(decoderConfig.flip, false);
encoder.close();
}, 'Encode video frames with different orientations after reconfigure');