blob: 8633372da3478af419c749f74473e0ebddaa2595 [file] [log] [blame]
Jim Bankoski423590a2014-03-03 15:40:13 -08001/*
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
James Zernc5a7eef2014-08-02 14:14:22 -070011#include <limits.h>
Ronald S. Bultjea3df3432015-09-08 14:26:42 -040012#include <stdlib.h>
Yaowu Xuc5ad31e2015-07-20 11:05:04 -070013
Ronald S. Bultjea3df3432015-09-08 14:26:42 -040014#include "./vpx_config.h"
Yaowu Xu1fcef812015-07-20 11:18:57 -070015#include "./bitwriter_buffer.h"
Jim Bankoski423590a2014-03-03 15:40:13 -080016
Yaowu Xu5f509162015-07-20 14:24:14 -070017size_t vpx_wb_bytes_written(const struct vpx_write_bit_buffer *wb) {
Jim Bankoski423590a2014-03-03 15:40:13 -080018 return wb->bit_offset / CHAR_BIT + (wb->bit_offset % CHAR_BIT > 0);
19}
20
Yaowu Xu5f509162015-07-20 14:24:14 -070021void vpx_wb_write_bit(struct vpx_write_bit_buffer *wb, int bit) {
Jim Bankoski423590a2014-03-03 15:40:13 -080022 const int off = (int)wb->bit_offset;
23 const int p = off / CHAR_BIT;
24 const int q = CHAR_BIT - 1 - off % CHAR_BIT;
25 if (q == CHAR_BIT -1) {
26 wb->bit_buffer[p] = bit << q;
27 } else {
28 wb->bit_buffer[p] &= ~(1 << q);
29 wb->bit_buffer[p] |= bit << q;
30 }
31 wb->bit_offset = off + 1;
32}
33
Yaowu Xu5f509162015-07-20 14:24:14 -070034void vpx_wb_write_literal(struct vpx_write_bit_buffer *wb, int data, int bits) {
Jim Bankoski423590a2014-03-03 15:40:13 -080035 int bit;
36 for (bit = bits - 1; bit >= 0; bit--)
Yaowu Xu5f509162015-07-20 14:24:14 -070037 vpx_wb_write_bit(wb, (data >> bit) & 1);
Jim Bankoski423590a2014-03-03 15:40:13 -080038}
Ronald S. Bultjea3df3432015-09-08 14:26:42 -040039
40void vpx_wb_write_inv_signed_literal(struct vpx_write_bit_buffer *wb,
41 int data, int bits) {
Ronald S. Bultjea3df3432015-09-08 14:26:42 -040042 vpx_wb_write_literal(wb, data, bits + 1);
Ronald S. Bultjea3df3432015-09-08 14:26:42 -040043}