20#ifndef DRACO_COMPRESSION_POINT_CLOUD_ALGORITHMS_INTEGER_POINTS_KD_TREE_DECODER_H_
21#define DRACO_COMPRESSION_POINT_CLOUD_ALGORITHMS_INTEGER_POINTS_KD_TREE_DECODER_H_
38template <
int compression_level_t>
91template <
class Po
intDiT,
int compression_level_t>
96 typedef typename Policy::NumbersDecoder NumbersDecoder;
97 typedef typename Policy::AxisDecoder AxisDecoder;
98 typedef typename Policy::HalfDecoder HalfDecoder;
99 typedef typename Policy::RemainingBitsDecoder RemainingBitsDecoder;
105 template <
class OutputIteratorT>
113 uint32_t GetAxis(uint32_t num_remaining_points,
const PointDiT &base,
114 std::array<uint32_t, D> levels, uint32_t last_axis);
116 template <
class OutputIteratorT>
117 void DecodeInternal(uint32_t num_remaining_points, PointDiT base,
118 std::array<uint32_t, D> levels, uint32_t last_axis,
119 OutputIteratorT oit);
121 void DecodeNumber(
int nbits, uint32_t *value) {
122 numbers_decoder_.DecodeLeastSignificantBits32(nbits, value);
125 struct DecodingStatus {
127 uint32_t num_remaining_points_,
const PointDiT &old_base_,
128 std::array<uint32_t, PointTraits<PointDiT>::Dimension()> levels_,
130 : num_remaining_points(num_remaining_points_),
133 last_axis(last_axis_) {}
135 uint32_t num_remaining_points;
137 std::array<uint32_t, D> levels;
139 friend bool operator<(
const DecodingStatus &l,
const DecodingStatus &r) {
140 return l.num_remaining_points < r.num_remaining_points;
144 uint32_t bit_length_;
145 uint32_t num_points_;
146 NumbersDecoder numbers_decoder_;
147 RemainingBitsDecoder remaining_bits_decoder_;
148 AxisDecoder axis_decoder_;
149 HalfDecoder half_decoder_;
153template <
class Po
intDiT,
int compression_level_t>
154template <
class OutputIteratorT>
157 if (!buffer->
Decode(&bit_length_)) {
160 if (!buffer->
Decode(&num_points_)) {
163 if (num_points_ == 0) {
167 if (!numbers_decoder_.StartDecoding(buffer)) {
170 if (!remaining_bits_decoder_.StartDecoding(buffer)) {
173 if (!axis_decoder_.StartDecoding(buffer)) {
176 if (!half_decoder_.StartDecoding(buffer)) {
183 numbers_decoder_.EndDecoding();
184 remaining_bits_decoder_.EndDecoding();
185 axis_decoder_.EndDecoding();
186 half_decoder_.EndDecoding();
191template <
class Po
intDiT,
int compression_level_t>
192uint32_t IntegerPointsKdTreeDecoder<PointDiT, compression_level_t>::GetAxis(
193 uint32_t num_remaining_points,
const PointDiT & ,
194 std::array<uint32_t, D> levels, uint32_t last_axis) {
195 if (!Policy::select_axis) {
199 uint32_t best_axis = 0;
200 if (num_remaining_points < 64) {
201 for (uint32_t axis = 1; axis <
D; ++axis) {
202 if (levels[best_axis] > levels[axis]) {
207 axis_decoder_.DecodeLeastSignificantBits32(4, &best_axis);
213template <
class Po
intDiT,
int compression_level_t>
214template <
class OutputIteratorT>
215void IntegerPointsKdTreeDecoder<PointDiT, compression_level_t>::DecodeInternal(
216 uint32_t num_remaining_points, PointDiT old_base,
217 std::array<uint32_t, D> levels, uint32_t last_axis, OutputIteratorT oit) {
218 DecodingStatus init_status(num_remaining_points, old_base, levels, last_axis);
219 typename Policy::template QueuingStrategy<DecodingStatus> status_q;
220 status_q.push(init_status);
222 while (!status_q.empty()) {
223 const DecodingStatus status = status_q.front();
226 num_remaining_points = status.num_remaining_points;
227 old_base = status.old_base;
228 levels = status.levels;
229 last_axis = status.last_axis;
231 const uint32_t axis =
232 GetAxis(num_remaining_points, old_base, levels, last_axis);
234 const uint32_t level = levels[axis];
237 if ((bit_length_ - level) == 0) {
238 for (
int i = 0; i < static_cast<int>(num_remaining_points); i++) {
245 if (num_remaining_points <= 2) {
246 std::array<uint32_t, D> axes;
248 for (
int i = 1; i < D; i++) {
252 std::array<uint32_t, D> num_remaining_bits;
253 for (
int i = 0; i < D; i++) {
254 num_remaining_bits[i] = bit_length_ - levels[axes[i]];
257 for (uint32_t i = 0; i < num_remaining_points; ++i) {
260 for (
int j = 0; j < static_cast<int>(D); j++) {
261 if (num_remaining_bits[j]) {
262 remaining_bits_decoder_.DecodeLeastSignificantBits32(
263 num_remaining_bits[j], &p[axes[j]]);
265 p[axes[j]] = old_base[axes[j]] | p[axes[j]];
272 const int num_remaining_bits = bit_length_ - level;
273 const uint32_t modifier = 1 << (num_remaining_bits - 1);
274 PointDiT new_base(old_base);
275 new_base[axis] += modifier;
280 DecodeNumber(incoming_bits, &number);
282 uint32_t first_half = num_remaining_points / 2 - number;
283 uint32_t second_half = num_remaining_points - first_half;
285 if (first_half != second_half) {
286 if (!half_decoder_.DecodeNextBit()) {
287 std::swap(first_half, second_half);
293 status_q.push(DecodingStatus(first_half, old_base, levels, axis));
296 status_q.push(DecodingStatus(second_half, new_base, levels, axis));
Definition decoder_buffer.h:30
bool Decode(T *out_val)
Definition decoder_buffer.h:68
Definition direct_bit_decoder.h:25
Definition folded_integer_bit_decoder.h:27
Definition integer_points_kd_tree_decoder.h:92
bool DecodePoints(DecoderBuffer *buffer, OutputIteratorT oit)
Definition integer_points_kd_tree_decoder.h:155
IntegerPointsKdTreeDecoder()
Definition integer_points_kd_tree_decoder.h:102
Definition point_cloud_types.h:49
Definition queuing_policy.h:57
Definition queuing_policy.h:27
Definition rans_bit_decoder.h:28
Definition queuing_policy.h:42
#define DRACO_DCHECK_EQ(a, b)
Definition macros.h:81
#define DRACO_INCREMENT_MOD(I, M)
Definition math_utils.h:24
Definition attribute_octahedron_transform.cc:21
int MostSignificantBit(uint32_t n)
Definition bit_utils.h:58
DirectBitDecoder AxisDecoder
Definition integer_points_kd_tree_decoder.h:46
Stack< T > QueuingStrategy
Definition integer_points_kd_tree_decoder.h:52
DirectBitDecoder NumbersDecoder
Definition integer_points_kd_tree_decoder.h:45
DirectBitDecoder HalfDecoder
Definition integer_points_kd_tree_decoder.h:47
static constexpr bool select_axis
Definition integer_points_kd_tree_decoder.h:49
DirectBitDecoder RemainingBitsDecoder
Definition integer_points_kd_tree_decoder.h:48
PriorityQueue< T > QueuingStrategy
Definition integer_points_kd_tree_decoder.h:85
RAnsBitDecoder NumbersDecoder
Definition integer_points_kd_tree_decoder.h:58
FoldedBit32Decoder< RAnsBitDecoder > NumbersDecoder
Definition integer_points_kd_tree_decoder.h:64
static constexpr bool select_axis
Definition integer_points_kd_tree_decoder.h:70
Queue< T > QueuingStrategy
Definition integer_points_kd_tree_decoder.h:78
FoldedBit32Decoder< AdaptiveRAnsBitDecoder > NumbersDecoder
Definition integer_points_kd_tree_decoder.h:76
Definition integer_points_kd_tree_decoder.h:41