1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #include <strmif.h>
2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "EbmlBufferWriter.h"
3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "EbmlWriter.h"
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #include <cassert>
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #include <limits>
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #include <malloc.h>  //_alloca
7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <stdlib.h>
8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <wchar.h>
9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <string.h>
10538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned char *src = glob->buf;
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  src += glob->offset;
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  memcpy(src, buffer_in, len);
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  glob->offset += len;
16538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
17538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) {
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  while (q != p) {
20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --q;
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    memcpy(&(glob->buf[glob->offset]), q, 1);
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    glob->offset++;
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // assert(buf);
28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const unsigned char *const p = (const unsigned char *)(buffer_in);
30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const unsigned char *const q = p + len;
31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  _Serialize(glob, p, q);
33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) {
37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  Ebml_WriteID(glob, class_id);
38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  ebmlLoc->offset = glob->offset;
39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // todo this is always taking 8 bytes, this may need later optimization
40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned long long unknownLen =  0x01FFFFFFFFFFFFFFLLU;
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  Ebml_Serialize(glob, (void *)&unknownLen, 8); // this is a key that says lenght unknown
42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) {
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned long long size = glob->offset - ebmlLoc->offset - 8;
46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned long long curOffset = glob->offset;
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  glob->offset = ebmlLoc->offset;
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  size |=  0x0100000000000000LLU;
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  Ebml_Serialize(glob, &size, 8);
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  glob->offset = curOffset;
51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
53