summaryrefslogtreecommitdiff
path: root/libavcodec/vp56.h
diff options
context:
space:
mode:
authorJason Garrett-Glaser <darkshikari@gmail.com>2010-06-30 23:15:25 +0000
committerJason Garrett-Glaser <darkshikari@gmail.com>2010-06-30 23:15:25 +0000
commit2e6ed48d6e7525fceba5469e1512b20c7c5c3198 (patch)
treee19c90a71c3f0b64f9a901200ee0c404005e496f /libavcodec/vp56.h
parentb0a18c2f0a6d54b522a8f21538801e152ddf7fb8 (diff)
Optimize vp56 arithmetic decoder
Negate "bits" to eliminate a negate in cache refilling. Originally committed as revision 23920 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vp56.h')
-rw-r--r--libavcodec/vp56.h17
1 files changed, 9 insertions, 8 deletions
diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h
index 8e0d7b5ac3..af1a65db5c 100644
--- a/libavcodec/vp56.h
+++ b/libavcodec/vp56.h
@@ -48,7 +48,8 @@ typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf,
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 @@ static inline void vp56_init_range_decoder(VP56RangeCoder *c,
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 @@ static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob)
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 @@ static inline int vp56_rac_get(VP56RangeCoder *c)
/* 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;