diff --git a/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java b/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java index 5fbf239c44..2c45a4f16b 100644 --- a/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java +++ b/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java @@ -87,7 +87,22 @@ public class HardwareVideoEncoderTest { public void onEncodedFrame(EncodedImage frame, VideoEncoder.CodecSpecificInfo info) { assertNotNull(frame); assertNotNull(info); - frameQueue.offer(frame); + + // Make a copy because keeping a reference to the buffer is not allowed. + final ByteBuffer bufferCopy = ByteBuffer.allocateDirect(frame.buffer.remaining()); + bufferCopy.put(frame.buffer); + bufferCopy.rewind(); + + frameQueue.offer(EncodedImage.builder() + .setBuffer(bufferCopy) + .setEncodedWidth(frame.encodedWidth) + .setEncodedHeight(frame.encodedHeight) + .setCaptureTimeNs(frame.captureTimeNs) + .setFrameType(frame.frameType) + .setRotation(frame.rotation) + .setCompleteFrame(frame.completeFrame) + .setQp(frame.qp) + .createEncodedImage()); } public EncodedImage poll() { diff --git a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java index 776923a60e..0d18a66eff 100644 --- a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java +++ b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java @@ -506,11 +506,11 @@ class HardwareVideoEncoder implements VideoEncoder { frameBuffer = ByteBuffer.allocateDirect(info.size + configBuffer.capacity()); configBuffer.rewind(); frameBuffer.put(configBuffer); + frameBuffer.put(codecOutputBuffer); + frameBuffer.rewind(); } else { - frameBuffer = ByteBuffer.allocateDirect(info.size); + frameBuffer = codecOutputBuffer.slice(); } - frameBuffer.put(codecOutputBuffer); - frameBuffer.rewind(); final EncodedImage.FrameType frameType = isKeyFrame ? EncodedImage.FrameType.VideoFrameKey