1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #include <strmif.h> 2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "EbmlBufferWriter.h" 3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "EbmlWriter.h" 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #include <cassert> 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #include <limits> 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #include <malloc.h> //_alloca 7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <stdlib.h> 8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <wchar.h> 9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <string.h> 10538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned char *src = glob->buf; 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += glob->offset; 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang memcpy(src, buffer_in, len); 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang glob->offset += len; 16538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 17538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) { 19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang while (q != p) { 20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang --q; 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang memcpy(&(glob->buf[glob->offset]), q, 1); 22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang glob->offset++; 23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // assert(buf); 28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *const p = (const unsigned char *)(buffer_in); 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *const q = p + len; 31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _Serialize(glob, p, q); 33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) { 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Ebml_WriteID(glob, class_id); 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ebmlLoc->offset = glob->offset; 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // todo this is always taking 8 bytes, this may need later optimization 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLLU; 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Ebml_Serialize(glob, (void *)&unknownLen, 8); // this is a key that says lenght unknown 42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) { 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned long long size = glob->offset - ebmlLoc->offset - 8; 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned long long curOffset = glob->offset; 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang glob->offset = ebmlLoc->offset; 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang size |= 0x0100000000000000LLU; 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Ebml_Serialize(glob, &size, 8); 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang glob->offset = curOffset; 51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 53