summaryrefslogtreecommitdiff
path: root/libavcodec/vp56.h
diff options
context:
space:
mode:
authorDavid Conrad <lessen42@gmail.com>2010-07-23 21:46:08 +0000
committerDavid Conrad <lessen42@gmail.com>2010-07-23 21:46:08 +0000
commitb3d755ec8b516ff45a9cfff9066922ff8196694f (patch)
tree4b0096dafb4eabecb18f2b60820c61a2f1626121 /libavcodec/vp56.h
parent24675b8093e2f6944a1014e98ac455d4df75e8a2 (diff)
Split renorm of vp56 arith decoder to its own function
Originally committed as revision 24466 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vp56.h')
-rw-r--r--libavcodec/vp56.h30
1 files changed, 17 insertions, 13 deletions
diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h
index 298aba3d2d..a1904d56d5 100644
--- a/libavcodec/vp56.h
+++ b/libavcodec/vp56.h
@@ -191,16 +191,30 @@ static inline void vp56_init_range_decoder(VP56RangeCoder *c,
c->code_word = bytestream_get_be16(&c->buffer);
}
+static av_always_inline void vp56_rac_renorm(VP56RangeCoder *c, unsigned int code_word)
+{
+ int shift = ff_h264_norm_shift[c->high] - 1;
+ int bits = c->bits;
+
+ c->high <<= shift;
+ code_word <<= shift;
+ bits += shift;
+ if(bits >= 0 && c->buffer < c->end) {
+ code_word |= *c->buffer++ << bits;
+ bits -= 8;
+ }
+ c->bits = bits;
+ c->code_word = code_word;
+}
+
static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob)
{
/* Don't put c->high in a local variable; if we do that, gcc gets
* the stupids and turns the code below into a branch again. */
- int bits = c->bits;
unsigned int code_word = c->code_word;
unsigned int low = 1 + (((c->high - 1) * prob) >> 8);
unsigned int low_shift = low << 8;
int bit = code_word >= low_shift;
- int shift;
/* Incantation to convince GCC to turn these into conditional moves
* instead of branches -- faster, as this branch is basically
@@ -208,17 +222,7 @@ static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob)
c->high = bit ? c->high - low : low;
code_word = bit ? code_word - low_shift : code_word;
- /* normalize */
- shift = ff_h264_norm_shift[c->high] - 1;
- c->high <<= shift;
- code_word <<= shift;
- bits += shift;
- if(bits >= 0 && c->buffer < c->end) {
- code_word |= *c->buffer++ << bits;
- bits -= 8;
- }
- c->bits = bits;
- c->code_word = code_word;
+ vp56_rac_renorm(c, code_word);
return bit;
}