Mercurial > libavcodec.hg
changeset 12029:934968bd410d libavcodec
renormalize VP5/6/7/8 range coder without loop
author | stefang |
---|---|
date | Wed, 30 Jun 2010 22:05:29 +0000 |
parents | 2caea98f5711 |
children | 22da8afd75a5 |
files | Makefile vp56.h |
diffstat | 2 files changed, 10 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Wed Jun 30 21:46:03 2010 +0000 +++ b/Makefile Wed Jun 30 22:05:29 2010 +0000 @@ -376,7 +376,7 @@ OBJS-$(CONFIG_VP6_DECODER) += vp6.o vp56.o vp56data.o vp56dsp.o \ vp3dsp.o vp6dsp.o huffman.o OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp8dsp.o vp56.o vp56data.o \ - h264pred.o + h264pred.o cabac.o OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o OBJS-$(CONFIG_WMAPRO_DECODER) += wmaprodec.o wma.o
--- a/vp56.h Wed Jun 30 21:46:03 2010 +0000 +++ b/vp56.h Wed Jun 30 22:05:29 2010 +0000 @@ -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 @@ 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 @@ } /* 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; }