From a9b2120fc961215ad09f3e52578964ae27caccde Mon Sep 17 00:00:00 2001 From: Lei YU Date: Fri, 23 Jan 2015 16:44:23 +0800 Subject: [PATCH 1/2] Fix an issue in BitArray.readUnsignedByte() returns incorrect value when bitOffset is not zero and data[byteOffset + 1] starts with bit 1. This is caused by signed right shift, the fix is simply to make it unsigned right shift. --- .../main/java/com/google/android/exoplayer/util/BitArray.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/com/google/android/exoplayer/util/BitArray.java b/library/src/main/java/com/google/android/exoplayer/util/BitArray.java index 23cd760b6d..ae3020904f 100644 --- a/library/src/main/java/com/google/android/exoplayer/util/BitArray.java +++ b/library/src/main/java/com/google/android/exoplayer/util/BitArray.java @@ -151,7 +151,7 @@ public final class BitArray { byte b; if (bitOffset != 0) { b = (byte) ((data[byteOffset] << bitOffset) - | (data[byteOffset + 1] >> (8 - bitOffset))); + | ((data[byteOffset + 1] & 0xFF) >> (8 - bitOffset))); } else { b = data[byteOffset]; } From 80602b16846da1c7a9e9df1b5eb051adb8498dfc Mon Sep 17 00:00:00 2001 From: Lei YU Date: Fri, 23 Jan 2015 23:52:46 +0800 Subject: [PATCH 2/2] Make BitArray.readUnsignedByte() a bit more clear by using int value instead of byte to prevent unnecessary convert from int to byte. --- .../com/google/android/exoplayer/util/BitArray.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/util/BitArray.java b/library/src/main/java/com/google/android/exoplayer/util/BitArray.java index ae3020904f..5f7ed4278f 100644 --- a/library/src/main/java/com/google/android/exoplayer/util/BitArray.java +++ b/library/src/main/java/com/google/android/exoplayer/util/BitArray.java @@ -148,16 +148,15 @@ public final class BitArray { * @return The value of the parsed byte. */ public int readUnsignedByte() { - byte b; + int value; if (bitOffset != 0) { - b = (byte) ((data[byteOffset] << bitOffset) - | ((data[byteOffset + 1] & 0xFF) >> (8 - bitOffset))); + value = (data[byteOffset] << bitOffset) + | ((data[byteOffset + 1] & 0xFF) >>> (8 - bitOffset)); } else { - b = data[byteOffset]; + value = data[byteOffset]; } byteOffset++; - // Converting a signed byte into unsigned. - return b & 0xFF; + return value & 0xFF; } /**