summaryrefslogtreecommitdiff
path: root/libavcodec/vp56.h
diff options
context:
space:
mode:
authorStefan Gehrer <stefan.gehrer@gmx.de>2010-06-30 22:05:29 +0000
committerStefan Gehrer <stefan.gehrer@gmx.de>2010-06-30 22:05:29 +0000
commitbce3bd1ced8ff651d141f3d4f09e9ed903fee325 (patch)
tree1e293cd9c25bec8255d528b3d57a7ddd2f941de2 /libavcodec/vp56.h
parent0db2d3cf1d8b6483160707e1ee0f0574b13c30c6 (diff)
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.h16
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;
}