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 #ifndef VP9_DECODER_VP9_DBOOLHUFF_H_ 12 #define VP9_DECODER_VP9_DBOOLHUFF_H_ 13 14 #include <stddef.h> 15 #include <limits.h> 16 17 #include "./vpx_config.h" 18 #include "vpx_ports/mem.h" 19 #include "vpx/vpx_integer.h" 20 21 typedef size_t VP9_BD_VALUE; 22 23 #define BD_VALUE_SIZE ((int)sizeof(VP9_BD_VALUE)*CHAR_BIT) 24 25 typedef struct { 26 const uint8_t *buffer_end; 27 const uint8_t *buffer; 28 VP9_BD_VALUE value; 29 int count; 30 unsigned int range; 31 } vp9_reader; 32 33 DECLARE_ALIGNED(16, extern const uint8_t, vp9_norm[256]); 34 35 int vp9_reader_init(vp9_reader *r, const uint8_t *buffer, size_t size); 36 37 void vp9_reader_fill(vp9_reader *r); 38 39 const uint8_t *vp9_reader_find_end(vp9_reader *r); 40 41 static int vp9_read(vp9_reader *br, int probability) { 42 unsigned int bit = 0; 43 VP9_BD_VALUE value; 44 VP9_BD_VALUE bigsplit; 45 int count; 46 unsigned int range; 47 unsigned int split = ((br->range * probability) + (256 - probability)) >> 8; 48 49 if (br->count < 0) 50 vp9_reader_fill(br); 51 52 value = br->value; 53 count = br->count; 54 55 bigsplit = (VP9_BD_VALUE)split << (BD_VALUE_SIZE - 8); 56 57 range = split; 58 59 if (value >= bigsplit) { 60 range = br->range - split; 61 value = value - bigsplit; 62 bit = 1; 63 } 64 65 { 66 register unsigned int shift = vp9_norm[range]; 67 range <<= shift; 68 value <<= shift; 69 count -= shift; 70 } 71 br->value = value; 72 br->count = count; 73 br->range = range; 74 75 return bit; 76 } 77 78 static int vp9_read_bit(vp9_reader *r) { 79 return vp9_read(r, 128); // vp9_prob_half 80 } 81 82 static int vp9_read_literal(vp9_reader *br, int bits) { 83 int z = 0, bit; 84 85 for (bit = bits - 1; bit >= 0; bit--) 86 z |= vp9_read_bit(br) << bit; 87 88 return z; 89 } 90 91 int vp9_reader_has_error(vp9_reader *r); 92 93 #endif // VP9_DECODER_VP9_DBOOLHUFF_H_ 94