summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webcodecs/videoFrame-utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webcodecs/videoFrame-utils.js')
-rw-r--r--testing/web-platform/tests/webcodecs/videoFrame-utils.js118
1 files changed, 118 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webcodecs/videoFrame-utils.js b/testing/web-platform/tests/webcodecs/videoFrame-utils.js
new file mode 100644
index 0000000000..a4c761306c
--- /dev/null
+++ b/testing/web-platform/tests/webcodecs/videoFrame-utils.js
@@ -0,0 +1,118 @@
+const I420_DATA = new Uint8Array([
+ 1, 2, 3, 4, // y
+ 5, 6, 7, 8,
+ 9, 10, // u
+ 11, 12, // v
+ ]);
+
+function makeI420_4x2() {
+ const init = {
+ format: 'I420',
+ timestamp: 0,
+ codedWidth: 4,
+ codedHeight: 2,
+ };
+ return new VideoFrame(I420_DATA, init);
+}
+
+function testBufferConstructedI420Frame(bufferType) {
+ let fmt = 'I420';
+ let vfInit = {format: fmt, timestamp: 1234, codedWidth: 4, codedHeight: 2};
+
+ let buffer;
+ if (bufferType == 'SharedArrayBuffer' ||
+ bufferType == 'Uint8Array(SharedArrayBuffer)') {
+ buffer = new SharedArrayBuffer(I420_DATA.length);
+ } else {
+ assert_true(bufferType == 'ArrayBuffer' ||
+ bufferType == 'Uint8Array(ArrayBuffer)');
+ buffer = new ArrayBuffer(I420_DATA.length);
+ }
+ let bufferView = new Uint8Array(buffer);
+ bufferView.set(I420_DATA);
+ let data = bufferType.startsWith('Uint8Array') ? bufferView : buffer;
+
+ let frame = new VideoFrame(data, vfInit);
+ assert_equals(frame.format, fmt, 'plane format');
+ assert_equals(frame.colorSpace.primaries, 'bt709', 'color primaries');
+ assert_equals(frame.colorSpace.transfer, 'bt709', 'color transfer');
+ assert_equals(frame.colorSpace.matrix, 'bt709', 'color matrix');
+ assert_false(frame.colorSpace.fullRange, 'color range');
+ frame.close();
+
+ let y = {offset: 0, stride: 4};
+ let u = {offset: 8, stride: 2};
+ let v = {offset: 10, stride: 2};
+
+ assert_throws_js(TypeError, () => {
+ let y = {offset: 0, stride: 1};
+ let frame = new VideoFrame(data, {...vfInit, layout: [y, u, v]});
+ }, 'y stride too small');
+ assert_throws_js(TypeError, () => {
+ let u = {offset: 8, stride: 1};
+ let frame = new VideoFrame(data, {...vfInit, layout: [y, u, v]});
+ }, 'u stride too small');
+ assert_throws_js(TypeError, () => {
+ let v = {offset: 10, stride: 1};
+ let frame = new VideoFrame(data, {...vfInit, layout: [y, u, v]});
+ }, 'v stride too small');
+ assert_throws_js(TypeError, () => {
+ let frame = new VideoFrame(data.slice(0, 8), vfInit);
+ }, 'data too small');
+}
+
+function assert_buffer_equals(actual, expected) {
+ assert_true(expected instanceof Uint8Array, 'actual instanceof Uint8Array');
+
+ if (actual instanceof ArrayBuffer ||
+ (typeof(SharedArrayBuffer) != 'undefined' &&
+ actual instanceof SharedArrayBuffer)) {
+ actual = new Uint8Array(actual);
+ } else {
+ assert_true(actual instanceof Uint8Array,
+ 'expected instanceof Uint8Array, ArrayBuffer, or SharedArrayBuffer');
+ }
+
+ assert_equals(actual.length, expected.length, 'buffer length');
+ for (let i = 0; i < actual.length; i++) {
+ if (actual[i] != expected[i]) {
+ assert_equals(actual[i], expected[i], 'buffer contents at index ' + i);
+ }
+ }
+}
+
+function assert_layout_equals(actual, expected) {
+ assert_equals(actual.length, expected.length, 'layout planes');
+ for (let i = 0; i < actual.length; i++) {
+ assert_object_equals(actual[i], expected[i], 'plane ' + i + ' layout');
+ }
+}
+
+async function testI420_4x2_copyTo(destination) {
+ const frame = makeI420_4x2();
+ const expectedLayout = [
+ {offset: 0, stride: 4},
+ {offset: 8, stride: 2},
+ {offset: 10, stride: 2},
+ ];
+ const expectedData = new Uint8Array([
+ 1, 2, 3, 4, // y
+ 5, 6, 7, 8,
+ 9, 10, // u
+ 11, 12 // v
+ ]);
+
+ assert_equals(frame.allocationSize(), expectedData.length, 'allocationSize()');
+ const layout = await frame.copyTo(destination);
+ assert_layout_equals(layout, expectedLayout);
+ assert_buffer_equals(destination, expectedData);
+}
+
+function verifyTimestampRequiredToConstructFrame(imageSource) {
+ assert_throws_js(
+ TypeError,
+ () => new VideoFrame(imageSource),
+ 'timestamp required to construct VideoFrame from this source');
+ let validFrame = new VideoFrame(imageSource, {timestamp: 0});
+ validFrame.close();
+}