Let HardwareVideoEncoder cache result from codec.getOutputBuffers()

Bug: webrtc:9378
Change-Id: I27d6fa9780a0fbb4607ad4d05dabf4414fe6b091
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/142173
Commit-Queue: Niels Moller <nisse@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28288}
diff --git a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
index 4a84bfa..c5620bc 100644
--- a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
+++ b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
@@ -88,6 +88,7 @@
 
   // --- 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 @@
       }
 
       codec.start();
+      outputBuffers = codec.getOutputBuffers();
     } catch (IllegalStateException e) {
       Logging.e(TAG, "initEncodeInternal failed", e);
       release();
@@ -271,6 +273,7 @@
     outputBuilders.clear();
 
     codec = null;
+    outputBuffers = null;
     outputThread = null;
 
     // Allow changing thread after release.
@@ -488,10 +491,13 @@
       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);