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_READER_H_
12 #define VP9_DECODER_VP9_READER_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 #include "vp9/common/vp9_prob.h"
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 typedef size_t BD_VALUE;
28 
29 #define BD_VALUE_SIZE ((int)sizeof(BD_VALUE) * CHAR_BIT)
30 
31 typedef struct {
32   const uint8_t *buffer_end;
33   const uint8_t *buffer;
34   BD_VALUE value;
35   int count;
36   unsigned int range;
37 } vp9_reader;
38 
39 int vp9_reader_init(vp9_reader *r, const uint8_t *buffer, size_t size);
40 
41 void vp9_reader_fill(vp9_reader *r);
42 
43 int vp9_reader_has_error(vp9_reader *r);
44 
45 const uint8_t *vp9_reader_find_end(vp9_reader *r);
46 
vp9_read(vp9_reader * r,int prob)47 static int vp9_read(vp9_reader *r, int prob) {
48   unsigned int bit = 0;
49   BD_VALUE value;
50   BD_VALUE bigsplit;
51   int count;
52   unsigned int range;
53   unsigned int split = (r->range * prob + (256 - prob)) >> CHAR_BIT;
54 
55   if (r->count < 0)
56     vp9_reader_fill(r);
57 
58   value = r->value;
59   count = r->count;
60 
61   bigsplit = (BD_VALUE)split << (BD_VALUE_SIZE - CHAR_BIT);
62 
63   range = split;
64 
65   if (value >= bigsplit) {
66     range = r->range - split;
67     value = value - bigsplit;
68     bit = 1;
69   }
70 
71   {
72     register unsigned int shift = vp9_norm[range];
73     range <<= shift;
74     value <<= shift;
75     count -= shift;
76   }
77   r->value = value;
78   r->count = count;
79   r->range = range;
80 
81   return bit;
82 }
83 
vp9_read_bit(vp9_reader * r)84 static int vp9_read_bit(vp9_reader *r) {
85   return vp9_read(r, 128);  // vp9_prob_half
86 }
87 
vp9_read_literal(vp9_reader * r,int bits)88 static int vp9_read_literal(vp9_reader *r, int bits) {
89   int literal = 0, bit;
90 
91   for (bit = bits - 1; bit >= 0; bit--)
92     literal |= vp9_read_bit(r) << bit;
93 
94   return literal;
95 }
96 
vp9_read_tree(vp9_reader * r,const vp9_tree_index * tree,const vp9_prob * probs)97 static int vp9_read_tree(vp9_reader *r, const vp9_tree_index *tree,
98                          const vp9_prob *probs) {
99   vp9_tree_index i = 0;
100 
101   while ((i = tree[i + vp9_read(r, probs[i >> 1])]) > 0)
102     continue;
103 
104   return -i;
105 }
106 
107 #ifdef __cplusplus
108 }  // extern "C"
109 #endif
110 
111 #endif  // VP9_DECODER_VP9_READER_H_
112