From 6362b566bccbb19c616cb5398e6c8b77e5446e57 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Tue, 11 Mar 2014 17:53:57 +0100 Subject: [PATCH] Don't create new byte array when replacing bits if possible --- .../binding/video/OmxDecoderRenderer.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/com/limelight/binding/video/OmxDecoderRenderer.java b/src/com/limelight/binding/video/OmxDecoderRenderer.java index cade42f..3ca86a3 100644 --- a/src/com/limelight/binding/video/OmxDecoderRenderer.java +++ b/src/com/limelight/binding/video/OmxDecoderRenderer.java @@ -75,13 +75,21 @@ public class OmxDecoderRenderer implements VideoDecoderRenderer { public void replace(ByteBufferDescriptor source, int srcOffset, int srcLength, byte[] data, int dataLength) { //Add 7 to always round up int length = (source.length*8-srcLength+dataLength+7)/8; - byte dest[] = new byte[length]; - + int bitOffset = srcOffset%8; int byteOffset = srcOffset/8; - //Copy the first bytes - System.arraycopy(source.data, source.offset, dest, 0, byteOffset); + byte dest[] = null; + int offset = 0; + if (length>source.length) { + dest = new byte[length]; + + //Copy the first bytes + System.arraycopy(source.data, source.offset, dest, offset, byteOffset); + } else { + dest = source.data; + offset = source.offset; + } int byteLength = (bitOffset+dataLength+7)/8; int bitTrailing = 8 - (srcOffset+dataLength) % 8; @@ -109,7 +117,7 @@ public class OmxDecoderRenderer implements VideoDecoderRenderer { } } - dest[i+byteOffset] = result; + dest[i+byteOffset+offset] = result; } //Source offset @@ -120,16 +128,18 @@ public class OmxDecoderRenderer implements VideoDecoderRenderer { int destOffset = (srcOffset+dataLength)/8; for (int i=1;i>> bitOffset); - result ^= moved; + int diff = destOffset >= byteOffset-1?i:source.length-byteOffset-i; - dest[i+destOffset] = result; + byte result = 0; + result = (byte) (source.data[byteOffset+diff-1+source.offset] << 8-bitOffset); + byte moved = (byte) ((source.data[byteOffset+diff+source.offset]&0xFF) >>> bitOffset); + result ^= moved; + + dest[diff+destOffset+offset] = result; } source.data = dest; - source.offset = 0; + source.offset = offset; source.length = length; }