Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/draco/draco/src/draco/metadata/metadata_encoder.cc')
-rw-r--r--extern/draco/draco/src/draco/metadata/metadata_encoder.cc97
1 files changed, 97 insertions, 0 deletions
diff --git a/extern/draco/draco/src/draco/metadata/metadata_encoder.cc b/extern/draco/draco/src/draco/metadata/metadata_encoder.cc
new file mode 100644
index 00000000000..168be83c6b2
--- /dev/null
+++ b/extern/draco/draco/src/draco/metadata/metadata_encoder.cc
@@ -0,0 +1,97 @@
+// Copyright 2017 The Draco Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include "draco/metadata/metadata_encoder.h"
+
+#include "draco/core/varint_encoding.h"
+
+namespace draco {
+
+bool MetadataEncoder::EncodeMetadata(EncoderBuffer *out_buffer,
+ const Metadata *metadata) {
+ const std::map<std::string, EntryValue> &entries = metadata->entries();
+ // Encode number of entries.
+ EncodeVarint(static_cast<uint32_t>(metadata->num_entries()), out_buffer);
+ // Encode all entries.
+ for (const auto &entry : entries) {
+ if (!EncodeString(out_buffer, entry.first)) {
+ return false;
+ }
+ const std::vector<uint8_t> &entry_value = entry.second.data();
+ const uint32_t data_size = static_cast<uint32_t>(entry_value.size());
+ EncodeVarint(data_size, out_buffer);
+ out_buffer->Encode(entry_value.data(), data_size);
+ }
+ const std::map<std::string, std::unique_ptr<Metadata>> &sub_metadatas =
+ metadata->sub_metadatas();
+ // Encode number of sub-metadata
+ EncodeVarint(static_cast<uint32_t>(sub_metadatas.size()), out_buffer);
+ // Encode each sub-metadata
+ for (auto &&sub_metadata_entry : sub_metadatas) {
+ if (!EncodeString(out_buffer, sub_metadata_entry.first)) {
+ return false;
+ }
+ EncodeMetadata(out_buffer, sub_metadata_entry.second.get());
+ }
+
+ return true;
+}
+
+bool MetadataEncoder::EncodeAttributeMetadata(
+ EncoderBuffer *out_buffer, const AttributeMetadata *metadata) {
+ if (!metadata) {
+ return false;
+ }
+ // Encode attribute id.
+ EncodeVarint(metadata->att_unique_id(), out_buffer);
+ EncodeMetadata(out_buffer, static_cast<const Metadata *>(metadata));
+ return true;
+}
+
+bool MetadataEncoder::EncodeGeometryMetadata(EncoderBuffer *out_buffer,
+ const GeometryMetadata *metadata) {
+ if (!metadata) {
+ return false;
+ }
+ // Encode number of attribute metadata.
+ const std::vector<std::unique_ptr<AttributeMetadata>> &att_metadatas =
+ metadata->attribute_metadatas();
+ // TODO(draco-eng): Limit the number of attributes.
+ EncodeVarint(static_cast<uint32_t>(att_metadatas.size()), out_buffer);
+ // Encode each attribute metadata
+ for (auto &&att_metadata : att_metadatas) {
+ EncodeAttributeMetadata(out_buffer, att_metadata.get());
+ }
+ // Encode normal metadata part.
+ EncodeMetadata(out_buffer, static_cast<const Metadata *>(metadata));
+
+ return true;
+}
+
+bool MetadataEncoder::EncodeString(EncoderBuffer *out_buffer,
+ const std::string &str) {
+ // We only support string of maximum length 255 which is using one byte to
+ // encode the length.
+ if (str.size() > 255) {
+ return false;
+ }
+ if (str.empty()) {
+ out_buffer->Encode(static_cast<uint8_t>(0));
+ } else {
+ out_buffer->Encode(static_cast<uint8_t>(str.size()));
+ out_buffer->Encode(str.c_str(), str.size());
+ }
+ return true;
+}
+} // namespace draco