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