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 {
     13     unsigned char *src = glob->buf;
     14     src += glob->offset;
     15     memcpy(src, buffer_in, len);
     16     glob->offset += len;
     17 }
     18 
     19 static 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 
     31 void 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 
     42 void 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 
     51 void 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 
     61