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 11 void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) 12 { 13 unsigned char *src = glob->buf; 14 src += glob->offset; 15 memcpy(src, buffer_in, len); 16 glob->offset += len; 17 } 18 19 static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) 20 { 21 while (q != p) 22 { 23 --q; 24 25 unsigned long cbWritten; 26 memcpy(&(glob->buf[glob->offset]), q, 1); 27 glob->offset ++; 28 } 29 } 30 31 void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) 32 { 33 //assert(buf); 34 35 const unsigned char *const p = (const unsigned char *)(buffer_in); 36 const unsigned char *const q = p + len; 37 38 _Serialize(glob, p, q); 39 } 40 41 42 void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) 43 { 44 Ebml_WriteID(glob, class_id); 45 ebmlLoc->offset = glob->offset; 46 //todo this is always taking 8 bytes, this may need later optimization 47 unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLLU; 48 Ebml_Serialize(glob, (void *)&unknownLen, 8); //this is a key that says lenght unknown 49 } 50 51 void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) 52 { 53 unsigned long long size = glob->offset - ebmlLoc->offset - 8; 54 unsigned long long curOffset = glob->offset; 55 glob->offset = ebmlLoc->offset; 56 size |= 0x0100000000000000LLU; 57 Ebml_Serialize(glob, &size, 8); 58 glob->offset = curOffset; 59 } 60 61