OLD | NEW |
(Empty) | |
| 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 unsigned char *src = glob->buf; |
| 13 src += glob->offset; |
| 14 memcpy(src, buffer_in, len); |
| 15 glob->offset += len; |
| 16 } |
| 17 |
| 18 static 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 |
| 28 void 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 |
| 38 void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long clas
s_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 lengh
t unknown |
| 44 } |
| 45 |
| 46 void 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 |
OLD | NEW |