private void WriteCodecDescriptor(Stream target, MediaDescriptor descriptor) { MemoryStream memoryStream = new MemoryStream(); BitstreamWriter writer = new BitstreamWriter(memoryStream); writer.Put32BitsAligned((uint)descriptor.Codec); writer.PutAlignedByte((byte)descriptor.CodecType); writer.Put32BitsAligned(descriptor.Bitrate); writer.Put32BitsAligned((uint)descriptor.Flags); writer.Put32BitsAligned(0); // flags2 writer.Put32BitsAligned(0); // debug if (((uint)descriptor.Flags & (uint)CodecFlagsEnum.AV_CODEC_FLAG_GLOBAL_HEADER) != 0) { int extraDataSize = descriptor.ExtraData == null ? 0 : descriptor.ExtraData.Length; writer.Put32BitsAligned((uint)extraDataSize); if (extraDataSize > 0) { writer.PutAlignedBytes(descriptor.ExtraData); } } WriteHeaderChunk( target, new ArraySegment<byte>(memoryStream.GetBuffer(), 0, (int)memoryStream.Position), FourCC.Make("COMM") ); if (!string.IsNullOrEmpty(descriptor.RecommendedEncoderConfiguration)) { switch (descriptor.CodecType) { case CodecTypeEnum.Video: WriteRecommendedConfiguration(target, descriptor.RecommendedEncoderConfiguration, FourCC.Make("S2VI")); break; case CodecTypeEnum.Audio: WriteRecommendedConfiguration(target, descriptor.RecommendedEncoderConfiguration, FourCC.Make("S2AU")); break; default: throw new InvalidOperationException(string.Format("unsupported codec type: {0}", descriptor.CodecType)); } } }
private void WriteFFM2Chunk(Stream target) { BitstreamWriter writer = new BitstreamWriter(target); writer.Put32BitsAligned(FourCC.Make("FFM2")); writer.Put32BitsAligned(FFM.FFM_PACKET_SIZE); writer.Put64BitsAligned(0); //current write position }
private void WriteMAINChunk(Stream target) { MemoryStream memoryStream = new MemoryStream(); BitstreamWriter writer = new BitstreamWriter(memoryStream); writer.Put32BitsAligned((uint)m_tracks.Count()); uint bitrate = 0; for (int i = 0; i < m_tracks.Count(); i++) { bitrate += m_tracks.ElementAt(i).Bitrate; } writer.Put32BitsAligned(bitrate); WriteHeaderChunk( target, new ArraySegment<byte>(memoryStream.GetBuffer(), 0, (int)memoryStream.Position), FourCC.Make("MAIN") ); }
private void WriteHeaderChunk(Stream target, ArraySegment<byte> chunkData, uint id) { BitstreamWriter writer = new BitstreamWriter(target); writer.Put32BitsAligned(id); writer.Put32BitsAligned((uint)chunkData.Count); writer.PutAlignedBytes(chunkData.Array, chunkData.Offset, chunkData.Count); }
private void WriteRecommendedConfiguration(Stream target, string config, uint tag) { MemoryStream memoryStream = new MemoryStream(); BitstreamWriter writer = new BitstreamWriter(memoryStream); writer.PutNullTerminatedStringAligned(config); WriteHeaderChunk( target, new ArraySegment<byte>(memoryStream.GetBuffer(), 0, (int)memoryStream.Position), tag ); }