public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, long bitrate, ref string tag) { if (stream.IsInitialized && (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO || (stream.CoreStream != null && stream.CoreStream.IsInitialized))) { return; } bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x64582025) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream(); stream.CoreStream.StreamType = TSStreamType.DTS_AUDIO; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecDTS.Scan(stream.CoreStream, buffer, bitrate, ref tag); } return; } tag = "HD"; int temp1 = buffer.ReadBits(8); int nuSubStreamIndex = buffer.ReadBits(2); int nuExtSSHeaderSize = 0; int nuExtSSFSize = 0; int bBlownUpHeader = buffer.ReadBits(1); if (1 == bBlownUpHeader) { nuExtSSHeaderSize = buffer.ReadBits(12) + 1; nuExtSSFSize = buffer.ReadBits(20) + 1; } else { nuExtSSHeaderSize = buffer.ReadBits(8) + 1; nuExtSSFSize = buffer.ReadBits(16) + 1; } int nuNumAudioPresent = 1; int nuNumAssets = 1; int bStaticFieldsPresent = buffer.ReadBits(1); if (1 == bStaticFieldsPresent) { int nuRefClockCode = buffer.ReadBits(2); int nuExSSFrameDurationCode = buffer.ReadBits(3) + 1; long nuTimeStamp = 0; if (1 == buffer.ReadBits(1)) { nuTimeStamp = (buffer.ReadBits(18) << 18) + buffer.ReadBits(18); } nuNumAudioPresent = buffer.ReadBits(3) + 1; nuNumAssets = buffer.ReadBits(3) + 1; int[] nuActiveExSSMask = new int[nuNumAudioPresent]; for (int i = 0; i < nuNumAudioPresent; i++) { nuActiveExSSMask[i] = buffer.ReadBits(nuSubStreamIndex + 1); //? } for (int i = 0; i < nuNumAudioPresent; i++) { for (int j = 0; j < nuSubStreamIndex + 1; j++) { if (((j + 1) % 2) == 1) { int mask = buffer.ReadBits(8); } } } if (1 == buffer.ReadBits(1)) { int nuMixMetadataAdjLevel = buffer.ReadBits(2); int nuBits4MixOutMask = buffer.ReadBits(2) * 4 + 4; int nuNumMixOutConfigs = buffer.ReadBits(2) + 1; int[] nuMixOutChMask = new int[nuNumMixOutConfigs]; for (int i = 0; i < nuNumMixOutConfigs; i++) { nuMixOutChMask[i] = buffer.ReadBits(nuBits4MixOutMask); } } } int[] AssetSizes = new int[nuNumAssets]; for (int i = 0; i < nuNumAssets; i++) { if (1 == bBlownUpHeader) { AssetSizes[i] = buffer.ReadBits(20) + 1; } else { AssetSizes[i] = buffer.ReadBits(16) + 1; } } for (int i = 0; i < nuNumAssets; i++) { long bufferPosition = buffer.Position; int nuAssetDescriptorFSIZE = buffer.ReadBits(9) + 1; int DescriptorDataForAssetIndex = buffer.ReadBits(3); if (1 == bStaticFieldsPresent) { int AssetTypeDescrPresent = buffer.ReadBits(1); if (1 == AssetTypeDescrPresent) { int AssetTypeDescriptor = buffer.ReadBits(4); } int LanguageDescrPresent = buffer.ReadBits(1); if (1 == LanguageDescrPresent) { int LanguageDescriptor = buffer.ReadBits(24); } int bInfoTextPresent = buffer.ReadBits(1); if (1 == bInfoTextPresent) { int nuInfoTextByteSize = buffer.ReadBits(10) + 1; int[] InfoText = new int[nuInfoTextByteSize]; for (int j = 0; j < nuInfoTextByteSize; j++) { InfoText[j] = buffer.ReadBits(8); } } int nuBitResolution = buffer.ReadBits(5) + 1; int nuMaxSampleRate = buffer.ReadBits(4); int nuTotalNumChs = buffer.ReadBits(8) + 1; int bOne2OneMapChannels2Speakers = buffer.ReadBits(1); int nuSpkrActivityMask = 0; if (1 == bOne2OneMapChannels2Speakers) { int bEmbeddedStereoFlag = 0; if (nuTotalNumChs > 2) { bEmbeddedStereoFlag = buffer.ReadBits(1); } int bEmbeddedSixChFlag = 0; if (nuTotalNumChs > 6) { bEmbeddedSixChFlag = buffer.ReadBits(1); } int bSpkrMaskEnabled = buffer.ReadBits(1); int nuNumBits4SAMask = 0; if (1 == bSpkrMaskEnabled) { nuNumBits4SAMask = buffer.ReadBits(2); nuNumBits4SAMask = nuNumBits4SAMask * 4 + 4; nuSpkrActivityMask = buffer.ReadBits(nuNumBits4SAMask); } // TODO... } stream.SampleRate = SampleRates[nuMaxSampleRate]; stream.BitDepth = nuBitResolution; stream.LFE = 0; if ((nuSpkrActivityMask & 0x8) == 0x8) { ++stream.LFE; } if ((nuSpkrActivityMask & 0x1000) == 0x1000) { ++stream.LFE; } stream.ChannelCount = nuTotalNumChs - stream.LFE; } if (nuNumAssets > 1) { // TODO... break; } } // TODO if (stream.CoreStream != null) { TSAudioStream coreStream = (TSAudioStream)stream.CoreStream; if (coreStream.AudioMode == TSAudioMode.Extended && stream.ChannelCount == 5) { stream.AudioMode = TSAudioMode.Extended; } /* * if (coreStream.DialNorm != 0) * { * stream.DialNorm = coreStream.DialNorm; * } */ } if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO) { stream.IsVBR = true; stream.IsInitialized = true; } else if (bitrate > 0) { stream.IsVBR = false; stream.BitRate = bitrate; if (stream.CoreStream != null) { stream.BitRate += stream.CoreStream.BitRate; stream.IsInitialized = true; } stream.IsInitialized = (stream.BitRate > 0 ? true : false); } }
public static void Scan(TSAudioStream stream, TSStreamBuffer buffer, long bitrate, ref string tag) { if (stream.IsInitialized && (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO || (stream.CoreStream != null && stream.CoreStream.IsInitialized))) { return; } var syncFound = false; uint sync = 0; for (var i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x64582025) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream { StreamType = TSStreamType.DTS_AUDIO }; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecDTS.Scan(stream.CoreStream, buffer, bitrate, ref tag); } return; } tag = "HD"; buffer.BSSkipBits(8); var nuSubStreamIndex = buffer.ReadBits4(2); var bBlownUpHeader = buffer.ReadBool(); buffer.BSSkipBits(bBlownUpHeader ? 32 : 24); var nuNumAssets = 1; var bStaticFieldsPresent = buffer.ReadBool(); if (bStaticFieldsPresent) { buffer.BSSkipBits(5); if (buffer.ReadBool()) { buffer.BSSkipBits(36); } var nuNumAudioPresent = buffer.ReadBits2(3) + 1; nuNumAssets = buffer.ReadBits2(3) + 1; var nuActiveExSsMask = new uint[nuNumAudioPresent]; for (var i = 0; i < nuNumAudioPresent; i++) { nuActiveExSsMask[i] = buffer.ReadBits4((int)(nuSubStreamIndex + 1)); //? } for (var i = 0; i < nuNumAudioPresent; i++) { for (var j = 0; j < nuSubStreamIndex + 1; j++) { if (((j + 1) % 2) == 1) { buffer.BSSkipBits(8); } } } if (buffer.ReadBool()) { buffer.BSSkipBits(2); var nuBits4MixOutMask = buffer.ReadBits2(2) * 4 + 4; var nuNumMixOutConfigs = buffer.ReadBits2(2) + 1; var nuMixOutChMask = new uint[nuNumMixOutConfigs]; for (var i = 0; i < nuNumMixOutConfigs; i++) { nuMixOutChMask[i] = buffer.ReadBits4(nuBits4MixOutMask); } } } var assetSizes = new uint[nuNumAssets]; for (var i = 0; i < nuNumAssets; i++) { if (bBlownUpHeader) { assetSizes[i] = buffer.ReadBits4(20) + 1; } else { assetSizes[i] = buffer.ReadBits4(16) + 1; } } for (var i = 0; i < nuNumAssets; i++) { buffer.BSSkipBits(12); if (bStaticFieldsPresent) { if (buffer.ReadBool()) { buffer.BSSkipBits(4); } if (buffer.ReadBool()) { buffer.BSSkipBits(24); } if (buffer.ReadBool()) { var nuInfoTextByteSize = buffer.ReadBits2(10) + 1; var infoText = new ushort[nuInfoTextByteSize]; for (var j = 0; j < nuInfoTextByteSize; j++) { infoText[j] = buffer.ReadBits2(8); } } var nuBitResolution = buffer.ReadBits2(5) + 1; int nuMaxSampleRate = buffer.ReadBits2(4); var nuTotalNumChs = buffer.ReadBits2(8) + 1; uint nuSpkrActivityMask = 0; if (buffer.ReadBool()) { if (nuTotalNumChs > 2) { buffer.BSSkipBits(1); } if (nuTotalNumChs > 6) { buffer.BSSkipBits(1); } if (buffer.ReadBool()) { int nuNumBits4SAMask = buffer.ReadBits2(2); nuNumBits4SAMask = nuNumBits4SAMask * 4 + 4; nuSpkrActivityMask = buffer.ReadBits4(nuNumBits4SAMask); } // TODO... } stream.SampleRate = SampleRates[nuMaxSampleRate]; stream.BitDepth = nuBitResolution; stream.LFE = 0; if ((nuSpkrActivityMask & 0x8) == 0x8) { ++stream.LFE; } if ((nuSpkrActivityMask & 0x1000) == 0x1000) { ++stream.LFE; } stream.ChannelCount = nuTotalNumChs - stream.LFE; } if (nuNumAssets > 1) { // TODO... break; } } uint temp2 = 0; while (buffer.Position < buffer.Length) { temp2 = (temp2 << 8) + buffer.ReadByte(); switch (temp2) { case 0x41A29547: // XLL Extended data case 0x655E315E: // XBR Extended data case 0x0A801921: // XSA Extended data case 0x1D95F262: // X96k case 0x47004A03: // XXch case 0x5A5A5A5A: // Xch int temp3 = 0; for (var i = (int)buffer.Position; i < buffer.Length; i++) { temp3 = (temp3 << 8) + buffer.ReadByte(); if (temp3 == 0x02000850) //DTS:X Pattern { stream.HasExtensions = true; break; } } break; } if (stream.HasExtensions) { break; } } // TODO if (stream.CoreStream != null) { var coreStream = (TSAudioStream)stream.CoreStream; if (coreStream.AudioMode == TSAudioMode.Extended && stream.ChannelCount == 5) { stream.AudioMode = TSAudioMode.Extended; } /* * if (coreStream.DialNorm != 0) * { * stream.DialNorm = coreStream.DialNorm; * } */ } if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO) { stream.IsVBR = true; stream.IsInitialized = true; } else if (bitrate > 0) { stream.IsVBR = false; stream.BitRate = bitrate; if (stream.CoreStream != null) { stream.BitRate += stream.CoreStream.BitRate; stream.IsInitialized = true; } stream.IsInitialized = (stream.BitRate > 0); } }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, ref string tag) { if (stream.IsInitialized && stream.CoreStream != null && stream.CoreStream.IsInitialized) { return; } bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0xF8726FBA) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream(); stream.CoreStream.StreamType = TSStreamType.AC3_AUDIO; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecAC3.Scan(stream.CoreStream, buffer, ref tag); } return; } tag = "HD"; int ratebits = buffer.ReadBits(4); if (ratebits != 0xF) { stream.SampleRate = (((ratebits & 8) > 0 ? 44100 : 48000) << (ratebits & 7)); } int temp1 = buffer.ReadBits(8); int channels_thd_stream1 = buffer.ReadBits(5); int temp2 = buffer.ReadBits(2); stream.ChannelCount = 0; stream.LFE = 0; int c_LFE2 = buffer.ReadBits(1); if (c_LFE2 == 1) { stream.LFE += 1; } int c_Cvh = buffer.ReadBits(1); if (c_Cvh == 1) { stream.ChannelCount += 1; } int c_LRw = buffer.ReadBits(1); if (c_LRw == 1) { stream.ChannelCount += 2; } int c_LRsd = buffer.ReadBits(1); if (c_LRsd == 1) { stream.ChannelCount += 2; } int c_Ts = buffer.ReadBits(1); if (c_Ts == 1) { stream.ChannelCount += 1; } int c_Cs = buffer.ReadBits(1); if (c_Cs == 1) { stream.ChannelCount += 1; } int c_LRrs = buffer.ReadBits(1); if (c_LRrs == 1) { stream.ChannelCount += 2; } int c_LRc = buffer.ReadBits(1); if (c_LRc == 1) { stream.ChannelCount += 2; } int c_LRvh = buffer.ReadBits(1); if (c_LRvh == 1) { stream.ChannelCount += 2; } int c_LRs = buffer.ReadBits(1); if (c_LRs == 1) { stream.ChannelCount += 2; } int c_LFE = buffer.ReadBits(1); if (c_LFE == 1) { stream.LFE += 1; } int c_C = buffer.ReadBits(1); if (c_C == 1) { stream.ChannelCount += 1; } int c_LR = buffer.ReadBits(1); if (c_LR == 1) { stream.ChannelCount += 2; } int access_unit_size = 40 << (ratebits & 7); int access_unit_size_pow2 = 64 << (ratebits & 7); int a1 = buffer.ReadBits(16); int a2 = buffer.ReadBits(16); int a3 = buffer.ReadBits(16); int is_vbr = buffer.ReadBits(1); int peak_bitrate = buffer.ReadBits(15); peak_bitrate = (peak_bitrate * stream.SampleRate) >> 4; double peak_bitdepth = (double)peak_bitrate / (stream.ChannelCount + stream.LFE) / stream.SampleRate; if (peak_bitdepth > 14) { stream.BitDepth = 24; } else { stream.BitDepth = 16; } #if DEBUG System.Diagnostics.Debug.WriteLine(string.Format( "{0}\t{1}\t{2:F2}", stream.PID, peak_bitrate, peak_bitdepth)); #endif /* * // TODO: Get THD dialnorm from metadata * if (stream.CoreStream != null) * { * TSAudioStream coreStream = (TSAudioStream)stream.CoreStream; * if (coreStream.DialNorm != 0) * { * stream.DialNorm = coreStream.DialNorm; * } * } */ stream.IsVBR = true; stream.IsInitialized = true; }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, long bitrate, ref string tag) { if (stream.IsInitialized && (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO || (stream.CoreStream != null && stream.CoreStream.IsInitialized))) return; bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x64582025) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream(); stream.CoreStream.StreamType = TSStreamType.DTS_AUDIO; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecDTS.Scan(stream.CoreStream, buffer, bitrate, ref tag); } return; } tag = "HD"; int temp1 = buffer.ReadBits(8); int nuSubStreamIndex = buffer.ReadBits(2); int nuExtSSHeaderSize = 0; int nuExtSSFSize = 0; int bBlownUpHeader = buffer.ReadBits(1); if (1 == bBlownUpHeader) { nuExtSSHeaderSize = buffer.ReadBits(12) + 1; nuExtSSFSize = buffer.ReadBits(20) + 1; } else { nuExtSSHeaderSize = buffer.ReadBits(8) + 1; nuExtSSFSize = buffer.ReadBits(16) + 1; } int nuNumAudioPresent = 1; int nuNumAssets = 1; int bStaticFieldsPresent = buffer.ReadBits(1); if (1 == bStaticFieldsPresent) { int nuRefClockCode = buffer.ReadBits(2); int nuExSSFrameDurationCode = buffer.ReadBits(3) + 1; long nuTimeStamp = 0; if (1 == buffer.ReadBits(1)) { nuTimeStamp = (buffer.ReadBits(18) << 18) + buffer.ReadBits(18); } nuNumAudioPresent = buffer.ReadBits(3) + 1; nuNumAssets = buffer.ReadBits(3) + 1; int[] nuActiveExSSMask = new int[nuNumAudioPresent]; for (int i = 0; i < nuNumAudioPresent; i++) { nuActiveExSSMask[i] = buffer.ReadBits(nuSubStreamIndex + 1); //? } for (int i = 0; i < nuNumAudioPresent; i++) { for (int j = 0; j < nuSubStreamIndex + 1; j++) { if (((j + 1) % 2) == 1) { int mask = buffer.ReadBits(8); } } } if (1 == buffer.ReadBits(1)) { int nuMixMetadataAdjLevel = buffer.ReadBits(2); int nuBits4MixOutMask = buffer.ReadBits(2) * 4 + 4; int nuNumMixOutConfigs = buffer.ReadBits(2) + 1; int[] nuMixOutChMask = new int[nuNumMixOutConfigs]; for (int i = 0; i < nuNumMixOutConfigs; i++) { nuMixOutChMask[i] = buffer.ReadBits(nuBits4MixOutMask); } } } int[] AssetSizes = new int[nuNumAssets]; for (int i = 0; i < nuNumAssets; i++) { if (1 == bBlownUpHeader) { AssetSizes[i] = buffer.ReadBits(20) + 1; } else { AssetSizes[i] = buffer.ReadBits(16) + 1; } } for (int i = 0; i < nuNumAssets; i++) { long bufferPosition = buffer.Position; int nuAssetDescriptorFSIZE = buffer.ReadBits(9) + 1; int DescriptorDataForAssetIndex = buffer.ReadBits(3); if (1 == bStaticFieldsPresent) { int AssetTypeDescrPresent = buffer.ReadBits(1); if (1 == AssetTypeDescrPresent) { int AssetTypeDescriptor = buffer.ReadBits(4); } int LanguageDescrPresent = buffer.ReadBits(1); if (1 == LanguageDescrPresent) { int LanguageDescriptor = buffer.ReadBits(24); } int bInfoTextPresent = buffer.ReadBits(1); if (1 == bInfoTextPresent) { int nuInfoTextByteSize = buffer.ReadBits(10) + 1; int[] InfoText = new int[nuInfoTextByteSize]; for (int j = 0; j < nuInfoTextByteSize; j++) { InfoText[j] = buffer.ReadBits(8); } } int nuBitResolution = buffer.ReadBits(5) + 1; int nuMaxSampleRate = buffer.ReadBits(4); int nuTotalNumChs = buffer.ReadBits(8) + 1; int bOne2OneMapChannels2Speakers = buffer.ReadBits(1); int nuSpkrActivityMask = 0; if (1 == bOne2OneMapChannels2Speakers) { int bEmbeddedStereoFlag = 0; if (nuTotalNumChs > 2) { bEmbeddedStereoFlag = buffer.ReadBits(1); } int bEmbeddedSixChFlag = 0; if (nuTotalNumChs > 6) { bEmbeddedSixChFlag = buffer.ReadBits(1); } int bSpkrMaskEnabled = buffer.ReadBits(1); int nuNumBits4SAMask = 0; if (1 == bSpkrMaskEnabled) { nuNumBits4SAMask = buffer.ReadBits(2); nuNumBits4SAMask = nuNumBits4SAMask * 4 + 4; nuSpkrActivityMask = buffer.ReadBits(nuNumBits4SAMask); } // TODO... } stream.SampleRate = SampleRates[nuMaxSampleRate]; stream.BitDepth = nuBitResolution; stream.LFE = 0; if ((nuSpkrActivityMask & 0x8) == 0x8) { ++stream.LFE; } if ((nuSpkrActivityMask & 0x1000) == 0x1000) { ++stream.LFE; } stream.ChannelCount = nuTotalNumChs - stream.LFE; } if (nuNumAssets > 1) { // TODO... break; } } // TODO if (stream.CoreStream != null) { TSAudioStream coreStream = (TSAudioStream)stream.CoreStream; if (coreStream.AudioMode == TSAudioMode.Extended && stream.ChannelCount == 5) { stream.AudioMode = TSAudioMode.Extended; } /* if (coreStream.DialNorm != 0) { stream.DialNorm = coreStream.DialNorm; } */ } if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO) { stream.IsVBR = true; stream.IsInitialized = true; } else if (bitrate > 0) { stream.IsVBR = false; stream.BitRate = bitrate; if (stream.CoreStream != null) { stream.BitRate += stream.CoreStream.BitRate; stream.IsInitialized = true; } stream.IsInitialized = (stream.BitRate > 0 ? true : false); } }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, ref string tag) { if (stream.IsInitialized && stream.CoreStream != null && stream.CoreStream.IsInitialized) return; bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0xF8726FBA) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream(); stream.CoreStream.StreamType = TSStreamType.AC3_AUDIO; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecAC3.Scan(stream.CoreStream, buffer, ref tag); } return; } tag = "HD"; int ratebits = buffer.ReadBits(4); if (ratebits != 0xF) { stream.SampleRate = (((ratebits & 8) > 0 ? 44100 : 48000) << (ratebits & 7)); } int temp1 = buffer.ReadBits(8); int channels_thd_stream1 = buffer.ReadBits(5); int temp2 = buffer.ReadBits(2); stream.ChannelCount = 0; stream.LFE = 0; int c_LFE2 = buffer.ReadBits(1); if (c_LFE2 == 1) { stream.LFE += 1; } int c_Cvh = buffer.ReadBits(1); if (c_Cvh == 1) { stream.ChannelCount += 1; } int c_LRw = buffer.ReadBits(1); if (c_LRw == 1) { stream.ChannelCount += 2; } int c_LRsd = buffer.ReadBits(1); if (c_LRsd == 1) { stream.ChannelCount += 2; } int c_Ts = buffer.ReadBits(1); if (c_Ts == 1) { stream.ChannelCount += 1; } int c_Cs = buffer.ReadBits(1); if (c_Cs == 1) { stream.ChannelCount += 1; } int c_LRrs = buffer.ReadBits(1); if (c_LRrs == 1) { stream.ChannelCount += 2; } int c_LRc = buffer.ReadBits(1); if (c_LRc == 1) { stream.ChannelCount += 2; } int c_LRvh = buffer.ReadBits(1); if (c_LRvh == 1) { stream.ChannelCount += 2; } int c_LRs = buffer.ReadBits(1); if (c_LRs == 1) { stream.ChannelCount += 2; } int c_LFE = buffer.ReadBits(1); if (c_LFE == 1) { stream.LFE += 1; } int c_C = buffer.ReadBits(1); if (c_C == 1) { stream.ChannelCount += 1; } int c_LR = buffer.ReadBits(1); if (c_LR == 1) { stream.ChannelCount += 2; } int access_unit_size = 40 << (ratebits & 7); int access_unit_size_pow2 = 64 << (ratebits & 7); buffer.ReadBits(24); buffer.ReadBits(24); int is_vbr = buffer.ReadBits(1); int peak_bitrate = buffer.ReadBits(15); peak_bitrate = (peak_bitrate * stream.SampleRate) >> 4; double peak_bitdepth = (double)peak_bitrate / (stream.ChannelCount + stream.LFE) / stream.SampleRate; if (peak_bitdepth > 14) { stream.BitDepth = 24; } else { stream.BitDepth = 16; } #if DEBUG System.Diagnostics.Debug.WriteLine(string.Format( "{0}\t{1}\t{2:F2}", stream.PID, peak_bitrate, peak_bitdepth)); #endif stream.IsVBR = true; stream.IsInitialized = true; }
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; }
public void Scan(TSAudioStream stream, TSStreamBuffer buffer, ref string tag, long?bitrate) { if (stream.IsInitialized && stream.CoreStream != null && stream.CoreStream.IsInitialized) { return; } var syncFound = false; uint sync = 0; for (var i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0xF8726FBA) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; stream.CoreStream ??= new TSAudioStream { StreamType = TSStreamType.AC3_AUDIO }; if (stream.CoreStream.IsInitialized) { return; } buffer.BeginRead(); (new TSCodecAC3()).Scan(stream.CoreStream, buffer, ref tag, bitrate); return; } tag = "HD"; int ratebits = buffer.ReadBits2(4); if (ratebits != 0xF) { stream.SampleRate = ((ratebits & 8) > 0 ? 44100 : 48000) << (ratebits & 7); } buffer.BSSkipBits(15); stream.ChannelCount = 0; stream.LFE = 0; if (buffer.ReadBool()) { stream.LFE += 1; } if (buffer.ReadBool()) { stream.ChannelCount += 1; } if (buffer.ReadBool()) { stream.ChannelCount += 2; } if (buffer.ReadBool()) { stream.ChannelCount += 2; } if (buffer.ReadBool()) { stream.ChannelCount += 1; } if (buffer.ReadBool()) { stream.ChannelCount += 1; } if (buffer.ReadBool()) { stream.ChannelCount += 2; } if (buffer.ReadBool()) { stream.ChannelCount += 2; } if (buffer.ReadBool()) { stream.ChannelCount += 2; } if (buffer.ReadBool()) { stream.ChannelCount += 2; } if (buffer.ReadBool()) { stream.LFE += 1; } if (buffer.ReadBool()) { stream.ChannelCount += 1; } if (buffer.ReadBool()) { stream.ChannelCount += 2; } buffer.BSSkipBits(49); var peakBitrate = buffer.ReadBits4(15); peakBitrate = (uint)((peakBitrate * stream.SampleRate) >> 4); var peakBitdepth = (double)peakBitrate / (stream.ChannelCount + stream.LFE) / stream.SampleRate; stream.BitDepth = peakBitdepth > 14 ? 24 : 16; buffer.BSSkipBits(79); var hasExtensions = buffer.ReadBool(); var numExtensions = buffer.ReadBits2(4) * 2 + 1; var hasContent = Convert.ToBoolean(buffer.ReadBits4(4)); if (hasExtensions) { for (var idx = 0; idx < numExtensions; ++idx) { if (Convert.ToBoolean(buffer.ReadBits2(8))) { hasContent = true; } } if (hasContent) { stream.HasExtensions = true; } } #if DEBUG Debug.WriteLine($"{stream.PID}\t{peakBitrate}\t{peakBitdepth:F2}"); #endif /* * // TODO: Get THD dialnorm from metadata * if (stream.CoreStream != null) * { * TSAudioStream coreStream = (TSAudioStream)stream.CoreStream; * if (coreStream.DialNorm != 0) * { * stream.DialNorm = coreStream.DialNorm; * } * } */ stream.IsVBR = true; if (stream.CoreStream != null && stream.CoreStream.IsInitialized) { stream.IsInitialized = true; } }