media/libmkv/EbmlBufferWriter.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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>
    11 void
    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    * 3 - int32_t;
    18    * 4 - 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 }
    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 }
    43 static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) {
    44   while (q != p) {
    45     --q;
    47     memcpy(&(glob->buf[glob->offset]), q, 1);
    48     glob->offset++;
    49   }
    50 }
    52 /*
    53 void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
    54   // assert(buf);
    56   const unsigned char *const p = (const unsigned char *)(buffer_in);
    57   const unsigned char *const q = p + len;
    59   _Serialize(glob, p, q);
    60 }
    61 */
    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 lenght unknown
    69 }
    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 }

mercurial