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