15#ifndef DRACO_CORE_DECODER_BUFFER_H_
16#define DRACO_CORE_DECODER_BUFFER_H_
40 void Init(
const char *
data,
size_t data_size);
43 void Init(
const char *
data,
size_t data_size, uint16_t version);
61 return bit_decoder_.GetBits(nbits, out_value);
76 bool Decode(
void *out_data,
size_t size_to_decode) {
77 if (data_size_ <
static_cast<int64_t
>(pos_ + size_to_decode)) {
80 memcpy(out_data, (data_ + pos_), size_to_decode);
81 pos_ += size_to_decode;
88 const size_t size_to_decode =
sizeof(
T);
89 if (data_size_ <
static_cast<int64_t
>(pos_ + size_to_decode)) {
92 memcpy(out_val, (data_ + pos_), size_to_decode);
96 bool Peek(
void *out_data,
size_t size_to_peek) {
97 if (data_size_ <
static_cast<int64_t
>(pos_ + size_to_peek)) {
100 memcpy(out_data, (data_ + pos_), size_to_peek);
105 void Advance(int64_t bytes) { pos_ += bytes; }
130 inline void reset(
const void *b,
size_t s) {
132 bit_buffer_ =
static_cast<const uint8_t *
>(b);
133 bit_buffer_end_ = bit_buffer_ + s;
137 inline uint64_t BitsDecoded()
const {
138 return static_cast<uint64_t
>(bit_offset_);
142 inline uint64_t AvailBits()
const {
143 return ((bit_buffer_end_ - bit_buffer_) * 8) - bit_offset_;
146 inline uint32_t EnsureBits(
int k) {
151 for (
int i = 0; i < k; ++i) {
152 buf |= PeekBit(i) << i;
157 inline void ConsumeBits(
int k) { bit_offset_ += k; }
160 inline bool GetBits(uint32_t nbits, uint32_t *x) {
165 for (uint32_t bit = 0; bit < nbits; ++bit) {
166 value |= GetBit() << bit;
175 inline int GetBit() {
176 const size_t off = bit_offset_;
177 const size_t byte_offset = off >> 3;
178 const int bit_shift =
static_cast<int>(off & 0x7);
179 if (bit_buffer_ + byte_offset < bit_buffer_end_) {
180 const int bit = (bit_buffer_[byte_offset] >> bit_shift) & 1;
181 bit_offset_ = off + 1;
187 inline int PeekBit(
int offset) {
188 const size_t off = bit_offset_ + offset;
189 const size_t byte_offset = off >> 3;
190 const int bit_shift =
static_cast<int>(off & 0x7);
191 if (bit_buffer_ + byte_offset < bit_buffer_end_) {
192 const int bit = (bit_buffer_[byte_offset] >> bit_shift) & 1;
198 const uint8_t *bit_buffer_;
199 const uint8_t *bit_buffer_end_;
209 BitDecoder bit_decoder_;
211 uint16_t bitstream_version_;
DecoderBuffer & operator=(const DecoderBuffer &buf)=default
void Init(const char *data, size_t data_size)
Definition decoder_buffer.cc:29
friend class BufferBitCodingTest
Definition decoder_buffer.h:202
void Advance(int64_t bytes)
Definition decoder_buffer.h:105
const char * data_head() const
Definition decoder_buffer.h:114
bool StartBitDecoding(bool decode_size, uint64_t *out_size)
Definition decoder_buffer.cc:40
bool Decode(void *out_data, size_t size_to_decode)
Definition decoder_buffer.h:76
uint16_t bitstream_version() const
Definition decoder_buffer.h:120
DecoderBuffer()
Definition decoder_buffer.cc:22
void StartDecodingFrom(int64_t offset)
Definition decoder_buffer.h:109
DecoderBuffer(const DecoderBuffer &buf)=default
bool Decode(T *out_val)
Definition decoder_buffer.h:68
void EndBitDecoding()
Definition decoder_buffer.cc:60
bool bit_decoder_active() const
Definition decoder_buffer.h:117
int64_t remaining_size() const
Definition decoder_buffer.h:115
bool Peek(T *out_val)
Definition decoder_buffer.h:87
bool DecodeLeastSignificantBits32(uint32_t nbits, uint32_t *out_value)
Definition decoder_buffer.h:57
bool Peek(void *out_data, size_t size_to_peek)
Definition decoder_buffer.h:96
void set_bitstream_version(uint16_t version)
Definition decoder_buffer.h:111
int64_t decoded_size() const
Definition decoder_buffer.h:116
#define DRACO_DCHECK_LE(a, b)
Definition macros.h:85
lazy data
Definition meshpage.php:1583
Definition attribute_octahedron_transform.cc:21