michael@0: diff --git a/EbmlBufferWriter.c b/EbmlBufferWriter.c michael@0: index 574e478..8c26e80 100644 michael@0: --- a/EbmlBufferWriter.c michael@0: +++ b/EbmlBufferWriter.c michael@0: @@ -8,6 +8,31 @@ 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: @@ -19,12 +44,12 @@ static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned michael@0: while (q != p) { michael@0: --q; michael@0: michael@0: - unsigned long cbWritten; 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: @@ -33,22 +58,22 @@ void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) michael@0: michael@0: _Serialize(glob, p, q); michael@0: } 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: - unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLLU; michael@0: - Ebml_Serialize(glob, (void *)&unknownLen, 8); // this is a key that says lenght unknown 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 |= 0x0100000000000000LLU; michael@0: - Ebml_Serialize(glob, &size, 8); michael@0: + size |= 0x0100000000000000LL; michael@0: + Ebml_Serialize(glob, &size,sizeof(size), 8); michael@0: glob->offset = curOffset; michael@0: } michael@0: michael@0: diff --git a/EbmlBufferWriter.h b/EbmlBufferWriter.h michael@0: index acd5c2a..c135f29 100644 michael@0: --- a/EbmlBufferWriter.h michael@0: +++ b/EbmlBufferWriter.h michael@0: @@ -11,9 +11,7 @@ typedef struct { michael@0: unsigned int offset; michael@0: } EbmlGlobal; michael@0: michael@0: - michael@0: void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id); michael@0: void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc); michael@0: michael@0: - michael@0: #endif michael@0: diff --git a/EbmlWriter.c b/EbmlWriter.c michael@0: index 27cfe86..ebefc1a 100644 michael@0: --- a/EbmlWriter.c michael@0: +++ b/EbmlWriter.c michael@0: @@ -74,6 +74,13 @@ void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id) { michael@0: Ebml_Serialize(glob, (void *)&class_id, sizeof(class_id), len); michael@0: } michael@0: michael@0: +void Ebml_SerializeUnsigned32(EbmlGlobal *glob, unsigned long class_id, uint32_t ui) { michael@0: + unsigned char sizeSerialized = 8 | 0x80; michael@0: + Ebml_WriteID(glob, class_id); michael@0: + Ebml_Serialize(glob, &sizeSerialized, sizeof(sizeSerialized), 1); michael@0: + Ebml_Serialize(glob, &ui, sizeof(ui), 4); michael@0: +} michael@0: + michael@0: void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t ui) { michael@0: unsigned char sizeSerialized = 8 | 0x80; michael@0: Ebml_WriteID(glob, class_id); michael@0: diff --git a/EbmlWriter.h b/EbmlWriter.h michael@0: index b94f757..a0a848b 100644 michael@0: --- a/EbmlWriter.h michael@0: +++ b/EbmlWriter.h michael@0: @@ -28,6 +28,7 @@ void Ebml_WriteLen(EbmlGlobal *glob, int64_t val); michael@0: void Ebml_WriteString(EbmlGlobal *glob, const char *str); michael@0: void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr); michael@0: void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id); michael@0: +void Ebml_SerializeUnsigned32(EbmlGlobal *glob, unsigned long class_id, uint32_t ui); michael@0: void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t ui); michael@0: void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui); michael@0: void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long ui); michael@0: diff --git a/WebMElement.c b/WebMElement.c michael@0: index 2f79a3c..02eefa4 100644 michael@0: --- a/WebMElement.c michael@0: +++ b/WebMElement.c michael@0: @@ -11,8 +11,12 @@ michael@0: #include "EbmlIDs.h" michael@0: #include "WebMElement.h" michael@0: #include michael@0: +#include michael@0: +#include michael@0: +#include michael@0: michael@0: #define kVorbisPrivateMaxSize 4000 michael@0: +#define UInt64 uint64_t michael@0: michael@0: void writeHeader(EbmlGlobal *glob) { michael@0: EbmlLoc start; michael@0: @@ -30,15 +34,16 @@ void writeHeader(EbmlGlobal *glob) { michael@0: void writeSimpleBlock(EbmlGlobal *glob, unsigned char trackNumber, short timeCode, michael@0: int isKeyframe, unsigned char lacingFlag, int discardable, michael@0: unsigned char *data, unsigned long dataLength) { michael@0: - Ebml_WriteID(glob, SimpleBlock); michael@0: unsigned long blockLength = 4 + dataLength; michael@0: + unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable; michael@0: + Ebml_WriteID(glob, SimpleBlock); michael@0: blockLength |= 0x10000000; // TODO check length < 0x0FFFFFFFF michael@0: Ebml_Serialize(glob, &blockLength, sizeof(blockLength), 4); michael@0: trackNumber |= 0x80; // TODO check track nubmer < 128 michael@0: Ebml_Write(glob, &trackNumber, 1); michael@0: // Ebml_WriteSigned16(glob, timeCode,2); //this is 3 bytes michael@0: Ebml_Serialize(glob, &timeCode, sizeof(timeCode), 2); michael@0: - unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable; michael@0: + flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable; michael@0: Ebml_Write(glob, &flags, 1); michael@0: Ebml_Write(glob, data, dataLength); michael@0: } michael@0: @@ -48,17 +53,18 @@ static UInt64 generateTrackID(unsigned int trackNumber) { michael@0: UInt64 r = rand(); michael@0: r = r << 32; michael@0: r += rand(); michael@0: - UInt64 rval = t ^ r; michael@0: - return rval; michael@0: +// UInt64 rval = t ^ r; michael@0: + return t ^ r; michael@0: } michael@0: michael@0: void writeVideoTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing, michael@0: char *codecId, unsigned int pixelWidth, unsigned int pixelHeight, michael@0: double frameRate) { michael@0: EbmlLoc start; michael@0: + UInt64 trackID; michael@0: Ebml_StartSubElement(glob, &start, TrackEntry); michael@0: Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber); michael@0: - UInt64 trackID = generateTrackID(trackNumber); michael@0: + trackID = generateTrackID(trackNumber); michael@0: Ebml_SerializeUnsigned(glob, TrackUID, trackID); michael@0: Ebml_SerializeString(glob, CodecName, "VP8"); // TODO shouldn't be fixed michael@0: michael@0: @@ -78,9 +84,10 @@ void writeAudioTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing, michael@0: char *codecId, double samplingFrequency, unsigned int channels, michael@0: unsigned char *private, unsigned long privateSize) { michael@0: EbmlLoc start; michael@0: + UInt64 trackID; michael@0: Ebml_StartSubElement(glob, &start, TrackEntry); michael@0: Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber); michael@0: - UInt64 trackID = generateTrackID(trackNumber); michael@0: + trackID = generateTrackID(trackNumber); michael@0: Ebml_SerializeUnsigned(glob, TrackUID, trackID); michael@0: Ebml_SerializeUnsigned(glob, TrackType, 2); // audio is always 2 michael@0: // I am using defaults for thesed required fields michael@0: