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;
 }