John Koleszar | f9d9824 | 2010-10-20 11:06:48 -0400 | [diff] [blame] | 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 | |