diff options
author | Stefan Gehrer <stefan.gehrer@gmx.de> | 2010-06-30 22:05:29 +0000 |
---|---|---|
committer | Stefan Gehrer <stefan.gehrer@gmx.de> | 2010-06-30 22:05:29 +0000 |
commit | bce3bd1ced8ff651d141f3d4f09e9ed903fee325 (patch) | |
tree | 1e293cd9c25bec8255d528b3d57a7ddd2f941de2 /libavcodec/vp56.h | |
parent | 0db2d3cf1d8b6483160707e1ee0f0574b13c30c6 (diff) | |
download | ffmpeg-bce3bd1ced8ff651d141f3d4f09e9ed903fee325.tar.gz |
renormalize VP5/6/7/8 range coder without loop
Originally committed as revision 23915 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vp56.h')
-rw-r--r-- | libavcodec/vp56.h | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h index 4eb414bbbe..8e0d7b5ac3 100644 --- a/libavcodec/vp56.h +++ b/libavcodec/vp56.h @@ -28,6 +28,7 @@ #include "dsputil.h" #include "get_bits.h" #include "bytestream.h" +#include "cabac.h" #include "vp56dsp.h" typedef struct vp56_context VP56Context; @@ -195,6 +196,7 @@ static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob) unsigned int low = 1 + (((c->high - 1) * prob) >> 8); unsigned int low_shift = low << 8; int bit = c->code_word >= low_shift; + int shift; if (bit) { c->high -= low; @@ -204,13 +206,13 @@ static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob) } /* normalize */ - while (c->high < 128) { - c->high <<= 1; - c->code_word <<= 1; - if (--c->bits == 0 && c->buffer < c->end) { - c->bits = 8; - c->code_word |= *c->buffer++; - } + 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; } return bit; } |