123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- //============================================================================
- // 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)
- {
- 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 ? true : false);
- }
- }
- }
- }
|