EbmlBufferWriter.c (2224B)
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 12 Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, int buffer_size, unsigned long len) 13 { 14 /* buffer_size: 15 * 1 - int8_t; 16 * 2 - int16_t; 17 * 4 - int32_t; 18 * 8 - int64_t; 19 */ 20 long i; 21 for(i = len-1; i >= 0; i--) { 22 unsigned char x; 23 if (buffer_size == 1) { 24 x = (char)(*(const int8_t *)buffer_in >> (i * 8)); 25 } else if (buffer_size == 2) { 26 x = (char)(*(const int16_t *)buffer_in >> (i * 8)); 27 } else if (buffer_size == 4) { 28 x = (char)(*(const int32_t *)buffer_in >> (i * 8)); 29 } else if (buffer_size == 8) { 30 x = (char)(*(const int64_t *)buffer_in >> (i * 8)); 31 } 32 Ebml_Write(glob, &x, 1); 33 } 34 } 35 36 void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { 37 unsigned char *src = glob->buf; 38 src += glob->offset; 39 memcpy(src, buffer_in, len); 40 glob->offset += len; 41 } 42 43 static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) { 44 while (q != p) { 45 --q; 46 47 memcpy(&(glob->buf[glob->offset]), q, 1); 48 glob->offset++; 49 } 50 } 51 52 /* 53 void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { 54 // assert(buf); 55 56 const unsigned char *const p = (const unsigned char *)(buffer_in); 57 const unsigned char *const q = p + len; 58 59 _Serialize(glob, p, q); 60 } 61 */ 62 63 void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) { 64 unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLL; 65 Ebml_WriteID(glob, class_id); 66 ebmlLoc->offset = glob->offset; 67 // todo this is always taking 8 bytes, this may need later optimization 68 Ebml_Serialize(glob, (void *)&unknownLen,sizeof(unknownLen), 8); // this is a key that says length unknown 69 } 70 71 void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) { 72 unsigned long long size = glob->offset - ebmlLoc->offset - 8; 73 unsigned long long curOffset = glob->offset; 74 glob->offset = ebmlLoc->offset; 75 size |= 0x0100000000000000LL; 76 Ebml_Serialize(glob, &size,sizeof(size), 8); 77 glob->offset = curOffset; 78 }