#pragma once #include #include "mkv_reader.h" // IDs // these are slightly different from the matroska spec because we specify // values after vint decoding and they specify before const uint32_t mkv_header=0xa45dfa3; const uint32_t mkv_header_ebml_version=0x286; const uint32_t mkv_header_ebml_read_version=0x2f7; const uint32_t mkv_header_ebml_max_id_length=0x2f2; const uint32_t mkv_header_ebml_max_size_length=0x2f3; const uint32_t mkv_header_doctype=0x282; const uint32_t mkv_header_doctype_read_version=0x285; const uint32_t mkv_header_doctype_version=0x287; namespace nsmkv { class Header { public: // defaults provided as per spec for matroska // *_found variables indicate whether the field was found in the file Header() : ebml_version(1), ebml_read_version(1), ebml_max_id_length(4), ebml_max_size_length(8), doctype(0), doctype_version(1), doctype_read_version(1), ebml_header_found(false) #ifdef WA_VALIDATE , ebml_version_found(false), ebml_read_version_found(false), ebml_max_id_length_found(false), ebml_max_size_length_found(false), doctype_version_found(false), doctype_found(false), doctype_read_version_found(false) #endif { } ~Header() { if (doctype) free(doctype); } void OwnDocType(char *_doctype) { if (doctype) free(doctype); doctype = _doctype; } uint64_t ebml_version; uint64_t ebml_read_version; uint64_t ebml_max_id_length; uint64_t ebml_max_size_length; char *doctype; uint64_t doctype_version; uint64_t doctype_read_version; bool ebml_header_found; #ifdef WA_VALIDATE bool ebml_version_found; bool ebml_read_version_found; bool ebml_max_id_length_found; bool doctype_found; bool ebml_max_size_length_found; bool doctype_version_found; bool doctype_read_version_found; #endif }; // returns bytes read. 0 means EOF uint64_t ReadHeader(nsmkv::MKVReader *reader, uint64_t size, nsmkv::Header &header); };