15#ifndef DRACO_COMPRESSION_ENTROPY_RANS_SYMBOL_ENCODER_H_
16#define DRACO_COMPRESSION_ENTROPY_RANS_SYMBOL_ENCODER_H_
32template <
int unique_symbols_bit_length_t>
36 : num_symbols_(0), num_expected_bits_(0), buffer_offset_(0) {}
40 bool Create(
const uint64_t *frequencies,
int num_symbols,
45 ans_.rans_write(&probability_table_[symbol]);
58 struct ProbabilityLess {
59 explicit ProbabilityLess(
const std::vector<rans_sym> *probs)
60 : probabilities(probs) {}
61 bool operator()(
int i,
int j)
const {
62 return probabilities->at(i).prob < probabilities->at(j).prob;
64 const std::vector<rans_sym> *probabilities;
68 bool EncodeTable(EncoderBuffer *buffer);
70 static constexpr int rans_precision_bits_ =
72 unique_symbols_bit_length_t);
73 static constexpr int rans_precision_ = 1 << rans_precision_bits_;
75 std::vector<rans_sym> probability_table_;
77 uint32_t num_symbols_;
79 uint64_t num_expected_bits_;
81 RAnsEncoder<rans_precision_bits_> ans_;
83 uint64_t buffer_offset_;
86template <
int unique_symbols_bit_length_t>
88 const uint64_t *frequencies,
int num_symbols,
EncoderBuffer *buffer) {
90 uint64_t total_freq = 0;
91 int max_valid_symbol = 0;
92 for (
int i = 0; i < num_symbols; ++i) {
93 total_freq += frequencies[i];
94 if (frequencies[i] > 0) {
98 num_symbols = max_valid_symbol + 1;
99 num_symbols_ = num_symbols;
100 probability_table_.resize(num_symbols);
101 const double total_freq_d =
static_cast<double>(total_freq);
102 const double rans_precision_d =
static_cast<double>(rans_precision_);
106 int total_rans_prob = 0;
107 for (
int i = 0; i < num_symbols; ++i) {
108 const uint64_t freq = frequencies[i];
111 const double prob =
static_cast<double>(freq) / total_freq_d;
114 uint32_t rans_prob =
static_cast<uint32_t
>(prob * rans_precision_d + 0.5f);
115 if (rans_prob == 0 && freq > 0) {
118 probability_table_[i].prob = rans_prob;
119 total_rans_prob += rans_prob;
123 if (total_rans_prob != rans_precision_) {
124 std::vector<int> sorted_probabilities(num_symbols);
125 for (
int i = 0; i < num_symbols; ++i) {
126 sorted_probabilities[i] = i;
128 std::stable_sort(sorted_probabilities.begin(), sorted_probabilities.end(),
129 ProbabilityLess(&probability_table_));
130 if (total_rans_prob < rans_precision_) {
133 probability_table_[sorted_probabilities.back()].prob +=
134 rans_precision_ - total_rans_prob;
138 int32_t
error = total_rans_prob - rans_precision_;
140 const double act_total_prob_d =
static_cast<double>(total_rans_prob);
141 const double act_rel_error_d = rans_precision_d / act_total_prob_d;
142 for (
int j = num_symbols - 1; j > 0; --j) {
143 int symbol_id = sorted_probabilities[j];
144 if (probability_table_[symbol_id].prob <= 1) {
145 if (j == num_symbols - 1) {
150 const int32_t new_prob =
static_cast<int32_t
>(
151 floor(act_rel_error_d *
152 static_cast<double>(probability_table_[symbol_id].prob)));
153 int32_t fix = probability_table_[symbol_id].prob - new_prob;
157 if (fix >=
static_cast<int32_t
>(probability_table_[symbol_id].prob)) {
158 fix = probability_table_[symbol_id].prob - 1;
163 probability_table_[symbol_id].prob -= fix;
164 total_rans_prob -= fix;
166 if (total_rans_prob == rans_precision_) {
175 uint32_t total_prob = 0;
176 for (
int i = 0; i < num_symbols; ++i) {
177 probability_table_[i].cum_prob = total_prob;
178 total_prob += probability_table_[i].prob;
180 if (total_prob != rans_precision_) {
190 for (
int i = 0; i < num_symbols; ++i) {
191 if (probability_table_[i].prob == 0) {
194 const double norm_prob =
195 static_cast<double>(probability_table_[i].prob) / rans_precision_d;
196 num_bits +=
static_cast<double>(frequencies[i]) * log2(norm_prob);
198 num_expected_bits_ =
static_cast<uint64_t
>(ceil(-num_bits));
199 if (!EncodeTable(buffer)) {
205template <
int unique_symbols_bit_length_t>
206bool RAnsSymbolEncoder<unique_symbols_bit_length_t>::EncodeTable(
211 for (uint32_t i = 0; i < num_symbols_; ++i) {
212 const uint32_t prob = probability_table_[i].prob;
213 int num_extra_bytes = 0;
214 if (prob >= (1 << 6)) {
216 if (prob >= (1 << 14)) {
218 if (prob >= (1 << 22)) {
230 for (; offset < (1 << 6) - 1; ++offset) {
234 const uint32_t next_prob = probability_table_[i + offset + 1].prob;
239 buffer->
Encode(
static_cast<uint8_t
>((offset << 2) | 3));
243 buffer->
Encode(
static_cast<uint8_t
>((prob << 2) | (num_extra_bytes & 3)));
245 for (
int b = 0; b < num_extra_bytes; ++b) {
246 buffer->
Encode(
static_cast<uint8_t
>(prob >> (8 * (b + 1) - 2)));
253template <
int unique_symbols_bit_length_t>
257 const uint64_t required_bits = 2 * num_expected_bits_ + 32;
259 buffer_offset_ = buffer->
size();
260 const int64_t required_bytes = (required_bits + 7) / 8;
261 buffer->
Resize(buffer_offset_ + required_bytes +
sizeof(buffer_offset_));
262 uint8_t *
const data =
263 reinterpret_cast<uint8_t *
>(
const_cast<char *
>(buffer->
data()));
264 ans_.write_init(
data + buffer_offset_);
267template <
int unique_symbols_bit_length_t>
270 char *
const src =
const_cast<char *
>(buffer->
data()) + buffer_offset_;
274 const uint64_t bytes_written =
static_cast<uint64_t
>(ans_.write_end());
277 const uint32_t size_len =
static_cast<uint32_t
>(var_size_buffer.
size());
278 char *
const dst =
src + size_len;
279 memmove(dst,
src, bytes_written);
282 memcpy(
src, var_size_buffer.
data(), size_len);
285 buffer->
Resize(buffer_offset_ + bytes_written + size_len);
void floor(const FCube &pos, FLine &l1, FLine &l2, FLine &l3, FLine &l4, FPlane &pl, FaceStore &s)
Definition Functions.cc:95
void error(std::string err, std::string fail_reason)
Definition check.cc:18
Definition encoder_buffer.h:29
void Resize(int64_t nbytes)
Definition encoder_buffer.cc:31
bool Encode(const T &data)
Definition encoder_buffer.h:60
size_t size() const
Definition encoder_buffer.h:79
const char * data() const
Definition encoder_buffer.h:78
void EndEncoding(EncoderBuffer *buffer)
Definition rans_symbol_encoder.h:268
static constexpr bool needs_reverse_encoding()
Definition rans_symbol_encoder.h:50
RAnsSymbolEncoder()
Definition rans_symbol_encoder.h:35
void EncodeSymbol(uint32_t symbol)
Definition rans_symbol_encoder.h:44
void StartEncoding(EncoderBuffer *buffer)
Definition rans_symbol_encoder.h:254
bool Create(const uint64_t *frequencies, int num_symbols, EncoderBuffer *buffer)
Definition rans_symbol_encoder.h:87
lazy data
Definition meshpage.php:1583
tag src
Definition meshpage.php:1786
Definition attribute_octahedron_transform.cc:21
constexpr int ComputeRAnsPrecisionFromUniqueSymbolsBitLength(int symbols_bit_length)
Definition rans_symbol_coding.h:32
bool EncodeVarint(IntTypeT val, EncoderBuffer *out_buffer)
Definition varint_encoding.h:28