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 (at) 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) 18 extern "C" { 19 #endif 20 21 //----------------------------------------------------------------------------- 22 // Bit-writing 23 24 typedef struct VP8BitWriter VP8BitWriter; 25 struct 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 36 int VP8BitWriterInit(VP8BitWriter* const bw, size_t expected_size); 37 uint8_t* VP8BitWriterFinish(VP8BitWriter* const bw); 38 int VP8PutBit(VP8BitWriter* const bw, int bit, int prob); 39 int VP8PutBitUniform(VP8BitWriter* const bw, int bit); 40 void VP8PutValue(VP8BitWriter* const bw, int value, int nb_bits); 41 void VP8PutSignedValue(VP8BitWriter* const bw, int value, int nb_bits); 42 int VP8BitWriterAppend(VP8BitWriter* const bw, 43 const uint8_t* data, size_t size); 44 45 // return approximate write position (in bits) 46 static inline uint64_t VP8BitWriterPos(const VP8BitWriter* const bw) { 47 return (uint64_t)(bw->pos_ + bw->run_) * 8 + 8 + bw->nb_bits_; 48 } 49 50 static inline uint8_t* VP8BitWriterBuf(const VP8BitWriter* const bw) { 51 return bw->buf_; 52 } 53 static 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