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