Write frames directly to disk in VideoFileRenderer.

Storing raw frames in memory leads to the application running out of
memory during long running tests.

Bug: b/80409365
Change-Id: I9fea171dc76cf0b3b6bba64c60a91353f69fafaa
Reviewed-on: https://webrtc-review.googlesource.com/79581
Reviewed-by: Paulina Hensman <phensman@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23430}
diff --git a/sdk/android/api/org/webrtc/VideoFileRenderer.java b/sdk/android/api/org/webrtc/VideoFileRenderer.java
index adfd6ee..92cdeb4 100644
--- a/sdk/android/api/org/webrtc/VideoFileRenderer.java
+++ b/sdk/android/api/org/webrtc/VideoFileRenderer.java
@@ -37,7 +37,7 @@
   private final ByteBuffer outputFrameBuffer;
   private EglBase eglBase;
   private YuvConverter yuvConverter;
-  private ArrayList<ByteBuffer> rawFrames = new ArrayList<>();
+  private int frameCount;
 
   public VideoFileRenderer(String outputFile, int outputFileWidth, int outputFileHeight,
       final EglBase.Context sharedContext) throws IOException {
@@ -108,14 +108,19 @@
     final VideoFrame.I420Buffer i420 = scaledBuffer.toI420();
     scaledBuffer.release();
 
-    ByteBuffer byteBuffer = JniCommon.nativeAllocateByteBuffer(outputFrameSize);
     YuvHelper.I420Rotate(i420.getDataY(), i420.getStrideY(), i420.getDataU(), i420.getStrideU(),
-        i420.getDataV(), i420.getStrideV(), byteBuffer, i420.getWidth(), i420.getHeight(),
+        i420.getDataV(), i420.getStrideV(), outputFrameBuffer, i420.getWidth(), i420.getHeight(),
         frame.getRotation());
     i420.release();
 
-    byteBuffer.rewind();
-    rawFrames.add(byteBuffer);
+    try {
+      videoOutFile.write("FRAME\n".getBytes(Charset.forName("US-ASCII")));
+      videoOutFile.write(
+          outputFrameBuffer.array(), outputFrameBuffer.arrayOffset(), outputFrameSize);
+    } catch (IOException e) {
+      throw new RuntimeException("Error writing video to disk", e);
+    }
+    frameCount++;
   }
 
   /**
@@ -131,23 +136,13 @@
     });
     ThreadUtils.awaitUninterruptibly(cleanupBarrier);
     try {
-      for (ByteBuffer buffer : rawFrames) {
-        videoOutFile.write("FRAME\n".getBytes(Charset.forName("US-ASCII")));
-
-        byte[] data = new byte[outputFrameSize];
-        buffer.get(data);
-
-        videoOutFile.write(data);
-
-        JniCommon.nativeFreeByteBuffer(buffer);
-      }
       videoOutFile.close();
       Logging.d(TAG,
-          "Video written to disk as " + outputFileName + ". Number frames are " + rawFrames.size()
-              + " and the dimension of the frames are " + outputFileWidth + "x" + outputFileHeight
+          "Video written to disk as " + outputFileName + ". The number of frames is " + frameCount
+              + " and the dimensions of the frames are " + outputFileWidth + "x" + outputFileHeight
               + ".");
     } catch (IOException e) {
-      Logging.e(TAG, "Error writing video to disk", e);
+      throw new RuntimeException("Error closing output file", e);
     }
   }
 }