| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | //============================================================================// 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 TSCodecLPCM    {        public static void Scan(            TSAudioStream stream,            TSStreamBuffer buffer,            ref string tag)        {            if (stream.IsInitialized) return;            byte[] header = buffer.ReadBytes(4);            int flags = (header[2] << 8) + header[3];            switch ((flags & 0xF000) >> 12)            {                case 1: // 1/0/0                    stream.ChannelCount = 1;                    stream.LFE = 0;                    break;                case 3: // 2/0/0                    stream.ChannelCount = 2;                    stream.LFE = 0;                    break;                case 4: // 3/0/0                    stream.ChannelCount = 3;                    stream.LFE = 0;                    break;                case 5: // 2/1/0                    stream.ChannelCount = 3;                    stream.LFE = 0;                    break;                case 6: // 3/1/0                    stream.ChannelCount = 4;                    stream.LFE = 0;                    break;                case 7: // 2/2/0                    stream.ChannelCount = 4;                    stream.LFE = 0;                    break;                case 8: // 3/2/0                    stream.ChannelCount = 5;                    stream.LFE = 0;                    break;                case 9: // 3/2/1                    stream.ChannelCount = 5;                    stream.LFE = 1;                    break;                case 10: // 3/4/0                    stream.ChannelCount = 7;                    stream.LFE = 0;                    break;                case 11: // 3/4/1                    stream.ChannelCount = 7;                    stream.LFE = 1;                    break;                default:                    stream.ChannelCount = 0;                    stream.LFE = 0;                    break;            }            switch ((flags & 0xC0) >> 6)            {                case 1:                    stream.BitDepth = 16;                    break;                case 2:                    stream.BitDepth = 20;                    break;                case 3:                    stream.BitDepth = 24;                    break;                default:                    stream.BitDepth = 0;                    break;            }            switch ((flags & 0xF00) >> 8)            {                case 1:                    stream.SampleRate = 48000;                    break;                case 4:                    stream.SampleRate = 96000;                    break;                case 5:                    stream.SampleRate = 192000;                    break;                default:                    stream.SampleRate = 0;                    break;            }            stream.BitRate = (uint)                (stream.SampleRate * stream.BitDepth *                 (stream.ChannelCount + stream.LFE));            stream.IsVBR = false;            stream.IsInitialized = true;        }    }}
 |