private bool ScanStream( TSStream stream, TSStreamState streamState, TSStreamBuffer buffer) { streamState.StreamTag = null; long bitrate = 0; if (stream.IsAudioStream && streamState.PTSTransfer > 0) { bitrate = (long)Math.Round( (buffer.TransferLength * 8.0) / ((double)streamState.PTSTransfer / 90000)); if (bitrate > streamState.PeakTransferRate) { streamState.PeakTransferRate = bitrate; } } if (buffer.TransferLength > streamState.PeakTransferLength) { streamState.PeakTransferLength = buffer.TransferLength; } buffer.BeginRead(); switch (stream.StreamType) { case TSStreamType.MPEG2_VIDEO: TSCodecMPEG2.Scan( (TSVideoStream)stream, buffer, ref streamState.StreamTag); break; case TSStreamType.AVC_VIDEO: TSCodecAVC.Scan( (TSVideoStream)stream, buffer, ref streamState.StreamTag); break; case TSStreamType.MVC_VIDEO: TSCodecMVC.Scan( (TSVideoStream)stream, buffer, ref streamState.StreamTag); break; case TSStreamType.VC1_VIDEO: TSCodecVC1.Scan( (TSVideoStream)stream, buffer, ref streamState.StreamTag); break; case TSStreamType.AC3_AUDIO: TSCodecAC3.Scan( (TSAudioStream)stream, buffer, ref streamState.StreamTag); break; case TSStreamType.AC3_PLUS_AUDIO: case TSStreamType.AC3_PLUS_SECONDARY_AUDIO: TSCodecAC3.Scan( (TSAudioStream)stream, buffer, ref streamState.StreamTag); break; case TSStreamType.AC3_TRUE_HD_AUDIO: TSCodecTrueHD.Scan( (TSAudioStream)stream, buffer, ref streamState.StreamTag); break; case TSStreamType.LPCM_AUDIO: TSCodecLPCM.Scan( (TSAudioStream)stream, buffer, ref streamState.StreamTag); break; case TSStreamType.DTS_AUDIO: TSCodecDTS.Scan( (TSAudioStream)stream, buffer, bitrate, ref streamState.StreamTag); break; case TSStreamType.DTS_HD_AUDIO: case TSStreamType.DTS_HD_MASTER_AUDIO: case TSStreamType.DTS_HD_SECONDARY_AUDIO: TSCodecDTSHD.Scan( (TSAudioStream)stream, buffer, bitrate, ref streamState.StreamTag); break; default: stream.IsInitialized = true; break; } buffer.EndRead(); streamState.StreamBuffer.Reset(); bool isAVC = false; bool isMVC = false; foreach (TSStream finishedStream in Streams.Values) { if (!finishedStream.IsInitialized) { return false; } if (finishedStream.StreamType == TSStreamType.AVC_VIDEO) { isAVC = true; } if (finishedStream.StreamType == TSStreamType.MVC_VIDEO) { isMVC = true; } } if (isMVC && !isAVC) { return false; } return true; }