Index: libvpx/source/libvpx/vp8/decoder/dboolhuff.h |
diff --git a/libvpx/source/libvpx/vp8/decoder/dboolhuff.h b/libvpx/source/libvpx/vp8/decoder/dboolhuff.h |
index 853c10f145234c20a44e409c91739886eb9e4c0a..a83e3f012ac4edeb76526a546be57ed64c4ea1e0 100644 |
--- a/libvpx/source/libvpx/vp8/decoder/dboolhuff.h |
+++ b/libvpx/source/libvpx/vp8/decoder/dboolhuff.h |
@@ -34,7 +34,7 @@ typedef struct |
unsigned int range; |
} BOOL_DECODER; |
-DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]); |
+DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]); |
int vp8dx_start_decode(BOOL_DECODER *br, |
const unsigned char *source, |
@@ -51,26 +51,19 @@ void vp8dx_bool_decoder_fill(BOOL_DECODER *br); |
#define VP8DX_BOOL_DECODER_FILL(_count,_value,_bufptr,_bufend) \ |
do \ |
{ \ |
- int shift = VP8_BD_VALUE_SIZE - 8 - ((_count) + 8); \ |
- int loop_end, x; \ |
- size_t bits_left = ((_bufend)-(_bufptr))*CHAR_BIT; \ |
- \ |
- x = shift + CHAR_BIT - bits_left; \ |
- loop_end = 0; \ |
- if(x >= 0) \ |
+ int shift; \ |
+ for(shift = VP8_BD_VALUE_SIZE - 8 - ((_count) + 8); shift >= 0; ) \ |
{ \ |
- (_count) += VP8_LOTS_OF_BITS; \ |
- loop_end = x; \ |
- if(!bits_left) break; \ |
- } \ |
- while(shift >= loop_end) \ |
- { \ |
- (_count) += CHAR_BIT; \ |
+ if((_bufptr) >= (_bufend)) { \ |
+ (_count) = VP8_LOTS_OF_BITS; \ |
+ break; \ |
+ } \ |
+ (_count) += 8; \ |
(_value) |= (VP8_BD_VALUE)*(_bufptr)++ << shift; \ |
- shift -= CHAR_BIT; \ |
+ shift -= 8; \ |
} \ |
} \ |
- while(0) \ |
+ while(0) |
static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) { |
@@ -81,14 +74,11 @@ static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) { |
int count; |
unsigned int range; |
- split = 1 + (((br->range - 1) * probability) >> 8); |
- |
- if(br->count < 0) |
- vp8dx_bool_decoder_fill(br); |
- |
value = br->value; |
count = br->count; |
+ range = br->range; |
+ split = 1 + (((range - 1) * probability) >> 8); |
bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); |
range = split; |
@@ -101,7 +91,7 @@ static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) { |
} |
{ |
- register unsigned int shift = vp8_norm[range]; |
+ register unsigned int shift = vp8dx_bitreader_norm[range]; |
range <<= shift; |
value <<= shift; |
count -= shift; |
@@ -109,7 +99,8 @@ static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) { |
br->value = value; |
br->count = count; |
br->range = range; |
- |
+ if(count < 0) |
+ vp8dx_bool_decoder_fill(br); |
return bit; |
} |
@@ -128,19 +119,18 @@ static int vp8_decode_value(BOOL_DECODER *br, int bits) |
static int vp8dx_bool_error(BOOL_DECODER *br) |
{ |
- /* Check if we have reached the end of the buffer. |
- * |
- * Variable 'count' stores the number of bits in the 'value' buffer, minus |
- * 8. The top byte is part of the algorithm, and the remainder is buffered |
- * to be shifted into it. So if count == 8, the top 16 bits of 'value' are |
- * occupied, 8 for the algorithm and 8 in the buffer. |
- * |
- * When reading a byte from the user's buffer, count is filled with 8 and |
- * one byte is filled into the value buffer. When we reach the end of the |
- * data, count is additionally filled with VP8_LOTS_OF_BITS. So when |
- * count == VP8_LOTS_OF_BITS - 1, the user's data has been exhausted. |
- */ |
- if ((br->count > VP8_BD_VALUE_SIZE) && (br->count < VP8_LOTS_OF_BITS)) |
+ /* Check if we have reached the end of the buffer. |
+ * |
+ * Variable 'count' stores the number of bits in the 'value' buffer, |
+ * minus 8. So if count == 8, there are 16 bits available to be read. |
+ * Normally, count is filled with 8 and one byte is filled into the |
+ * value buffer. When we reach the end of the buffer, count is instead |
+ * filled with VP8_LOTS_OF_BITS, 8 of which represent the last 8 real |
+ * bits from the bitstream. So the last bit in the bitstream will be |
+ * represented by count == VP8_LOTS_OF_BITS - 16. |
+ */ |
+ if ((br->count > VP8_BD_VALUE_SIZE) |
+ && (br->count <= VP8_LOTS_OF_BITS - 16)) |
{ |
/* We have tried to decode bits after the end of |
* stream was encountered. |