107 lines
3.2 KiB
JavaScript
107 lines
3.2 KiB
JavaScript
// 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');
|