| Index: source/libvpx/third_party/libmkv/EbmlBufferWriter.c
|
| ===================================================================
|
| --- source/libvpx/third_party/libmkv/EbmlBufferWriter.c (revision 0)
|
| +++ source/libvpx/third_party/libmkv/EbmlBufferWriter.c (revision 0)
|
| @@ -0,0 +1,54 @@
|
| +// #include <strmif.h>
|
| +#include "EbmlBufferWriter.h"
|
| +#include "EbmlWriter.h"
|
| +// #include <cassert>
|
| +// #include <limits>
|
| +// #include <malloc.h> //_alloca
|
| +#include <stdlib.h>
|
| +#include <wchar.h>
|
| +#include <string.h>
|
| +
|
| +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;
|
| +}
|
| +
|
| +static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) {
|
| + while (q != p) {
|
| + --q;
|
| +
|
| + unsigned long cbWritten;
|
| + memcpy(&(glob->buf[glob->offset]), q, 1);
|
| + glob->offset++;
|
| + }
|
| +}
|
| +
|
| +void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
|
| + // assert(buf);
|
| +
|
| + const unsigned char *const p = (const unsigned char *)(buffer_in);
|
| + const unsigned char *const q = p + len;
|
| +
|
| + _Serialize(glob, p, q);
|
| +}
|
| +
|
| +
|
| +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
|
| +}
|
| +
|
| +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;
|
| +}
|
| +
|
|
|