Home | History | Annotate | Download | only in libmkv
      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   unsigned char *src = glob->buf;
     13   src += glob->offset;
     14   memcpy(src, buffer_in, len);
     15   glob->offset += len;
     16 }
     17 
     18 static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) {
     19   while (q != p) {
     20     --q;
     21     memcpy(&(glob->buf[glob->offset]), q, 1);
     22     glob->offset++;
     23   }
     24 }
     25 
     26 void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
     27   // assert(buf);
     28 
     29   const unsigned char *const p = (const unsigned char *)(buffer_in);
     30   const unsigned char *const q = p + len;
     31 
     32   _Serialize(glob, p, q);
     33 }
     34 
     35 
     36 void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) {
     37   Ebml_WriteID(glob, class_id);
     38   ebmlLoc->offset = glob->offset;
     39   // todo this is always taking 8 bytes, this may need later optimization
     40   unsigned long long unknownLen =  0x01FFFFFFFFFFFFFFLLU;
     41   Ebml_Serialize(glob, (void *)&unknownLen, 8); // this is a key that says lenght unknown
     42 }
     43 
     44 void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) {
     45   unsigned long long size = glob->offset - ebmlLoc->offset - 8;
     46   unsigned long long curOffset = glob->offset;
     47   glob->offset = ebmlLoc->offset;
     48   size |=  0x0100000000000000LLU;
     49   Ebml_Serialize(glob, &size, 8);
     50   glob->offset = curOffset;
     51 }
     52 
     53