private void WriteStreamFormat(IAviStreamInternal stream) { var chunk = fileWriter.OpenChunk(KnownFourCCs.Chunks.StreamFormat); stream.WriteFormat(); fileWriter.CloseItem(chunk); }
private void WriteStreamHeader(IAviStreamInternal stream) { var chunk = fileWriter.OpenChunk(KnownFourCC.Chunks.StreamHeader); stream.WriteHeader(); fileWriter.CloseItem(chunk); }
private void WriteStreamList(IAviStreamInternal stream) { var list = fileWriter.OpenList(KnownFourCCs.Lists.Stream); WriteStreamHeader(stream); WriteStreamFormat(stream); WriteStreamName(stream); WriteStreamSuperIndex(stream); fileWriter.CloseItem(list); }
private void FlushStreamIndex(IAviStreamInternal stream) { var si = streamsInfo[stream.Index]; var index = si.StandardIndex; var entriesCount = index.Count; if (entriesCount == 0) { return; } var baseOffset = index[0].DataOffset; var indexSize = 24 + entriesCount * 8; CreateNewRiffIfNeeded(indexSize); // See AVISTDINDEX structure var chunk = fileWriter.OpenChunk(si.StandardIndexChunkId, indexSize); fileWriter.Write((ushort)2); // DWORDs per entry fileWriter.Write((byte)0); // index sub-type fileWriter.Write((byte)IndexType.Chunks); // index type fileWriter.Write((uint)entriesCount); // entries count fileWriter.Write((uint)stream.ChunkId); // chunk ID of the stream fileWriter.Write((ulong)baseOffset); // base offset for entries fileWriter.SkipBytes(sizeof(uint)); // reserved foreach (var entry in index) { fileWriter.Write((uint)(entry.DataOffset - baseOffset)); // chunk data offset fileWriter.Write(entry.DataSize); // chunk data size } fileWriter.CloseItem(chunk); var superIndex = streamsInfo[stream.Index].SuperIndex; var newEntry = new SuperIndexEntry { ChunkOffset = chunk.ItemStart, ChunkSize = chunk.ItemSize, Duration = entriesCount }; superIndex.Add(newEntry); index.Clear(); }