blob: d9b04a81a03da5f93d17a7dd7dc60bce26d7d787 [file] [log] [blame]
John Koleszarf9d98242010-10-20 11:06:48 -04001//#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{
13 unsigned char *src = glob->buf;
14 src += glob->offset;
15 memcpy(src, buffer_in, len);
16 glob->offset += len;
17}
18
19static 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
31void 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
42void 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
51void 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