Index: third_party/libwebp/utils/bit_writer.h |
diff --git a/third_party/libwebp/utils/bit_writer.h b/third_party/libwebp/utils/bit_writer.h |
index 1368a349ec5e9915fe8547fd81ec445c88667d87..f7ca08497f687104a9d6dc6bd883ee23aab534a0 100644 |
--- a/third_party/libwebp/utils/bit_writer.h |
+++ b/third_party/libwebp/utils/bit_writer.h |
@@ -1,4 +1,4 @@ |
-// Copyright 2011 Google Inc. |
+// Copyright 2011 Google Inc. All Rights Reserved. |
// |
// This code is licensed under the same terms as WebM: |
// Software License Agreement: http://www.webmproject.org/license/software/ |
@@ -27,34 +27,94 @@ struct VP8BitWriter { |
int32_t value_; |
int run_; // number of outstanding bits |
int nb_bits_; // number of pending bits |
- uint8_t* buf_; |
+ uint8_t* buf_; // internal buffer. Re-allocated regularly. Not owned. |
size_t pos_; |
size_t max_pos_; |
int error_; // true in case of error |
}; |
+// Initialize the object. Allocates some initial memory based on expected_size. |
int VP8BitWriterInit(VP8BitWriter* const bw, size_t expected_size); |
+// Finalize the bitstream coding. Returns a pointer to the internal buffer. |
uint8_t* VP8BitWriterFinish(VP8BitWriter* const bw); |
+// Release any pending memory and zeroes the object. Not a mandatory call. |
+// Only useful in case of error, when the internal buffer hasn't been grabbed! |
+void VP8BitWriterWipeOut(VP8BitWriter* const bw); |
+ |
int VP8PutBit(VP8BitWriter* const bw, int bit, int prob); |
int VP8PutBitUniform(VP8BitWriter* const bw, int bit); |
void VP8PutValue(VP8BitWriter* const bw, int value, int nb_bits); |
void VP8PutSignedValue(VP8BitWriter* const bw, int value, int nb_bits); |
+ |
+// Appends some bytes to the internal buffer. Data is copied. |
int VP8BitWriterAppend(VP8BitWriter* const bw, |
const uint8_t* data, size_t size); |
// return approximate write position (in bits) |
-static inline uint64_t VP8BitWriterPos(const VP8BitWriter* const bw) { |
+static WEBP_INLINE uint64_t VP8BitWriterPos(const VP8BitWriter* const bw) { |
return (uint64_t)(bw->pos_ + bw->run_) * 8 + 8 + bw->nb_bits_; |
} |
-static inline uint8_t* VP8BitWriterBuf(const VP8BitWriter* const bw) { |
+// Returns a pointer to the internal buffer. |
+static WEBP_INLINE uint8_t* VP8BitWriterBuf(const VP8BitWriter* const bw) { |
return bw->buf_; |
} |
-static inline size_t VP8BitWriterSize(const VP8BitWriter* const bw) { |
+// Returns the size of the internal buffer. |
+static WEBP_INLINE size_t VP8BitWriterSize(const VP8BitWriter* const bw) { |
return bw->pos_; |
} |
//------------------------------------------------------------------------------ |
+// VP8LBitWriter |
+// TODO(vikasa): VP8LBitWriter is copied as-is from lossless code. There's scope |
+// of re-using VP8BitWriter. Will evaluate once basic lossless encoder is |
+// implemented. |
+ |
+typedef struct { |
+ uint8_t* buf_; |
+ size_t bit_pos_; |
+ size_t max_bytes_; |
+ |
+ // After all bits are written, the caller must observe the state of |
+ // error_. A value of 1 indicates that a memory allocation failure |
+ // has happened during bit writing. A value of 0 indicates successful |
+ // writing of bits. |
+ int error_; |
+} VP8LBitWriter; |
+ |
+static WEBP_INLINE size_t VP8LBitWriterNumBytes(VP8LBitWriter* const bw) { |
+ return (bw->bit_pos_ + 7) >> 3; |
+} |
+ |
+static WEBP_INLINE uint8_t* VP8LBitWriterFinish(VP8LBitWriter* const bw) { |
+ return bw->buf_; |
+} |
+ |
+// Returns 0 in case of memory allocation error. |
+int VP8LBitWriterInit(VP8LBitWriter* const bw, size_t expected_size); |
+ |
+void VP8LBitWriterDestroy(VP8LBitWriter* const bw); |
+ |
+// This function writes bits into bytes in increasing addresses, and within |
+// a byte least-significant-bit first. |
+// |
+// The function can write up to 16 bits in one go with WriteBits |
+// Example: let's assume that 3 bits (Rs below) have been written already: |
+// |
+// BYTE-0 BYTE+1 BYTE+2 |
+// |
+// 0000 0RRR 0000 0000 0000 0000 |
+// |
+// Now, we could write 5 or less bits in MSB by just sifting by 3 |
+// and OR'ing to BYTE-0. |
+// |
+// For n bits, we take the last 5 bytes, OR that with high bits in BYTE-0, |
+// and locate the rest in BYTE+1 and BYTE+2. |
+// |
+// VP8LBitWriter's error_ flag is set in case of memory allocation error. |
+void VP8LWriteBits(VP8LBitWriter* const bw, int n_bits, uint32_t bits); |
+ |
+//------------------------------------------------------------------------------ |
#if defined(__cplusplus) || defined(c_plusplus) |
} // extern "C" |