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');