diff options
Diffstat (limited to 'BDInfo/TSCodecDTSHD.cs')
| -rw-r--r-- | BDInfo/TSCodecDTSHD.cs | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/BDInfo/TSCodecDTSHD.cs b/BDInfo/TSCodecDTSHD.cs new file mode 100644 index 000000000..169a8077f --- /dev/null +++ b/BDInfo/TSCodecDTSHD.cs @@ -0,0 +1,246 @@ +//============================================================================ +// BDInfo - Blu-ray Video and Audio Analysis Tool +// Copyright © 2010 Cinema Squid +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//============================================================================= + + +namespace BDInfo +{ + public abstract class TSCodecDTSHD + { + private static int[] SampleRates = new int[] + { 0x1F40, 0x3E80, 0x7D00, 0x0FA00, 0x1F400, 0x5622, 0x0AC44, 0x15888, 0x2B110, 0x56220, 0x2EE0, 0x5DC0, 0x0BB80, 0x17700, 0x2EE00, 0x5DC00 }; + + 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); + } + } + } +} |
