## Metadata Decoder

### DecodeMetadata()

~~~~~
void DecodeMetadata() {
  ParseMetadataCount();

  for (i = 0; i < num_att_metadata; ++i) {
    ParseAttributeMetadataId(i);
    DecodeMetadataElement(att_metadata[i]);
  }
  DecodeMetadataElement(file_metadata);
}
~~~~~
{:.draco-syntax}


### ParseMetadataCount()

~~~~~
void ParseMetadataCount() {
  num_att_metadata                                                                    varUI32
}
~~~~~
{:.draco-syntax}


### ParseAttributeMetadataId()

~~~~~
void ParseAttributeMetadataId(index) {
  att_metadata_id[index]                                                              varUI32
}
~~~~~
{:.draco-syntax}


### ParseMetadataElement()

~~~~~
void ParseMetadataElement(metadata) {
  metadata.num_entries                                                                varUI32
  for (i = 0; i < metadata.num_entries; ++i) {
    sz = metadata.key_size[i]                                                         UI8
    metadata.key[i]                                                                   I8[sz]
    sz = metadata.value_size[i]                                                       UI8
    metadata.value[i]                                                                 I8[sz]
  }
  metadata.num_sub_metadata                                                           varUI32
}
~~~~~
{:.draco-syntax}


### ParseSubMetadataKey()

~~~~~
void ParseSubMetadataKey(metadata, index) {
  sz = metadata.sub_metadata_key_size[index]                                          UI8
  metadata.sub_metadata_key[index]                                                    I8[sz]
}
~~~~~
{:.draco-syntax}


### DecodeMetadataElement()

~~~~~
void DecodeMetadataElement(metadata) {
  ParseMetadataElement(metadata);
  for (i = 0; i < metadata.num_sub_metadata; ++i) {
    ParseSubMetadataKey(metadata, i);
    DecodeMetadataElement(metadata.sub_metadata[i]);
  }
}
~~~~~
{:.draco-syntax}
