RiffChunk(Stream stream, RiffAviFourCCCode code, RiffChunk parent) { this.stream = stream; WriteBits(RiffAviFourCCCodes.GetCode(code)); bookmark = new StreamBookmark(this.stream); bookmark.CaptureAndWrite(0); size = 0; this.parentChunk = parent; if (this.parentChunk != null) { this.parentChunk.size += 8; } }
void SyncWriteFileHeader() { riffChunk = new RiffChunk(this.stream); riffChunk.WriteFourCC(RiffAviFourCCCode.Avi); RiffChunk listHdrl = riffChunk.AddChild(RiffAviFourCCCode.List); listHdrl.WriteFourCC(RiffAviFourCCCode.Hdrl); RiffChunk avihChunk = listHdrl.AddChild(RiffAviFourCCCode.Avih); WriteAvihHeaderStructure(avihChunk); avihChunk.Close(); RiffChunk listStrl = listHdrl.AddChild(RiffAviFourCCCode.List); listStrl.WriteFourCC(RiffAviFourCCCode.Strl); RiffChunk strhChunk = listStrl.AddChild(RiffAviFourCCCode.Strh); WriteStrhHeaderStructure(strhChunk); strhChunk.Close(); RiffChunk strfChunk = listStrl.AddChild(RiffAviFourCCCode.Strf); WriteStrfHeaderStructure(strfChunk); strfChunk.Close(); listStrl.Close(); listHdrl.Close(); listMovi = riffChunk.AddChild(RiffAviFourCCCode.List); listMovi.WriteFourCC(RiffAviFourCCCode.Movi); }
void WriteStrfHeaderStructure(RiffChunk chunk) { chunk.WriteDWORD(40); // structure size - TOTAL structure size chunk.WriteDWORD(width); // width chunk.WriteDWORD(height); // height chunk.WriteWORD(1); // planes chunk.WriteWORD(32); // bits per pixel chunk.WriteDWORD(0); // compression ( BI_RGB == 0 ) chunk.WriteDWORD(width * height * 4); // size image - TODO chunk.WriteDWORD(0); // X pels per meter chunk.WriteDWORD(0); // Y pels per meter chunk.WriteDWORD(0); // clr used chunk.WriteDWORD(0); // clr important //NB: No colour table. }
void WriteStrhHeaderStructure(RiffChunk chunk) { chunk.WriteFourCC(RiffAviFourCCCode.Vids); // 'vids' chunk.WriteFourCC(RiffAviFourCCCode.Dib); // 'DIB ' chunk.WriteDWORD(0); // flags chunk.WriteWORD(0); // priority chunk.WriteWORD(0); // language chunk.WriteDWORD(0); // initial frames chunk.WriteDWORD(1); // scale chunk.WriteDWORD(framesPerSecond); // rate chunk.WriteDWORD(0); // start strhFrameCountBookmark = chunk.WriteAndBookmarkDWORD(0); // frameCount chunk.WriteDWORD(width * height * 4); // suggested buffer size chunk.WriteDWORD(0); // quality chunk.WriteDWORD(0); // sample size chunk.WriteDWORD(0); // left chunk.WriteDWORD(0); // top chunk.WriteDWORD((ushort)width); // right chunk.WriteDWORD((ushort)height); // bottom }
void WriteAvihHeaderStructure(RiffChunk chunk) { UInt32 microSecondsPerFrame = (UInt32)((1.0 / framesPerSecond) * 1.0E6); chunk.WriteDWORD(microSecondsPerFrame); // Microseconds per frame chunk.WriteDWORD(0); // Max Bytes Per Second chunk.WriteDWORD(0); // Padding granularity chunk.WriteDWORD(0); // Flags avihFrameCountBookmark = chunk.WriteAndBookmarkDWORD(0); // Total frames chunk.WriteDWORD(0); // Initial frames chunk.WriteDWORD(1); // Streams chunk.WriteDWORD(width * height * 4); // Suggested buffer size chunk.WriteDWORD(width); // Width chunk.WriteDWORD(height); // Height chunk.WriteDWORD(0); // Reserved [0] chunk.WriteDWORD(0); // Reserved [1] chunk.WriteDWORD(0); // Reserved [2] chunk.WriteDWORD(0); // Reserved [3] }