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_Serialize(EbmlGlobal * glob,const void * buffer_in,int buffer_size,unsigned long len)12 Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, int buffer_size, unsigned long len)
13 {
14   /* buffer_size:
15    * 1 - int8_t;
16    * 2 - int16_t;
17    * 4 - int32_t;
18    * 8 - int64_t;
19    */
20   long i;
21   for(i = len-1; i >= 0; i--) {
22     unsigned char x;
23     if (buffer_size == 1) {
24       x = (char)(*(const int8_t *)buffer_in >> (i * 8));
25     } else if (buffer_size == 2) {
26       x = (char)(*(const int16_t *)buffer_in >> (i * 8));
27     } else if (buffer_size == 4) {
28       x = (char)(*(const int32_t *)buffer_in >> (i * 8));
29     } else if (buffer_size == 8) {
30       x = (char)(*(const int64_t *)buffer_in >> (i * 8));
31     }
32     Ebml_Write(glob, &x, 1);
33   }
34 }
35 
Ebml_Write(EbmlGlobal * glob,const void * buffer_in,unsigned long len)36 void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
37   unsigned char *src = glob->buf;
38   src += glob->offset;
39   memcpy(src, buffer_in, len);
40   glob->offset += len;
41 }
42 
_Serialize(EbmlGlobal * glob,const unsigned char * p,const unsigned char * q)43 static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) {
44   while (q != p) {
45     --q;
46 
47     memcpy(&(glob->buf[glob->offset]), q, 1);
48     glob->offset++;
49   }
50 }
51 
52 /*
53 void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
54   // assert(buf);
55 
56   const unsigned char *const p = (const unsigned char *)(buffer_in);
57   const unsigned char *const q = p + len;
58 
59   _Serialize(glob, p, q);
60 }
61 */
62 
Ebml_StartSubElement(EbmlGlobal * glob,EbmlLoc * ebmlLoc,unsigned long class_id)63 void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) {
64   unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLL;
65   Ebml_WriteID(glob, class_id);
66   ebmlLoc->offset = glob->offset;
67   // todo this is always taking 8 bytes, this may need later optimization
68   Ebml_Serialize(glob, (void *)&unknownLen,sizeof(unknownLen), 8); // this is a key that says length unknown
69 }
70 
Ebml_EndSubElement(EbmlGlobal * glob,EbmlLoc * ebmlLoc)71 void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) {
72   unsigned long long size = glob->offset - ebmlLoc->offset - 8;
73   unsigned long long curOffset = glob->offset;
74   glob->offset = ebmlLoc->offset;
75   size |=  0x0100000000000000LL;
76   Ebml_Serialize(glob, &size,sizeof(size), 8);
77   glob->offset = curOffset;
78 }
79 
80