webcodecs: Transfer array buffer into EncodedAudioChunk ctor
This should allow to avoid mem copy while constructing
an EncodedAudioChunk from an ArrayBuffer.
I2S: https://groups.google.com/a/chromium.org/g/blink-dev/c/yZS0DLCwl6w/m/5bm9hEoWAQAJ
Bug: 1446808
Change-Id: I7460cbf3e661c07e2ca0903d7b61149355f6fccb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4910240
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Commit-Queue: Eugene Zemtsov <eugene@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1205534}
diff --git a/webcodecs/transfering.https.any.js b/webcodecs/transfering.https.any.js
index b9487e5..fdca808 100644
--- a/webcodecs/transfering.https.any.js
+++ b/webcodecs/transfering.https.any.js
@@ -131,3 +131,30 @@
// `data.buffer` didn't get detached
assert_equals(data.length, 16, 'data.length');
}, 'Test transfering same array buffer twice');
+
+promise_test(async t => {
+ const bytes = [ 0xBA, 0xDF, 0x00, 0xD0, 0xBA, 0xDF, 0x01, 0xD0, 0xBA, 0xDF ];
+ let data = new Uint8Array(bytes);
+ let unused_buffer = new ArrayBuffer(123);
+ let init = {
+ type: 'key',
+ timestamp: 0,
+ data: data,
+ transfer: [data.buffer, unused_buffer]
+ };
+
+ assert_equals(data.length, 10, 'data.length');
+ assert_equals(unused_buffer.byteLength, 123, 'unused_buffer.byteLength');
+
+ let chunk = new EncodedAudioChunk(init);
+ assert_equals(data.length, 0, 'data.length after detach');
+ assert_equals(unused_buffer.byteLength, 0, 'unused_buffer after detach');
+
+ let output_data = new Uint8Array(chunk.byteLength);
+ chunk.copyTo(output_data);
+ let expected_data = new Uint8Array(bytes);
+ assert_equals(expected_data.length, chunk.byteLength, 'expected_data size');
+ for (let i = 0; i < chunk.byteLength; i++) {
+ assert_equals(expected_data[i], output_data[i], `expected_data[${i}]`);
+ }
+}, 'Test transfering ArrayBuffer to EncodedAudioChunk');