|
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_BIT_WRITE_BUFFER_H_ |
|
12 #define VP9_BIT_WRITE_BUFFER_H_ |
|
13 |
|
14 #include <limits.h> |
|
15 |
|
16 #include "vpx/vpx_integer.h" |
|
17 |
|
18 struct vp9_write_bit_buffer { |
|
19 uint8_t *bit_buffer; |
|
20 size_t bit_offset; |
|
21 }; |
|
22 |
|
23 static size_t vp9_rb_bytes_written(struct vp9_write_bit_buffer *wb) { |
|
24 return wb->bit_offset / CHAR_BIT + (wb->bit_offset % CHAR_BIT > 0); |
|
25 } |
|
26 |
|
27 static void vp9_wb_write_bit(struct vp9_write_bit_buffer *wb, int bit) { |
|
28 const int off = wb->bit_offset; |
|
29 const int p = off / CHAR_BIT; |
|
30 const int q = CHAR_BIT - 1 - off % CHAR_BIT; |
|
31 if (q == CHAR_BIT -1) { |
|
32 wb->bit_buffer[p] = bit << q; |
|
33 } else { |
|
34 wb->bit_buffer[p] &= ~(1 << q); |
|
35 wb->bit_buffer[p] |= bit << q; |
|
36 } |
|
37 wb->bit_offset = off + 1; |
|
38 } |
|
39 |
|
40 static void vp9_wb_write_literal(struct vp9_write_bit_buffer *wb, |
|
41 int data, int bits) { |
|
42 int bit; |
|
43 for (bit = bits - 1; bit >= 0; bit--) |
|
44 vp9_wb_write_bit(wb, (data >> bit) & 1); |
|
45 } |
|
46 |
|
47 |
|
48 #endif // VP9_BIT_WRITE_BUFFER_H_ |