17c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Copyright 2011 Google Inc.
27c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
37c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// This code is licensed under the same terms as WebM:
47c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//  Software License Agreement:  http://www.webmproject.org/license/software/
57c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
67c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// -----------------------------------------------------------------------------
77c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
87c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Bit writing and boolean coder
97c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
107c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Author: Skal (pascal.massimino@gmail.com)
117c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
127c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#ifndef WEBP_ENC_BIT_WRITER_H_
137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define WEBP_ENC_BIT_WRITER_H_
147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#include "vp8enci.h"
167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#if defined(__cplusplus) || defined(c_plusplus)
187c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern "C" {
197c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif
207c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
217c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//-----------------------------------------------------------------------------
227c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Bit-writing
237c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
247c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct VP8BitWriter VP8BitWriter;
257c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arorastruct VP8BitWriter {
267c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int32_t  range_;      // range-1
277c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int32_t  value_;
287c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int      run_;        // number of outstanding bits
297c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int      nb_bits_;    // number of pending bits
307c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t* buf_;
317c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  size_t   pos_;
327c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  size_t   max_pos_;
337c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int      error_;      // true in case of error
347c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora};
357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
367c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8BitWriterInit(VP8BitWriter* const bw, size_t expected_size);
377c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arorauint8_t* VP8BitWriterFinish(VP8BitWriter* const bw);
387c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8PutBit(VP8BitWriter* const bw, int bit, int prob);
397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8PutBitUniform(VP8BitWriter* const bw, int bit);
407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8PutValue(VP8BitWriter* const bw, int value, int nb_bits);
417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8PutSignedValue(VP8BitWriter* const bw, int value, int nb_bits);
42466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Aroraint VP8BitWriterAppend(VP8BitWriter* const bw,
43466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora                       const uint8_t* data, size_t size);
447c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
457c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// return approximate write position (in bits)
467c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arorastatic inline uint64_t VP8BitWriterPos(const VP8BitWriter* const bw) {
477c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  return (uint64_t)(bw->pos_ + bw->run_) * 8 + 8 + bw->nb_bits_;
487c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}
497c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
507c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arorastatic inline uint8_t* VP8BitWriterBuf(const VP8BitWriter* const bw) {
517c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  return bw->buf_;
527c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}
537c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arorastatic inline size_t VP8BitWriterSize(const VP8BitWriter* const bw) {
547c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  return bw->pos_;
557c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}
567c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
577c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//-----------------------------------------------------------------------------
587c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
597c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#if defined(__cplusplus) || defined(c_plusplus)
607c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}    // extern "C"
617c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif
627c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
637c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif  // WEBP_ENC_BIT_WRITER_H_
64