67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
#ifndef _ebml_h_
|
|
#define _ebml_h_
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#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_ */
|