#ifndef _ebml_h_ #define _ebml_h_ #include #include #ifdef __cplusplus extern "C" { #endif enum ebml_element_type_t { EBML_TYPE_UNKNOWN, EBML_TYPE_INT, // Signed Integer Element [0-8] EBML_TYPE_UINT, // Unsigned Integer Element [0-8] EBML_TYPE_FLOAT, // Float Element (0/4/8) EBML_TYPE_STRING, // ASCII String Element [0-VINTMAX] EBML_TYPE_UTF8, // UTF-8 Element [0-VINTMAX] EBML_TYPE_DATE, // Date Element [0-8] EBML_TYPE_MASTER, // Master Element [0-VINTMAX] EBML_TYPE_BINARY, // Binary Element [0-VINTMAX] }; struct ebml_t { uint8_t* ptr; size_t off; size_t len; int err; }; // https://github.com/ietf-wg-cellar/ebml-specification/blob/master/specification.markdown#ebml-header-elements struct ebml_header_t { unsigned int version; // default 1 unsigned int read_version; // default 1 unsigned int max_id_length; // default 4 unsigned int max_size_length; // default 8 char* doc_type; unsigned int doc_type_version; // default 1 unsigned int doc_type_read_version; // default 1 }; /// @return size with prefix bytes unsigned int ebml_size_length(uint64_t size); /// @return unsigned integer value bytes unsigned int ebml_uint_length(uint64_t v); /// @param[out] buf value writer buffer /// @return value length (same as ebml_uint_length) unsigned int ebml_write_uint(uint8_t buf[8], uint64_t v); /// Write EBML element id + size /// @param[out] buf write buffer /// @param[in] id element id /// @param[in] size element size /// @param[in] bytes size write bytes, 0-ebml_size_length(size) /// @return write length unsigned int ebml_write_element(uint8_t buf[12], uint32_t id, uint64_t size, unsigned int bytes); #ifdef __cplusplus } #endif #endif /* !_ebml_h_ */