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
11void 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
18static 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
28void 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
38void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_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 lenght unknown
44}
45
46void 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
55