EbmlBufferWriter.c 1.52 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
// #include <strmif.h>
2 3
#include "EbmlBufferWriter.h"
#include "EbmlWriter.h"
John Koleszar's avatar
John Koleszar committed
4 5 6
// #include <cassert>
// #include <limits>
// #include <malloc.h>  //_alloca
7 8 9 10
#include <stdlib.h>
#include <wchar.h>
#include <string.h>

John Koleszar's avatar
John Koleszar committed
11 12 13 14 15
void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
  unsigned char *src = glob->buf;
  src += glob->offset;
  memcpy(src, buffer_in, len);
  glob->offset += len;
16 17
}

John Koleszar's avatar
John Koleszar committed
18 19 20
static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) {
  while (q != p) {
    --q;
21

John Koleszar's avatar
John Koleszar committed
22 23 24 25
    unsigned long cbWritten;
    memcpy(&(glob->buf[glob->offset]), q, 1);
    glob->offset++;
  }
26 27
}

John Koleszar's avatar
John Koleszar committed
28 29
void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
  // assert(buf);
30

John Koleszar's avatar
John Koleszar committed
31 32
  const unsigned char *const p = (const unsigned char *)(buffer_in);
  const unsigned char *const q = p + len;
33

John Koleszar's avatar
John Koleszar committed
34
  _Serialize(glob, p, q);
35 36 37
}


John Koleszar's avatar
John Koleszar committed
38 39 40 41 42 43
void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) {
  Ebml_WriteID(glob, class_id);
  ebmlLoc->offset = glob->offset;
  // todo this is always taking 8 bytes, this may need later optimization
  unsigned long long unknownLen =  0x01FFFFFFFFFFFFFFLLU;
  Ebml_Serialize(glob, (void *)&unknownLen, 8); // this is a key that says lenght unknown
44 45
}

John Koleszar's avatar
John Koleszar committed
46 47 48 49 50 51 52
void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) {
  unsigned long long size = glob->offset - ebmlLoc->offset - 8;
  unsigned long long curOffset = glob->offset;
  glob->offset = ebmlLoc->offset;
  size |=  0x0100000000000000LLU;
  Ebml_Serialize(glob, &size, 8);
  glob->offset = curOffset;
53 54
}