15#ifndef DRACO_COMPRESSION_ENTROPY_RANS_SYMBOL_DECODER_H_
16#define DRACO_COMPRESSION_ENTROPY_RANS_SYMBOL_DECODER_H_
30template <
int unique_symbols_bit_length_t>
47 static constexpr int rans_precision_bits_ =
49 unique_symbols_bit_length_t);
50 static constexpr int rans_precision_ = 1 << rans_precision_bits_;
52 std::vector<uint32_t> probability_table_;
53 uint32_t num_symbols_;
57template <
int unique_symbols_bit_length_t>
65#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
67 if (!buffer->
Decode(&num_symbols_)) {
85 probability_table_.resize(num_symbols_);
86 if (num_symbols_ == 0) {
90 for (uint32_t i = 0; i < num_symbols_; ++i) {
91 uint8_t prob_data = 0;
94 if (!buffer->
Decode(&prob_data)) {
101 const int token = prob_data & 3;
103 const uint32_t offset = prob_data >> 2;
104 if (i + offset >= num_symbols_) {
108 for (uint32_t j = 0; j < offset + 1; ++j) {
109 probability_table_[i + j] = 0;
113 const int extra_bytes = token;
114 uint32_t prob = prob_data >> 2;
115 for (
int b = 0; b < extra_bytes; ++b) {
117 if (!buffer->
Decode(&eb)) {
122 prob |=
static_cast<uint32_t
>(eb) << (8 * (b + 1) - 2);
124 probability_table_[i] = prob;
127 if (!ans_.rans_build_look_up_table(&probability_table_[0], num_symbols_)) {
133template <
int unique_symbols_bit_length_t>
136 uint64_t bytes_encoded;
138#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
140 if (!buffer->
Decode(&bytes_encoded)) {
151 if (bytes_encoded >
static_cast<uint64_t
>(buffer->
remaining_size())) {
154 const uint8_t *
const data_head =
155 reinterpret_cast<const uint8_t *
>(buffer->
data_head());
157 buffer->
Advance(bytes_encoded);
158 if (ans_.read_init(data_head,
static_cast<int>(bytes_encoded)) != 0) {
164template <
int unique_symbols_bit_length_t>
Definition decoder_buffer.h:30
void Advance(int64_t bytes)
Definition decoder_buffer.h:105
const char * data_head() const
Definition decoder_buffer.h:114
uint16_t bitstream_version() const
Definition decoder_buffer.h:120
bool Decode(T *out_val)
Definition decoder_buffer.h:68
int64_t remaining_size() const
Definition decoder_buffer.h:115
uint32_t DecodeSymbol()
Definition rans_symbol_decoder.h:43
uint32_t num_symbols() const
Definition rans_symbol_decoder.h:38
RAnsSymbolDecoder()
Definition rans_symbol_decoder.h:33
void EndDecoding()
Definition rans_symbol_decoder.h:165
bool StartDecoding(DecoderBuffer *buffer)
Definition rans_symbol_decoder.h:134
bool Create(DecoderBuffer *buffer)
Definition rans_symbol_decoder.h:58
#define DRACO_BITSTREAM_VERSION(MAJOR, MINOR)
Definition macros.h:114
Definition attribute_octahedron_transform.cc:21
bool DecodeVarint(IntTypeT *out_val, DecoderBuffer *buffer)
Definition varint_decoding.h:63
constexpr int ComputeRAnsPrecisionFromUniqueSymbolsBitLength(int symbols_bit_length)
Definition rans_symbol_coding.h:32