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) {
num_attributes I32
num_attributes varUI32
point_attribute_ids_.resize(num_attributes);
for (i = 0; i < num_attributes; ++i) {
att_type UI8

View File

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

View File

@ -1,31 +1,22 @@
## EdgeBreaker Decoder
### InitializeDecoder()
### DecodeConnectivityData()
~~~~~
InitializeDecoder() {
edgebreaker_decoder_type UI8
}
~~~~~
{:.draco-syntax }
### DecodeConnectivity()
~~~~~
DecodeConnectivity() {
num_new_verts UI32
num_encoded_vertices UI32
num_faces UI32
DecodeConnectivityData() {
edgebreaker_traversal_type UI8
num_new_verts varUI32
num_encoded_vertices varUI32
num_faces varUI32
num_attribute_data I8
num_encoded_symbols UI32
num_encoded_split_symbols UI32
encoded_connectivity_size UI32
num_encoded_symbols varUI32
num_encoded_split_symbols varUI32
encoded_connectivity_size varUI32
// file pointer must be set to current position
// + encoded_connectivity_size
hole_and_split_bytes = DecodeHoleAndTopologySplitEvents()
// file pointer must be set to old current position
EdgeBreakerTraversalValence_Start()
EdgeBreakerTraversalValence_Start(num_encoded_vertices)
DecodeConnectivity(num_symbols)
if (attribute_data_.size() > 0) {
for (ci = 0; ci < corner_table_->num_corners(); ci += 3) {
@ -39,11 +30,12 @@ DecodeConnectivity() {
}
// Decode attribute connectivity.
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) {
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
AssignPointsToCorners()
@ -83,7 +75,8 @@ AssignPointsToCorners() {
act_c = corner_table_->SwingRight(c);
seam_found = false;
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;
seam_found = true;
break;
@ -150,12 +143,12 @@ DecodeConnectivity(num_symbols) {
check_topology_split = true;
}
active_corner_stack.back() = corner;
traversal_decoder_.NewActiveCornerReached(corner);
traversal_decoder_.NewActiveCornerReached(corner);
if (check_topology_split) {
encoder_symbol_id = num_symbols - symbol_id - 1;
while (true) {
split = IsTopologySplit(encoder_symbol_id, &split_edge,
&encoder_split_symbol_id);
&encoder_split_symbol_id);
if (!split) {
break;
}
@ -165,7 +158,8 @@ DecodeConnectivity(num_symbols) {
} else {
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] =
new_active_corner;
}
@ -186,7 +180,6 @@ DecodeConnectivity(num_symbols) {
init_corners_.push_back(corner);
}
}
Return num_vertices;
}
~~~~~
{:.draco-syntax }

View File

@ -6,25 +6,25 @@
~~~~~
DecodeHoleAndTopologySplitEvents() {
num_topologoy_splits UI32
num_topologoy_splits varUI32
source_symbol_id = 0
for (i = 0; i < num_topologoy_splits; ++i) {
DecodeVarint<UI32>(&delta)
delta varUI32
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
}
for (i = 0; i < num_topologoy_splits; ++i) {
split_data[i].split_edge bits1
split_data[i].source_edge bits1
}
num_hole_events UI32
num_hole_events varUI32
symbol_id = 0
for (i = 0; i < num_hole_events; ++i) {
DecodeVarint<UI32>(&delta)
delta varUI32
hole_data[i].symbol_id = delta + symbol_id
}
return bytes_decoded;
return bytes_decoded;
}
~~~~~
{:.draco-syntax }

View File

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

View File

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

View File

@ -17,6 +17,7 @@ version_date: Released 2017-xx-xx
{% include_relative 03.00.00.symbols.md %}
{% include_relative 04.00.00.conventions.md %}
{% include_relative draco.decoder.md %}
{% include_relative metadata.decoder.md %}
{% include_relative mesh.decoder.md %}
{% include_relative edgebreaker.decoder.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.bit.decoder.md %}
{% include_relative core.functions.md %}
{% include_relative variable.descriptions.md %}
{% comment %}
{% include_relative 99.00.01.testing.md %}

View File

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

View File

@ -7,7 +7,7 @@
Decode(...) {
this->transform().InitializeDecoding(num_components);
// restore the first value
this->transform().ComputeOriginalValue(pred_vals.get(),
this->transform().ComputeOriginalValue(pred_vals,
in_corr, out_data, 0);
// PredictionSchemeWrapTransform_ComputeOriginalValue()
corner_map_size = this->mesh_data().data_to_corner_map()->size();
@ -16,14 +16,14 @@ Decode(...) {
dst_offset = p * num_components;
b= ComputeParallelogramPrediction(p, corner_id, table,
*vertex_to_data_map, out_data,
num_components, pred_vals.get())
num_components, pred_vals)
if (!b) {
src_offset = (p - 1) * num_components;
this->transform().ComputeOriginalValue(out_data + src_offset, in_corr,
out_data + dst_offset, dst_offset);
// PredictionSchemeWrapTransform_ComputeOriginalValue()
} else {
this->transform().ComputeOriginalValue(pred_vals.get(), in_corr,
this->transform().ComputeOriginalValue(pred_vals, in_corr,
out_data + dst_offset, dst_offset);
// 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(DecoderBuffer *source_buffer) {
RansBitDecoder_StartDecoding() {
prob_zero_ UI8
size UI32
buffer_ size * UI8
ans_read_init(&ans_decoder_, buffer_, size)
ans_read_init(ans_decoder_, buffer_, size)
}
~~~~~
{:.draco-syntax }

View File

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

View File

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

View File

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

View File

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