|
1 /* |
|
2 * Copyright (c) 2013 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_READ_BIT_BUFFER_H_ |
|
12 #define VP9_DECODER_VP9_READ_BIT_BUFFER_H_ |
|
13 |
|
14 #include <limits.h> |
|
15 |
|
16 #include "vpx/vpx_integer.h" |
|
17 |
|
18 typedef void (*vp9_rb_error_handler)(void *data, size_t bit_offset); |
|
19 |
|
20 struct vp9_read_bit_buffer { |
|
21 const uint8_t *bit_buffer; |
|
22 const uint8_t *bit_buffer_end; |
|
23 size_t bit_offset; |
|
24 |
|
25 void *error_handler_data; |
|
26 vp9_rb_error_handler error_handler; |
|
27 }; |
|
28 |
|
29 static size_t vp9_rb_bytes_read(struct vp9_read_bit_buffer *rb) { |
|
30 return rb->bit_offset / CHAR_BIT + (rb->bit_offset % CHAR_BIT > 0); |
|
31 } |
|
32 |
|
33 static int vp9_rb_read_bit(struct vp9_read_bit_buffer *rb) { |
|
34 const size_t off = rb->bit_offset; |
|
35 const size_t p = off / CHAR_BIT; |
|
36 const int q = CHAR_BIT - 1 - (int)off % CHAR_BIT; |
|
37 if (rb->bit_buffer + p >= rb->bit_buffer_end) { |
|
38 rb->error_handler(rb->error_handler_data, rb->bit_offset); |
|
39 return 0; |
|
40 } else { |
|
41 const int bit = (rb->bit_buffer[p] & (1 << q)) >> q; |
|
42 rb->bit_offset = off + 1; |
|
43 return bit; |
|
44 } |
|
45 } |
|
46 |
|
47 static int vp9_rb_read_literal(struct vp9_read_bit_buffer *rb, int bits) { |
|
48 int value = 0, bit; |
|
49 for (bit = bits - 1; bit >= 0; bit--) |
|
50 value |= vp9_rb_read_bit(rb) << bit; |
|
51 return value; |
|
52 } |
|
53 |
|
54 static int vp9_rb_read_signed_literal(struct vp9_read_bit_buffer *rb, |
|
55 int bits) { |
|
56 const int value = vp9_rb_read_literal(rb, bits); |
|
57 return vp9_rb_read_bit(rb) ? -value : value; |
|
58 } |
|
59 |
|
60 #endif // VP9_DECODER_VP9_READ_BIT_BUFFER_H_ |