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;
}