From db78af916db598ef6fa31523af9d2c1430423bd3 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 22 Nov 2013 00:29:48 -0500 Subject: [PATCH] Handle decode units larger than the size of the decode unit buffer --- .../nvstream/av/video/CpuDecoderRenderer.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/com/limelight/nvstream/av/video/CpuDecoderRenderer.java b/src/com/limelight/nvstream/av/video/CpuDecoderRenderer.java index fc560b58..9b724fc2 100644 --- a/src/com/limelight/nvstream/av/video/CpuDecoderRenderer.java +++ b/src/com/limelight/nvstream/av/video/CpuDecoderRenderer.java @@ -145,12 +145,28 @@ public class CpuDecoderRenderer implements DecoderRenderer { @Override public boolean submitDecodeUnit(AvDecodeUnit decodeUnit) { - decoderBuffer.clear(); + byte[] data; - for (AvByteBufferDescriptor bbd : decodeUnit.getBufferList()) { - decoderBuffer.put(bbd.data, bbd.offset, bbd.length); + // Use the reserved decoder buffer if this decode unit will fit + if (decodeUnit.getDataLength() <= decoderBuffer.limit()) { + decoderBuffer.clear(); + + for (AvByteBufferDescriptor bbd : decodeUnit.getBufferList()) { + decoderBuffer.put(bbd.data, bbd.offset, bbd.length); + } + + data = decoderBuffer.array(); + } + else { + data = new byte[decodeUnit.getDataLength()]; + + int offset = 0; + for (AvByteBufferDescriptor bbd : decodeUnit.getBufferList()) { + System.arraycopy(bbd.data, bbd.offset, data, offset, bbd.length); + offset += bbd.length; + } } - return (AvcDecoder.decode(decoderBuffer.array(), 0, decodeUnit.getDataLength()) == 0); + return (AvcDecoder.decode(data, 0, decodeUnit.getDataLength()) == 0); } }