# HG changeset patch # User darkshikari # Date 1277939725 0 # Node ID 5578dcdf030c4f22b85db89030581b8ece875f41 # Parent 22da8afd75a5a77b18dab54ecc604ec0a250f16b Optimize vp56 arithmetic decoder Negate "bits" to eliminate a negate in cache refilling. diff -r 22da8afd75a5 -r 5578dcdf030c vp56.h --- a/vp56.h Wed Jun 30 22:33:38 2010 +0000 +++ b/vp56.h Wed Jun 30 23:15:25 2010 +0000 @@ -48,7 +48,8 @@ typedef struct { int high; - int bits; + int bits; /* Stored negated (i.e. negative "bits" is a positive number of bits left) + * in order to eliminate a negate in cache refilling */ const uint8_t *buffer; const uint8_t *end; unsigned long code_word; @@ -185,7 +186,7 @@ const uint8_t *buf, int buf_size) { c->high = 255; - c->bits = 8; + c->bits = -8; c->buffer = buf; c->end = buf + buf_size; c->code_word = bytestream_get_be16(&c->buffer); @@ -209,10 +210,10 @@ shift = ff_h264_norm_shift[c->high] - 1; c->high <<= shift; c->code_word <<= shift; - c->bits -= shift; - if(c->bits <= 0 && c->buffer < c->end) { - c->code_word |= *c->buffer++ << -c->bits; - c->bits += 8; + c->bits += shift; + if(c->bits >= 0 && c->buffer < c->end) { + c->code_word |= *c->buffer++ << c->bits; + c->bits -= 8; } return bit; } @@ -232,8 +233,8 @@ /* normalize */ c->code_word <<= 1; - if (--c->bits == 0 && c->buffer < c->end) { - c->bits = 8; + if (++c->bits == 0 && c->buffer < c->end) { + c->bits = -8; c->code_word |= *c->buffer++; } return bit;