Revert "webcodecs: Stop closing frames in Audio|VideoEncoder.encode()"

This reverts commit 477ea10ee350777a599a4541b6e436ec42563597.

Reason for revert:

It looks like this CL is responsible for breaking the step
"blink_web_tests" on the builder "WebKit Linux MSAN".

First failing build:
https://ci.chromium.org/ui/p/chromium/builders/ci/WebKit%20Linux%20MSAN/9927

Original change's description:
> webcodecs: Stop closing frames in Audio|VideoEncoder.encode()
>
> Change-Id: I0281c1bdd836a94f968bf8fdf4fe8d09392845c7
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2803617
> Reviewed-by: Thomas Guilbert <tguilbert@chromium.org>
> Reviewed-by: Chrome Cunningham <chcunningham@chromium.org>
> Commit-Queue: Eugene Zemtsov <eugene@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#869112}

Change-Id: Iacb9e31ff575129a7b320954a5d65dfaf6274b19
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2805814
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Owners-Override: Fabian Sommer <fabiansommer@chromium.org>
Auto-Submit: Fabian Sommer <fabiansommer@chromium.org>
Commit-Queue: Fabian Sommer <fabiansommer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#869156}
diff --git a/webcodecs/audio-encoder.any.js b/webcodecs/audio-encoder.any.js
index 34210d4..0f1fe2e 100644
--- a/webcodecs/audio-encoder.any.js
+++ b/webcodecs/audio-encoder.any.js
@@ -72,7 +72,6 @@
     let frame = make_audio_frame(timestamp_us, config.numberOfChannels,
       config.sampleRate, frame_length);
     encoder.encode(frame);
-    frame.close();
     timestamp_us += frame_duration_s * 1_000_000;
   }
   await encoder.flush();
@@ -103,7 +102,6 @@
   encoder.configure(config);
   for (let frame of good_frames) {
     encoder.encode(frame);
-    frame.close();
   }
   await encoder.flush();
 
@@ -208,7 +206,7 @@
   for (let i = 0; i < frame_count; i++) {
     let frame = make_audio_frame(timestamp_us, config.numberOfChannels,
       config.sampleRate, frame_length);
-    input_frames.push(frame);
+    input_frames.push(clone_frame(frame));
     encoder.encode(frame);
     timestamp_us += frame_duration_s * 1_000_000;
   }
@@ -276,7 +274,7 @@
 
   let long_frame = make_audio_frame(0, encoder_config.numberOfChannels,
     encoder_config.sampleRate, encoder_config.sampleRate);
-  encoder.encode(long_frame);
+  encoder.encode(clone_frame(long_frame));
   await encoder.flush();
 
   // Long frame produced more than one output, and we've got decoder_config
@@ -297,7 +295,7 @@
   output_count = 0;
   encoder_config.bitrate = 256000;
   encoder.configure(encoder_config);
-  encoder.encode(long_frame);
+  encoder.encode(clone_frame(long_frame));
   await encoder.flush();
 
   // After reconfiguring encoder should produce decoder config again
diff --git a/webcodecs/video-encoder.any.js b/webcodecs/video-encoder.any.js
index 14c5ab6..b45d25d 100644
--- a/webcodecs/video-encoder.any.js
+++ b/webcodecs/video-encoder.any.js
@@ -88,8 +88,8 @@
   let frame1 = await createVideoFrame(640, 480, 0);
   let frame2 = await createVideoFrame(640, 480, 33333);
 
-  encoder.encode(frame1);
-  encoder.encode(frame2);
+  encoder.encode(frame1.clone());
+  encoder.encode(frame2.clone());
 
   // Could be 0, 1, or 2. We can't guarantee this check runs before the UA has
   // processed the encodes.
@@ -148,7 +148,6 @@
     let frame = new VideoFrame(bitmap, { timestamp: timestamp });
     timestamp += timestamp_step;
     encoder.encode(frame);
-    frame.close();
   }
 
   await t.step_wait(() => reset_completed,
@@ -168,7 +167,6 @@
     let frame = await createVideoFrame(800, 600, timestamp + 1);
     timestamp += timestamp_step;
     encoder.encode(frame);
-    frame.close();
   }
   await encoder.flush();
 
@@ -196,10 +194,10 @@
   let frame1 = await createVideoFrame(640, 480, 0);
   let frame2 = await createVideoFrame(640, 480, 33333);
 
-  encoder.encode(frame1);
+  encoder.encode(frame1.clone());
   encoder.configure(config);
 
-  encoder.encode(frame2);
+  encoder.encode(frame2.clone());
 
   await encoder.flush();
 
@@ -226,14 +224,14 @@
   let frame3 = await createVideoFrame(640, 480, 66666);
   let frame4 = await createVideoFrame(640, 480, 100000);
 
-  encoder.encode(frame3);
+  encoder.encode(frame3.clone());
 
   // Verify that a failed call to configure does not change the encoder's state.
   let badConfig = { ...defaultConfig };
   badConfig.codec = 'bogus';
   assert_throws_js(TypeError, () => encoder.configure(badConfig));
 
-  encoder.encode(frame4);
+  encoder.encode(frame4.clone());
 
   await encoder.flush();
 
@@ -242,6 +240,30 @@
 }, 'Test successful encode() after re-configure().');
 
 promise_test(async t => {
+  let output_chunks = [];
+  let codecInit = getDefaultCodecInit(t);
+  codecInit.output = chunk => output_chunks.push(chunk);
+
+  let encoder = new VideoEncoder(codecInit);
+
+  let timestamp = 33333;
+  let frame = await createVideoFrame(640, 480, timestamp);
+
+  encoder.configure(defaultConfig);
+  assert_equals(encoder.state, "configured");
+
+  encoder.encode(frame);
+
+  // |frame| is not longer valid since it has been closed.
+  assert_not_equals(frame.timestamp, timestamp);
+  assert_throws_dom("InvalidStateError", () => frame.clone());
+
+  encoder.close();
+
+  return endAfterEventLoopTurn();
+}, 'Test encoder consumes (closes) frames.');
+
+promise_test(async t => {
   let encoder = new VideoEncoder(getDefaultCodecInit(t));
 
   let frame = await createVideoFrame(640, 480, 0);
@@ -266,6 +288,6 @@
   encoder.configure(defaultConfig);
 
   assert_throws_dom("OperationError", () => {
-    encoder.encode(frame);
+    encoder.encode(frame)
   });
 }, 'Verify encoding closed frames throws.');