private string GetCodecStreamName(byte streamNumber, StreamPropertiesObject streamProperty, CodecListObject codecList)
        {
            StringBuilder codecStreamName = new StringBuilder();

            codecStreamName.AppendFormat(CultureInfo.CurrentCulture, "Stream {0}", streamNumber);

            if (streamProperty != null)                 // No stream property ASF-object found
            {
                // The Stream Type
                codecStreamName.AppendFormat(CultureInfo.CurrentCulture, ", {0}", Enum.GetName(typeof(ObjectStreamTypeGuid), streamProperty.StreamType));

                // The codec 4CC
                if (!string.IsNullOrEmpty(streamProperty.CompressionId))
                {
                    codecStreamName.AppendFormat(CultureInfo.CurrentCulture, ", {0}", streamProperty.CompressionId);
                }

                // The codec name
                string codecName = null;
                if (codecList != null)
                {
                    if (codecList.CodecNames.TryGetValue(GetCodecType(streamProperty.StreamType), out codecName))
                    {
                        codecStreamName.AppendFormat(CultureInfo.CurrentCulture, ", {0}", codecName);
                    }
                }
                if (string.IsNullOrEmpty(codecName) && !string.IsNullOrEmpty(streamProperty.CompressionId))
                {
                    codecStreamName.AppendDescriptiveCodecName(streamProperty.CompressionId);
                }
            }
            return(codecStreamName.ToString());
        }
 private static IDataPacket GetStreamData(StreamPropertiesObject streamProperties, IDataPacket streamData)
 {
     // If stream properties contains a data packet with codec specific data,
     // insert that data packet before the stream data
     if (streamProperties != null &&
         streamProperties.CodecSpecificData != null)
     {
         return(streamProperties.CodecSpecificData.Append(streamData));
     }
     return(streamData);
 }
        private StreamPropertiesObject GetStreamProperty(AsfObject asfObject, int streamID)
        {
            StreamPropertiesObject streamProperty = asfObject as StreamPropertiesObject;

            if (streamProperty != null && streamProperty.StreamNumber == streamID)
            {
                return(streamProperty);
            }

            foreach (AsfObject child in asfObject.Children)
            {
                streamProperty = GetStreamProperty(child, streamID);

                if (streamProperty != null && streamProperty.StreamNumber == streamID)
                {
                    return(streamProperty);
                }
            }
            return(streamProperty);
        }
        private void AddPayload(IDataBlockBuilder dataBlockBuilder, IDictionary <byte, ICodecStreamBuilder> codecStreamBuilders, Payload payload, CodecListObject codecList, AsfObject asfObject)
        {
            if (payload.Streams == null || payload.Streams.Count == 0)
            {
                return;
            }

            byte streamNumber = payload.StreamNumber;

            if (codecStreamBuilders.ContainsKey(streamNumber))
            {
                ICodecStreamBuilder codecStreamBuilder = codecStreamBuilders[streamNumber];

                foreach (IDataPacket streamData in payload.Streams)
                {
                    codecStreamBuilder.Data = codecStreamBuilder.Data.Append(streamData);
                }
            }
            else
            {
                StreamPropertiesObject streamProperty = GetStreamProperty(asfObject, streamNumber);

                ICodecStreamBuilder codecStreamBuilder = dataBlockBuilder.AddCodecStream();
                codecStreamBuilder.Name = GetCodecStreamName(streamNumber, streamProperty, codecList);
                // The DataFormat will be set by the codec detector (if one exists)
                //codecStreamBuilder.DataFormat = GetDataFormat(streamProperty);
                codecStreamBuilder.Data = GetStreamData(streamProperty, payload.Streams[0]);
                for (int streamIndex = 1; streamIndex < payload.Streams.Count; streamIndex++)
                {
                    codecStreamBuilder.Data = codecStreamBuilder.Data.Append(payload.Streams[streamIndex]);
                }
                codecStreamBuilder.AbsoluteStartOffset = codecStreamBuilder.Data.StartOffset;

                codecStreamBuilders.Add(streamNumber, codecStreamBuilder);
            }
        }