Beispiel #1
0
        private void WriteStreamFormat(IAviStreamInternal stream)
        {
            var chunk = fileWriter.OpenChunk(KnownFourCCs.Chunks.StreamFormat);

            stream.WriteFormat();
            fileWriter.CloseItem(chunk);
        }
Beispiel #2
0
        private void WriteStreamHeader(IAviStreamInternal stream)
        {
            var chunk = fileWriter.OpenChunk(KnownFourCC.Chunks.StreamHeader);

            stream.WriteHeader();
            fileWriter.CloseItem(chunk);
        }
Beispiel #3
0
        private void WriteStreamList(IAviStreamInternal stream)
        {
            var list = fileWriter.OpenList(KnownFourCCs.Lists.Stream);

            WriteStreamHeader(stream);
            WriteStreamFormat(stream);
            WriteStreamName(stream);
            WriteStreamSuperIndex(stream);
            fileWriter.CloseItem(list);
        }
Beispiel #4
0
        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();
        }