Home | History | Annotate | Download | only in decoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 
     12 #include "dboolhuff.h"
     13 #include "vpx_ports/mem.h"
     14 #include "vpx_mem/vpx_mem.h"
     15 
     16 DECLARE_ALIGNED(16, const unsigned char, vp8dx_bitreader_norm[256]) =
     17 {
     18     0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     19     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     20     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     21     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     22     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     23     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     24     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     25     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
     26 };
     27 
     28 
     29 int vp8dx_start_decode_c(BOOL_DECODER *br, const unsigned char *source,
     30                         unsigned int source_sz)
     31 {
     32     br->user_buffer_end = source+source_sz;
     33     br->user_buffer     = source;
     34     br->value    = 0;
     35     br->count    = -8;
     36     br->range    = 255;
     37 
     38     if (source_sz && !source)
     39         return 1;
     40 
     41     /* Populate the buffer */
     42     vp8dx_bool_decoder_fill_c(br);
     43 
     44     return 0;
     45 }
     46 
     47 
     48 void vp8dx_bool_decoder_fill_c(BOOL_DECODER *br)
     49 {
     50     const unsigned char *bufptr;
     51     const unsigned char *bufend;
     52     VP8_BD_VALUE         value;
     53     int                  count;
     54     bufend = br->user_buffer_end;
     55     bufptr = br->user_buffer;
     56     value = br->value;
     57     count = br->count;
     58 
     59     VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend);
     60 
     61     br->user_buffer = bufptr;
     62     br->value = value;
     63     br->count = count;
     64 }
     65 
     66 #if 0
     67 /*
     68  * Until optimized versions of these functions are available, we
     69  * keep the implementation in the header to allow inlining.
     70  *
     71  * The RTCD-style invocations are still in place so this can
     72  * be switched by just uncommenting these functions here and
     73  * the DBOOLHUFF_INVOKE calls in the header.
     74  */
     75 int vp8dx_decode_bool_c(BOOL_DECODER *br, int probability)
     76 {
     77     unsigned int bit=0;
     78     VP8_BD_VALUE value;
     79     unsigned int split;
     80     VP8_BD_VALUE bigsplit;
     81     int count;
     82     unsigned int range;
     83 
     84     value = br->value;
     85     count = br->count;
     86     range = br->range;
     87 
     88     split = 1 + (((range-1) * probability) >> 8);
     89     bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8);
     90 
     91     range = split;
     92     if(value >= bigsplit)
     93     {
     94         range = br->range-split;
     95         value = value-bigsplit;
     96         bit = 1;
     97     }
     98 
     99     /*if(range>=0x80)
    100     {
    101         br->value = value;
    102         br->range = range;
    103         return bit;
    104     }*/
    105 
    106     {
    107         register unsigned int shift = vp8dx_bitreader_norm[range];
    108         range <<= shift;
    109         value <<= shift;
    110         count -= shift;
    111     }
    112     br->value = value;
    113     br->count = count;
    114     br->range = range;
    115     if (count < 0)
    116         vp8dx_bool_decoder_fill_c(br);
    117     return bit;
    118 }
    119 
    120 int vp8dx_decode_value_c(BOOL_DECODER *br, int bits)
    121 {
    122     int z = 0;
    123     int bit;
    124     for ( bit=bits-1; bit>=0; bit-- )
    125     {
    126         z |= (vp8dx_decode_bool(br, 0x80)<<bit);
    127     }
    128     return z;
    129 }
    130 #endif
    131