| /* |
| * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| |
| #include "dboolhuff.h" |
| #include "vpx_ports/mem.h" |
| #include "vpx_mem/vpx_mem.h" |
| |
| DECLARE_ALIGNED(16, const unsigned char, vp8dx_bitreader_norm[256]) = |
| { |
| 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, |
| 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, |
| 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, |
| 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, |
| 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, |
| 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, |
| 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, |
| 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 |
| }; |
| |
| |
| int vp8dx_start_decode_c(BOOL_DECODER *br, const unsigned char *source, |
| unsigned int source_sz) |
| { |
| br->user_buffer_end = source+source_sz; |
| br->user_buffer = source; |
| br->value = 0; |
| br->count = -8; |
| br->range = 255; |
| |
| if (source_sz && !source) |
| return 1; |
| |
| /* Populate the buffer */ |
| vp8dx_bool_decoder_fill_c(br); |
| |
| return 0; |
| } |
| |
| |
| void vp8dx_bool_decoder_fill_c(BOOL_DECODER *br) |
| { |
| const unsigned char *bufptr; |
| const unsigned char *bufend; |
| VP8_BD_VALUE value; |
| int count; |
| bufend = br->user_buffer_end; |
| bufptr = br->user_buffer; |
| value = br->value; |
| count = br->count; |
| |
| VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend); |
| |
| br->user_buffer = bufptr; |
| br->value = value; |
| br->count = count; |
| } |
| |
| #if 0 |
| /* |
| * Until optimized versions of these functions are available, we |
| * keep the implementation in the header to allow inlining. |
| * |
| * The RTCD-style invocations are still in place so this can |
| * be switched by just uncommenting these functions here and |
| * the DBOOLHUFF_INVOKE calls in the header. |
| */ |
| int vp8dx_decode_bool_c(BOOL_DECODER *br, int probability) |
| { |
| unsigned int bit=0; |
| VP8_BD_VALUE value; |
| unsigned int split; |
| VP8_BD_VALUE bigsplit; |
| int count; |
| unsigned int range; |
| |
| value = br->value; |
| count = br->count; |
| range = br->range; |
| |
| split = 1 + (((range-1) * probability) >> 8); |
| bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); |
| |
| range = split; |
| if(value >= bigsplit) |
| { |
| range = br->range-split; |
| value = value-bigsplit; |
| bit = 1; |
| } |
| |
| /*if(range>=0x80) |
| { |
| br->value = value; |
| br->range = range; |
| return bit; |
| }*/ |
| |
| { |
| register unsigned int shift = vp8dx_bitreader_norm[range]; |
| range <<= shift; |
| value <<= shift; |
| count -= shift; |
| } |
| br->value = value; |
| br->count = count; |
| br->range = range; |
| if (count < 0) |
| vp8dx_bool_decoder_fill_c(br); |
| return bit; |
| } |
| |
| int vp8dx_decode_value_c(BOOL_DECODER *br, int bits) |
| { |
| int z = 0; |
| int bit; |
| for ( bit=bits-1; bit>=0; bit-- ) |
| { |
| z |= (vp8dx_decode_bool(br, 0x80)<<bit); |
| } |
| return z; |
| } |
| #endif |