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