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));
         }
     }
 }
示例#2
0
 public int AddTrack(MediaDescriptor trackDescriptor)
 {
     m_tracks.Add(trackDescriptor);
     return m_tracks.Count - 1;
 }