1// #include <strmif.h> 2#include "EbmlBufferWriter.h" 3#include "EbmlWriter.h" 4// #include <cassert> 5// #include <limits> 6// #include <malloc.h> //_alloca 7#include <stdlib.h> 8#include <wchar.h> 9#include <string.h> 10 11void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { 12 unsigned char *src = glob->buf; 13 src += glob->offset; 14 memcpy(src, buffer_in, len); 15 glob->offset += len; 16} 17 18static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) { 19 while (q != p) { 20 --q; 21 22 unsigned long cbWritten; 23 memcpy(&(glob->buf[glob->offset]), q, 1); 24 glob->offset++; 25 } 26} 27 28void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { 29 // assert(buf); 30 31 const unsigned char *const p = (const unsigned char *)(buffer_in); 32 const unsigned char *const q = p + len; 33 34 _Serialize(glob, p, q); 35} 36 37 38void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) { 39 Ebml_WriteID(glob, class_id); 40 ebmlLoc->offset = glob->offset; 41 // todo this is always taking 8 bytes, this may need later optimization 42 unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLLU; 43 Ebml_Serialize(glob, (void *)&unknownLen, 8); // this is a key that says lenght unknown 44} 45 46void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) { 47 unsigned long long size = glob->offset - ebmlLoc->offset - 8; 48 unsigned long long curOffset = glob->offset; 49 glob->offset = ebmlLoc->offset; 50 size |= 0x0100000000000000LLU; 51 Ebml_Serialize(glob, &size, 8); 52 glob->offset = curOffset; 53} 54 55