From bdb6b39bed54ff03a993f6efe7f2c8e2dc957ba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Fri, 14 Jun 2019 15:37:29 +0200 Subject: [PATCH] Let HardwareVideoEncoder cache result from codec.getOutputBuffers() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9378 Change-Id: I27d6fa9780a0fbb4607ad4d05dabf4414fe6b091 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/142173 Commit-Queue: Niels Moller Reviewed-by: Sami Kalliomäki Cr-Commit-Position: refs/heads/master@{#28288} --- sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java index 4a84bfa107..c5620bc039 100644 --- a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java +++ b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java @@ -88,6 +88,7 @@ class HardwareVideoEncoder implements VideoEncoder { // --- Valid and immutable while an encoding session is running. @Nullable private MediaCodecWrapper codec; + @Nullable private ByteBuffer[] outputBuffers; // Thread that delivers encoded frames to the user callback. @Nullable private Thread outputThread; @@ -222,6 +223,7 @@ class HardwareVideoEncoder implements VideoEncoder { } codec.start(); + outputBuffers = codec.getOutputBuffers(); } catch (IllegalStateException e) { Logging.e(TAG, "initEncodeInternal failed", e); release(); @@ -271,6 +273,7 @@ class HardwareVideoEncoder implements VideoEncoder { outputBuilders.clear(); codec = null; + outputBuffers = null; outputThread = null; // Allow changing thread after release. @@ -488,10 +491,13 @@ class HardwareVideoEncoder implements VideoEncoder { MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); int index = codec.dequeueOutputBuffer(info, DEQUEUE_OUTPUT_BUFFER_TIMEOUT_US); if (index < 0) { + if (index == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { + outputBuffers = codec.getOutputBuffers(); + } return; } - ByteBuffer codecOutputBuffer = codec.getOutputBuffers()[index]; + ByteBuffer codecOutputBuffer = outputBuffers[index]; codecOutputBuffer.position(info.offset); codecOutputBuffer.limit(info.offset + info.size);