1// Copyright 2011 Google Inc.
2//
3// This code is licensed under the same terms as WebM:
4//  Software License Agreement:  http://www.webmproject.org/license/software/
5//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
6// -----------------------------------------------------------------------------
7//
8// Bit writing and boolean coder
9//
10// Author: Skal (pascal.massimino@gmail.com)
11
12#ifndef WEBP_ENC_BIT_WRITER_H_
13#define WEBP_ENC_BIT_WRITER_H_
14
15#include "vp8enci.h"
16
17#if defined(__cplusplus) || defined(c_plusplus)
18extern "C" {
19#endif
20
21//-----------------------------------------------------------------------------
22// Bit-writing
23
24typedef struct VP8BitWriter VP8BitWriter;
25struct VP8BitWriter {
26  int32_t  range_;      // range-1
27  int32_t  value_;
28  int      run_;        // number of outstanding bits
29  int      nb_bits_;    // number of pending bits
30  uint8_t* buf_;
31  size_t   pos_;
32  size_t   max_pos_;
33  int      error_;      // true in case of error
34};
35
36int VP8BitWriterInit(VP8BitWriter* const bw, size_t expected_size);
37uint8_t* VP8BitWriterFinish(VP8BitWriter* const bw);
38int VP8PutBit(VP8BitWriter* const bw, int bit, int prob);
39int VP8PutBitUniform(VP8BitWriter* const bw, int bit);
40void VP8PutValue(VP8BitWriter* const bw, int value, int nb_bits);
41void VP8PutSignedValue(VP8BitWriter* const bw, int value, int nb_bits);
42
43// return approximate write position (in bits)
44static inline uint64_t VP8BitWriterPos(const VP8BitWriter* const bw) {
45  return (uint64_t)(bw->pos_ + bw->run_) * 8 + 8 + bw->nb_bits_;
46}
47
48static inline uint8_t* VP8BitWriterBuf(const VP8BitWriter* const bw) {
49  return bw->buf_;
50}
51static inline size_t VP8BitWriterSize(const VP8BitWriter* const bw) {
52  return bw->pos_;
53}
54
55//-----------------------------------------------------------------------------
56
57#if defined(__cplusplus) || defined(c_plusplus)
58}    // extern "C"
59#endif
60
61#endif  // WEBP_ENC_BIT_WRITER_H_
62