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);
42int VP8BitWriterAppend(VP8BitWriter* const bw,
43                       const uint8_t* data, size_t size);
44
45// return approximate write position (in bits)
46static inline uint64_t VP8BitWriterPos(const VP8BitWriter* const bw) {
47  return (uint64_t)(bw->pos_ + bw->run_) * 8 + 8 + bw->nb_bits_;
48}
49
50static inline uint8_t* VP8BitWriterBuf(const VP8BitWriter* const bw) {
51  return bw->buf_;
52}
53static inline size_t VP8BitWriterSize(const VP8BitWriter* const bw) {
54  return bw->pos_;
55}
56
57//-----------------------------------------------------------------------------
58
59#if defined(__cplusplus) || defined(c_plusplus)
60}    // extern "C"
61#endif
62
63#endif  // WEBP_ENC_BIT_WRITER_H_
64