Implement support for transfer lists in ImageDecoder
As was done for other WebCodecs classes, add support for transfer
lists to avoid copying image data when provided to the constructor.
R=eugene
Bug: 1446808
Change-Id: Id2e02f3dde135f426309529a0998b85357662fa8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4943161
Reviewed-by: Eugene Zemtsov <eugene@chromium.org>
Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1210592}
diff --git a/webcodecs/transfering.https.any.js b/webcodecs/transfering.https.any.js
index 67614bf..acd2738 100644
--- a/webcodecs/transfering.https.any.js
+++ b/webcodecs/transfering.https.any.js
@@ -215,3 +215,22 @@
assert_equals(expected_data[i], readback_data[i], `expected_data[${i}]`);
}
}, 'Test transfering ArrayBuffer to AudioData');
+
+promise_test(async t => {
+ let unused_buffer = new ArrayBuffer(123);
+ let support = await ImageDecoder.isTypeSupported('image/png');
+ assert_implements_optional(
+ support, 'Optional codec image/png not supported.');
+ let buffer = await fetch('four-colors.png').then(response => {
+ return response.arrayBuffer();
+ });
+
+ let decoder = new ImageDecoder(
+ {data: buffer, type: 'image/png', transfer: [buffer, unused_buffer]});
+ assert_equals(buffer.byteLength, 0, 'buffer.byteLength after detach');
+ assert_equals(unused_buffer.byteLength, 0, 'unused_buffer after detach');
+
+ let result = await decoder.decode();
+ assert_equals(result.image.displayWidth, 320);
+ assert_equals(result.image.displayHeight, 240);
+}, 'Test transfering ArrayBuffer to ImageDecoder.');