michael@0: // #include michael@0: #include "EbmlBufferWriter.h" michael@0: #include "EbmlWriter.h" michael@0: // #include michael@0: // #include michael@0: // #include //_alloca michael@0: #include michael@0: #include michael@0: #include michael@0: michael@0: void michael@0: Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, int buffer_size, unsigned long len) michael@0: { michael@0: /* buffer_size: michael@0: * 1 - int8_t; michael@0: * 2 - int16_t; michael@0: * 3 - int32_t; michael@0: * 4 - int64_t; michael@0: */ michael@0: long i; michael@0: for(i = len-1; i >= 0; i--) { michael@0: unsigned char x; michael@0: if (buffer_size == 1) { michael@0: x = (char)(*(const int8_t *)buffer_in >> (i * 8)); michael@0: } else if (buffer_size == 2) { michael@0: x = (char)(*(const int16_t *)buffer_in >> (i * 8)); michael@0: } else if (buffer_size == 4) { michael@0: x = (char)(*(const int32_t *)buffer_in >> (i * 8)); michael@0: } else if (buffer_size == 8) { michael@0: x = (char)(*(const int64_t *)buffer_in >> (i * 8)); michael@0: } michael@0: Ebml_Write(glob, &x, 1); michael@0: } michael@0: } michael@0: michael@0: void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { michael@0: unsigned char *src = glob->buf; michael@0: src += glob->offset; michael@0: memcpy(src, buffer_in, len); michael@0: glob->offset += len; michael@0: } michael@0: michael@0: static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) { michael@0: while (q != p) { michael@0: --q; michael@0: michael@0: memcpy(&(glob->buf[glob->offset]), q, 1); michael@0: glob->offset++; michael@0: } michael@0: } michael@0: michael@0: /* michael@0: void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) { michael@0: // assert(buf); michael@0: michael@0: const unsigned char *const p = (const unsigned char *)(buffer_in); michael@0: const unsigned char *const q = p + len; michael@0: michael@0: _Serialize(glob, p, q); michael@0: } michael@0: */ michael@0: michael@0: void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) { michael@0: unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLL; michael@0: Ebml_WriteID(glob, class_id); michael@0: ebmlLoc->offset = glob->offset; michael@0: // todo this is always taking 8 bytes, this may need later optimization michael@0: Ebml_Serialize(glob, (void *)&unknownLen,sizeof(unknownLen), 8); // this is a key that says lenght unknown michael@0: } michael@0: michael@0: void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) { michael@0: unsigned long long size = glob->offset - ebmlLoc->offset - 8; michael@0: unsigned long long curOffset = glob->offset; michael@0: glob->offset = ebmlLoc->offset; michael@0: size |= 0x0100000000000000LL; michael@0: Ebml_Serialize(glob, &size,sizeof(size), 8); michael@0: glob->offset = curOffset; michael@0: } michael@0: