Update bitstream spec

This PR is associated with #134.
This commit is contained in:
Frank Galligan 2017-07-22 22:35:54 -07:00
parent ee618da82e
commit 4efc3d27cc
15 changed files with 118 additions and 83 deletions

View File

@ -5,7 +5,7 @@
~~~~~ ~~~~~
DecodeAttributesDecoderData(buffer) { DecodeAttributesDecoderData(buffer) {
num_attributes I32 num_attributes varUI32
point_attribute_ids_.resize(num_attributes); point_attribute_ids_.resize(num_attributes);
for (i = 0; i < num_attributes; ++i) { for (i = 0; i < num_attributes; ++i) {
att_type UI8 att_type UI8

View File

@ -5,8 +5,11 @@
~~~~~ ~~~~~
Decode() { Decode() {
DecodeHeader() DecodeHeader()
if (flags & METADATA_FLAG_MASK)
DecodeGeometryMetadata(metadata)
DecodeConnectivityData() DecodeConnectivityData()
DecodeAttributeData()} DecodeAttributeData()
}
~~~~~ ~~~~~
{:.draco-syntax} {:.draco-syntax}

View File

@ -1,31 +1,22 @@
## EdgeBreaker Decoder ## EdgeBreaker Decoder
### InitializeDecoder() ### DecodeConnectivityData()
~~~~~ ~~~~~
InitializeDecoder() { DecodeConnectivityData() {
edgebreaker_decoder_type UI8 edgebreaker_traversal_type UI8
} num_new_verts varUI32
~~~~~ num_encoded_vertices varUI32
{:.draco-syntax } num_faces varUI32
### DecodeConnectivity()
~~~~~
DecodeConnectivity() {
num_new_verts UI32
num_encoded_vertices UI32
num_faces UI32
num_attribute_data I8 num_attribute_data I8
num_encoded_symbols UI32 num_encoded_symbols varUI32
num_encoded_split_symbols UI32 num_encoded_split_symbols varUI32
encoded_connectivity_size UI32 encoded_connectivity_size varUI32
// file pointer must be set to current position // file pointer must be set to current position
// + encoded_connectivity_size // + encoded_connectivity_size
hole_and_split_bytes = DecodeHoleAndTopologySplitEvents() hole_and_split_bytes = DecodeHoleAndTopologySplitEvents()
// file pointer must be set to old current position // file pointer must be set to old current position
EdgeBreakerTraversalValence_Start() EdgeBreakerTraversalValence_Start(num_encoded_vertices)
DecodeConnectivity(num_symbols) DecodeConnectivity(num_symbols)
if (attribute_data_.size() > 0) { if (attribute_data_.size() > 0) {
for (ci = 0; ci < corner_table_->num_corners(); ci += 3) { for (ci = 0; ci < corner_table_->num_corners(); ci += 3) {
@ -39,11 +30,12 @@ DecodeConnectivity() {
} }
// Decode attribute connectivity. // Decode attribute connectivity.
for (uint32_t i = 0; i < attribute_data_.size(); ++i) { for (uint32_t i = 0; i < attribute_data_.size(); ++i) {
attribute_data_[i].connectivity_data.InitEmpty(corner_table_.get()); attribute_data_[i].connectivity_data.InitEmpty(corner_table_);
for (int32_t c : attribute_data_[i].attribute_seam_corners) { for (int32_t c : attribute_data_[i].attribute_seam_corners) {
attribute_data_[i].connectivity_data.AddSeamEdge(c); attribute_data_[i].connectivity_data.AddSeamEdge(c);
} }
attribute_data_[i].connectivity_data.RecomputeVertices(nullptr, nullptr); attribute_data_[i].connectivity_data.RecomputeVertices(nullptr,
nullptr);
} }
// Preallocate vertex to value mapping // Preallocate vertex to value mapping
AssignPointsToCorners() AssignPointsToCorners()
@ -83,7 +75,8 @@ AssignPointsToCorners() {
act_c = corner_table_->SwingRight(c); act_c = corner_table_->SwingRight(c);
seam_found = false; seam_found = false;
while (act_c != c) { while (act_c != c) {
if (attribute_data_[i].connectivity_data.Vertex(act_c) != vert_id) { if (attribute_data_[i].connectivity_data.Vertex(act_c) !=
vert_id) {
deduplication_first_corner = act_c; deduplication_first_corner = act_c;
seam_found = true; seam_found = true;
break; break;
@ -165,7 +158,8 @@ DecodeConnectivity(num_symbols) {
} else { } else {
new_active_corner = corner_table_->Previous(act_top_corner); new_active_corner = corner_table_->Previous(act_top_corner);
} }
decoder_split_symbol_id = num_symbols - encoder_split_symbol_id - 1; decoder_split_symbol_id = num_symbols -
encoder_split_symbol_id - 1;
topology_split_active_corners[decoder_split_symbol_id] = topology_split_active_corners[decoder_split_symbol_id] =
new_active_corner; new_active_corner;
} }
@ -186,7 +180,6 @@ DecodeConnectivity(num_symbols) {
init_corners_.push_back(corner); init_corners_.push_back(corner);
} }
} }
Return num_vertices;
} }
~~~~~ ~~~~~
{:.draco-syntax } {:.draco-syntax }

View File

@ -6,22 +6,22 @@
~~~~~ ~~~~~
DecodeHoleAndTopologySplitEvents() { DecodeHoleAndTopologySplitEvents() {
num_topologoy_splits UI32 num_topologoy_splits varUI32
source_symbol_id = 0 source_symbol_id = 0
for (i = 0; i < num_topologoy_splits; ++i) { for (i = 0; i < num_topologoy_splits; ++i) {
DecodeVarint<UI32>(&delta) delta varUI32
split_data[i].source_symbol_id = delta + source_symbol_id split_data[i].source_symbol_id = delta + source_symbol_id
DecodeVarint<UI32>(&delta) delta varUI32
split_data[i].split_symbol_id = source_symbol_id - delta split_data[i].split_symbol_id = source_symbol_id - delta
} }
for (i = 0; i < num_topologoy_splits; ++i) { for (i = 0; i < num_topologoy_splits; ++i) {
split_data[i].split_edge bits1 split_data[i].split_edge bits1
split_data[i].source_edge bits1 split_data[i].source_edge bits1
} }
num_hole_events UI32 num_hole_events varUI32
symbol_id = 0 symbol_id = 0
for (i = 0; i < num_hole_events; ++i) { for (i = 0; i < num_hole_events; ++i) {
DecodeVarint<UI32>(&delta) delta varUI32
hole_data[i].symbol_id = delta + symbol_id hole_data[i].symbol_id = delta + symbol_id
} }
return bytes_decoded; return bytes_decoded;

View File

@ -9,10 +9,10 @@ EdgebreakerTraversal_Start() {
symbol_buffer_ size * UI8 symbol_buffer_ size * UI8
size UI64 size UI64
start_face_buffer_ size * UI8 start_face_buffer_ size * UI8
if (num_attribute_data_ > 0) { if (num_attribute_data > 0) {
attribute_connectivity_decoders_ = std::unique_ptr<BinaryDecoder[]>( attribute_connectivity_decoders_ =
new BinaryDecoder[num_attribute_data_]); new BinaryDecoder[num_attribute_data]
for (i = 0; i < num_attribute_data_; ++i) { for (i = 0; i < num_attribute_data; ++i) {
attribute_connectivity_decoders_[i].StartDecoding() attribute_connectivity_decoders_[i].StartDecoding()
// RansBitDecoder_StartDecoding // RansBitDecoder_StartDecoding
} }

View File

@ -4,24 +4,22 @@
### EdgeBreakerTraversalValence_Start() ### EdgeBreakerTraversalValence_Start()
~~~~~ ~~~~~
EdgeBreakerTraversalValence_Start(num_vertices, num_attribute_data) { EdgeBreakerTraversalValence_Start(traversal_num_vertices) {
out_buffer = EdgebreakerTraversal_Start() EdgebreakerTraversal_Start()
num_split_symbols I32 num_split_symbols varUI32
mode == 0 I8 mode == 0 I8
num_vertices_ += num_split_symbols traversal_num_vertices += num_split_symbols
vertex_valences_ init to 0 vertex_valences_ init to 0
vertex_valences_.resize(num_vertices_, 0);
min_valence_ = 2; min_valence_ = 2;
max_valence_ = 7; max_valence_ = 7;
num_unique_valences = 6 (max_valence_ - min_valence_ + 1) num_unique_valences = 6 (max_valence_ - min_valence_ + 1)
for (i = 0; i < num_unique_valences; ++i) { for (i = 0; i < num_unique_valences; ++i) {
DecodeVarint<UI32>(&num_symbols, out_buffer) num_symbols varUI32
If (num_symbols > 0) { if (num_symbols > 0) {
DecodeSymbols(num_symbols, out_buffer, &context_symbols_[i]) DecodeSymbols(num_symbols, context_symbols_[i])
} }
context_counters_[i] = num_symbols context_counters_[i] = num_symbols
} }
return out_buffer;
} }
~~~~~ ~~~~~
{:.draco-syntax } {:.draco-syntax }

View File

@ -17,6 +17,7 @@ version_date: Released 2017-xx-xx
{% include_relative 03.00.00.symbols.md %} {% include_relative 03.00.00.symbols.md %}
{% include_relative 04.00.00.conventions.md %} {% include_relative 04.00.00.conventions.md %}
{% include_relative draco.decoder.md %} {% include_relative draco.decoder.md %}
{% include_relative metadata.decoder.md %}
{% include_relative mesh.decoder.md %} {% include_relative mesh.decoder.md %}
{% include_relative edgebreaker.decoder.md %} {% include_relative edgebreaker.decoder.md %}
{% include_relative edgebreaker.hole.and.topology.md %} {% include_relative edgebreaker.hole.and.topology.md %}
@ -40,7 +41,7 @@ version_date: Released 2017-xx-xx
{% include_relative rans.decoding.md %} {% include_relative rans.decoding.md %}
{% include_relative rans.bit.decoder.md %} {% include_relative rans.bit.decoder.md %}
{% include_relative core.functions.md %} {% include_relative core.functions.md %}
{% include_relative variable.descriptions.md %}
{% comment %} {% comment %}
{% include_relative 99.00.01.testing.md %} {% include_relative 99.00.01.testing.md %}

View File

@ -1,11 +1,2 @@
## Mesh Decoder ## Mesh Decoder
### DecodeConnectivityData()
~~~~~
DecodeConnectivityData()
InitializeDecoder()
DecodeConnectivity()
}
~~~~~
{:.draco-syntax }

View File

@ -7,7 +7,7 @@
Decode(...) { Decode(...) {
this->transform().InitializeDecoding(num_components); this->transform().InitializeDecoding(num_components);
// restore the first value // restore the first value
this->transform().ComputeOriginalValue(pred_vals.get(), this->transform().ComputeOriginalValue(pred_vals,
in_corr, out_data, 0); in_corr, out_data, 0);
// PredictionSchemeWrapTransform_ComputeOriginalValue() // PredictionSchemeWrapTransform_ComputeOriginalValue()
corner_map_size = this->mesh_data().data_to_corner_map()->size(); corner_map_size = this->mesh_data().data_to_corner_map()->size();
@ -16,14 +16,14 @@ Decode(...) {
dst_offset = p * num_components; dst_offset = p * num_components;
b= ComputeParallelogramPrediction(p, corner_id, table, b= ComputeParallelogramPrediction(p, corner_id, table,
*vertex_to_data_map, out_data, *vertex_to_data_map, out_data,
num_components, pred_vals.get()) num_components, pred_vals)
if (!b) { if (!b) {
src_offset = (p - 1) * num_components; src_offset = (p - 1) * num_components;
this->transform().ComputeOriginalValue(out_data + src_offset, in_corr, this->transform().ComputeOriginalValue(out_data + src_offset, in_corr,
out_data + dst_offset, dst_offset); out_data + dst_offset, dst_offset);
// PredictionSchemeWrapTransform_ComputeOriginalValue() // PredictionSchemeWrapTransform_ComputeOriginalValue()
} else { } else {
this->transform().ComputeOriginalValue(pred_vals.get(), in_corr, this->transform().ComputeOriginalValue(pred_vals, in_corr,
out_data + dst_offset, dst_offset); out_data + dst_offset, dst_offset);
// PredictionSchemeWrapTransform_ComputeOriginalValue() // PredictionSchemeWrapTransform_ComputeOriginalValue()
} }

View File

@ -0,0 +1,52 @@
## Metadata Decoder
### DecodeGeometryMetadata()
~~~~~
DecodeGeometryMetadata(metadata) {
num_att_metadata varUI32
for (i = 0; i < num_att_metadata; ++i) {
att_id varUI32
att_metadata = new AttributeMetadata(att_id)
DecodeMetadata(att_metadata)
metadata.att_metadata.push_back(att_metadata)
}
DecodeMetadata(metadata)
}
~~~~~
{:.draco-syntax}
### DecodeMetadata()
~~~~~
DecodeMetadata(metadata) {
num_entries varUI32
for (i = 0; i < num_entries; ++i) {
DecodeEntry(metadata)
}
num_sub_metadata varUI32
for (i = 0; i < num_sub_metadata; ++i) {
size UI8
name size * UI8
temp_metadata = new Metadata()
DecodeMetadata(temp_metadata)
metadata.sub_metadata[name] = temp_metadata
}
}
~~~~~
{:.draco-syntax}
### DecodeEntry()
~~~~~
DecodeEntry(metadata) {
size UI8
name size * UI8
size varUI32
value size * UI8
metadata.entries.insert(name, value)
}
~~~~~
{:.draco-syntax}

View File

@ -4,11 +4,11 @@
### RansBitDecoder_StartDecoding() ### RansBitDecoder_StartDecoding()
~~~~~ ~~~~~
RansBitDecoder_StartDecoding(DecoderBuffer *source_buffer) { RansBitDecoder_StartDecoding() {
prob_zero_ UI8 prob_zero_ UI8
size UI32 size UI32
buffer_ size * UI8 buffer_ size * UI8
ans_read_init(&ans_decoder_, buffer_, size) ans_read_init(ans_decoder_, buffer_, size)
} }
~~~~~ ~~~~~
{:.draco-syntax } {:.draco-syntax }

View File

@ -4,8 +4,7 @@
### ans_read_init() ### ans_read_init()
~~~~~ ~~~~~
ans_read_init(struct AnsDecoder *const ans, const uint8_t *const buf, ans_read_init(AnsDecoder ans, buf, int offset) {
int offset) {
x = buf[offset - 1] >> 6 x = buf[offset - 1] >> 6
If (x == 0) { If (x == 0) {
ans->buf_offset = offset - 1; ans->buf_offset = offset - 1;
@ -17,8 +16,7 @@ ans_read_init(struct AnsDecoder *const ans, const uint8_t *const buf,
ans->buf_offset = offset - 3; ans->buf_offset = offset - 3;
ans->state = mem_get_le24(buf + offset - 3) & 0x3FFFFF; ans->state = mem_get_le24(buf + offset - 3) & 0x3FFFFF;
} else if (x == 3) { } else if (x == 3) {
// x == 3 implies this byte is a superframe marker // ERROR
return 1;
} }
ans->state += l_base; ans->state += l_base;
} }

View File

@ -13,6 +13,7 @@ Initialize(...) {
~~~~~ ~~~~~
DecodeIntegerValues(point_ids) { DecodeIntegerValues(point_ids) {
// REMOVE < DRACO_BITSTREAM_VERSION(2, 0)
// DecodeQuantizedDataInfo() // DecodeQuantizedDataInfo()
num_components = attribute()->components_count(); num_components = attribute()->components_count();
for (i = 0; i < num_components; ++i) { for (i = 0; i < num_components; ++i) {
@ -20,6 +21,7 @@ DecodeIntegerValues(point_ids) {
} }
max_value_dif_ F32 max_value_dif_ F32
quantization_bits_ UI8 quantization_bits_ UI8
// REMOVE < DRACO_BITSTREAM_VERSION(2, 0)
SequentialIntegerAttributeDecoder::DecodeIntegerValues() SequentialIntegerAttributeDecoder::DecodeIntegerValues()
} }
~~~~~ ~~~~~
@ -41,7 +43,7 @@ DequantizeValues(num_values) {
value = value + min_value_[c]; value = value + min_value_[c];
att_val[c] = value; att_val[c] = value;
} }
attribute()->buffer()->Write(out_byte_pos, att_val.get(), entry_size); attribute()->buffer()->Write(out_byte_pos, att_val, entry_size);
out_byte_pos += entry_size; out_byte_pos += entry_size;
} }
} }

View File

@ -4,12 +4,12 @@
### DecodeSymbols() ### DecodeSymbols()
~~~~~ ~~~~~
DecodeSymbols(num_symbols, out_buffer, out_values) { DecodeSymbols(num_symbols, out_values) {
scheme UI8 scheme UI8
If (scheme == 0) { If (scheme == 0) {
DecodeTaggedSymbols<>(num_symbols, src_buffer, out_values) DecodeTaggedSymbols(num_symbols, out_values)
} else if (scheme == 1) { } else if (scheme == 1) {
DecodeRawSymbols<>(num_symbols, src_buffer, out_values) DecodeRawSymbols(num_symbols, out_values)
} }
} }
~~~~~ ~~~~~
@ -29,19 +29,8 @@ DecodeTaggedSymbols() {
### DecodeRawSymbols() ### DecodeRawSymbols()
~~~~~ ~~~~~
DecodeRawSymbols() { DecodeRawSymbols(num_values, out_values) {
max_bit_length UI8 max_bit_length UI8
DecodeRawSymbolsInternal(max_bit_length, out_values)
return symbols
}
~~~~~
{:.draco-syntax }
### DecodeRawSymbolsInternal()
~~~~~
DecodeRawSymbolsInternal(max_bit_length, out_values) {
decoder = CreateRansSymbolDecoder(max_bit_length) decoder = CreateRansSymbolDecoder(max_bit_length)
decoder.StartDecoding() decoder.StartDecoding()
// RansSymbolDecoder_StartDecoding // RansSymbolDecoder_StartDecoding
@ -103,7 +92,7 @@ RansSymbolDecoder_StartDecoding() {
~~~~~ ~~~~~
RansSymbolDecoder_DecodeSymbol() { RansSymbolDecoder_DecodeSymbol() {
ans_.rans_read() return ans_.rans_read()
} }
~~~~~ ~~~~~
{:.draco-syntax } {:.draco-syntax }

View File

@ -0,0 +1,8 @@
## Descriptions
### Variabless
* edgebreaker_traversal_type
* 0: MeshEdgeBreakerTraversalDecoder
* 1: MeshEdgeBreakerTraversalPredictiveDecoder
* 2: MeshEdgeBreakerTraversalValenceDecoder