| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801 | //============================================================================// 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//=============================================================================using System;using System.Collections.Generic;namespace BDInfo{    public enum TSStreamType : byte    {        Unknown = 0,        MPEG1_VIDEO = 0x01,        MPEG2_VIDEO = 0x02,        AVC_VIDEO = 0x1b,        MVC_VIDEO = 0x20,        VC1_VIDEO = 0xea,        MPEG1_AUDIO = 0x03,        MPEG2_AUDIO = 0x04,        LPCM_AUDIO = 0x80,        AC3_AUDIO = 0x81,        AC3_PLUS_AUDIO = 0x84,        AC3_PLUS_SECONDARY_AUDIO = 0xA1,        AC3_TRUE_HD_AUDIO = 0x83,        DTS_AUDIO = 0x82,        DTS_HD_AUDIO = 0x85,        DTS_HD_SECONDARY_AUDIO = 0xA2,        DTS_HD_MASTER_AUDIO = 0x86,        PRESENTATION_GRAPHICS = 0x90,        INTERACTIVE_GRAPHICS = 0x91,        SUBTITLE = 0x92    }    public enum TSVideoFormat : byte    {        Unknown = 0,        VIDEOFORMAT_480i = 1,        VIDEOFORMAT_576i = 2,        VIDEOFORMAT_480p = 3,        VIDEOFORMAT_1080i = 4,        VIDEOFORMAT_720p = 5,        VIDEOFORMAT_1080p = 6,        VIDEOFORMAT_576p = 7,    }    public enum TSFrameRate : byte    {        Unknown = 0,        FRAMERATE_23_976 = 1,        FRAMERATE_24 = 2,        FRAMERATE_25 = 3,        FRAMERATE_29_97 = 4,        FRAMERATE_50 = 6,        FRAMERATE_59_94 = 7    }    public enum TSChannelLayout : byte    {        Unknown = 0,        CHANNELLAYOUT_MONO = 1,        CHANNELLAYOUT_STEREO = 3,        CHANNELLAYOUT_MULTI = 6,        CHANNELLAYOUT_COMBO = 12    }    public enum TSSampleRate : byte    {        Unknown = 0,        SAMPLERATE_48 = 1,        SAMPLERATE_96 = 4,        SAMPLERATE_192 = 5,        SAMPLERATE_48_192 = 12,        SAMPLERATE_48_96 = 14    }    public enum TSAspectRatio    {        Unknown = 0,        ASPECT_4_3 = 2,        ASPECT_16_9 = 3,        ASPECT_2_21 = 4    }    public class TSDescriptor    {        public byte Name;        public byte[] Value;        public TSDescriptor(byte name, byte length)        {            Name = name;            Value = new byte[length];        }        public TSDescriptor Clone()        {            TSDescriptor descriptor =                 new TSDescriptor(Name, (byte)Value.Length);            Value.CopyTo(descriptor.Value, 0);            return descriptor;        }    }    public abstract class TSStream    {        public TSStream()        {        }        public override string ToString()        {            return string.Format("{0} ({1})", CodecShortName, PID);        }        public ushort PID;        public TSStreamType StreamType;        public List<TSDescriptor> Descriptors = null;        public long BitRate = 0;        public long ActiveBitRate = 0;        public bool IsVBR = false;        public bool IsInitialized = false;        public string LanguageName;        public bool IsHidden = false;        public ulong PayloadBytes = 0;        public ulong PacketCount = 0;        public double PacketSeconds = 0;        public int AngleIndex = 0;        public ulong PacketSize        {            get            {                return PacketCount * 192;            }        }        private string _LanguageCode;        public string LanguageCode        {            get             {                return _LanguageCode;             }            set             {                _LanguageCode = value;                LanguageName = LanguageCodes.GetName(value);            }         }        public bool IsVideoStream        {            get            {                switch (StreamType)                {                    case TSStreamType.MPEG1_VIDEO:                    case TSStreamType.MPEG2_VIDEO:                    case TSStreamType.AVC_VIDEO:                    case TSStreamType.MVC_VIDEO:                    case TSStreamType.VC1_VIDEO:                        return true;                    default:                        return false;                }            }        }        public bool IsAudioStream        {            get            {                switch (StreamType)                {                    case TSStreamType.MPEG1_AUDIO:                    case TSStreamType.MPEG2_AUDIO:                    case TSStreamType.LPCM_AUDIO:                    case TSStreamType.AC3_AUDIO:                    case TSStreamType.AC3_PLUS_AUDIO:                    case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:                    case TSStreamType.AC3_TRUE_HD_AUDIO:                    case TSStreamType.DTS_AUDIO:                    case TSStreamType.DTS_HD_AUDIO:                    case TSStreamType.DTS_HD_SECONDARY_AUDIO:                    case TSStreamType.DTS_HD_MASTER_AUDIO:                        return true;                    default:                        return false;                }            }        }        public bool IsGraphicsStream        {            get            {                switch (StreamType)                {                    case TSStreamType.PRESENTATION_GRAPHICS:                    case TSStreamType.INTERACTIVE_GRAPHICS:                        return true;                    default:                        return false;                }            }        }        public bool IsTextStream        {            get            {                switch (StreamType)                {                    case TSStreamType.SUBTITLE:                        return true;                    default:                        return false;                }            }        }        public string CodecName        {            get            {                switch (StreamType)                {                    case TSStreamType.MPEG1_VIDEO:                        return "MPEG-1 Video";                    case TSStreamType.MPEG2_VIDEO:                        return "MPEG-2 Video";                    case TSStreamType.AVC_VIDEO:                        return "MPEG-4 AVC Video";                    case TSStreamType.MVC_VIDEO:                        return "MPEG-4 MVC Video";                    case TSStreamType.VC1_VIDEO:                        return "VC-1 Video";                    case TSStreamType.MPEG1_AUDIO:                        return "MP1 Audio";                    case TSStreamType.MPEG2_AUDIO:                        return "MP2 Audio";                    case TSStreamType.LPCM_AUDIO:                        return "LPCM Audio";                    case TSStreamType.AC3_AUDIO:                        if (((TSAudioStream)this).AudioMode == TSAudioMode.Extended)                            return "Dolby Digital EX Audio";                        else                            return "Dolby Digital Audio";                    case TSStreamType.AC3_PLUS_AUDIO:                    case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:                        return "Dolby Digital Plus Audio";                    case TSStreamType.AC3_TRUE_HD_AUDIO:                        return "Dolby TrueHD Audio";                    case TSStreamType.DTS_AUDIO:                        if (((TSAudioStream)this).AudioMode == TSAudioMode.Extended)                            return "DTS-ES Audio";                        else                            return "DTS Audio";                    case TSStreamType.DTS_HD_AUDIO:                        return "DTS-HD High-Res Audio";                    case TSStreamType.DTS_HD_SECONDARY_AUDIO:                        return "DTS Express";                    case TSStreamType.DTS_HD_MASTER_AUDIO:                        return "DTS-HD Master Audio";                    case TSStreamType.PRESENTATION_GRAPHICS:                        return "Presentation Graphics";                    case TSStreamType.INTERACTIVE_GRAPHICS:                        return "Interactive Graphics";                    case TSStreamType.SUBTITLE:                        return "Subtitle";                    default:                        return "UNKNOWN";                }            }        }        public string CodecAltName        {            get            {                switch (StreamType)                {                    case TSStreamType.MPEG1_VIDEO:                        return "MPEG-1";                    case TSStreamType.MPEG2_VIDEO:                        return "MPEG-2";                    case TSStreamType.AVC_VIDEO:                        return "AVC";                    case TSStreamType.MVC_VIDEO:                        return "MVC";                    case TSStreamType.VC1_VIDEO:                        return "VC-1";                    case TSStreamType.MPEG1_AUDIO:                        return "MP1";                    case TSStreamType.MPEG2_AUDIO:                        return "MP2";                    case TSStreamType.LPCM_AUDIO:                        return "LPCM";                    case TSStreamType.AC3_AUDIO:                        return "DD AC3";                    case TSStreamType.AC3_PLUS_AUDIO:                    case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:                        return "DD AC3+";                    case TSStreamType.AC3_TRUE_HD_AUDIO:                        return "Dolby TrueHD";                    case TSStreamType.DTS_AUDIO:                        return "DTS";                    case TSStreamType.DTS_HD_AUDIO:                        return "DTS-HD Hi-Res";                    case TSStreamType.DTS_HD_SECONDARY_AUDIO:                        return "DTS Express";                    case TSStreamType.DTS_HD_MASTER_AUDIO:                        return "DTS-HD Master";                    case TSStreamType.PRESENTATION_GRAPHICS:                        return "PGS";                    case TSStreamType.INTERACTIVE_GRAPHICS:                        return "IGS";                    case TSStreamType.SUBTITLE:                        return "SUB";                    default:                        return "UNKNOWN";                }            }        }        public string CodecShortName        {            get            {                switch (StreamType)                {                    case TSStreamType.MPEG1_VIDEO:                        return "MPEG-1";                    case TSStreamType.MPEG2_VIDEO:                        return "MPEG-2";                    case TSStreamType.AVC_VIDEO:                        return "AVC";                    case TSStreamType.MVC_VIDEO:                        return "MVC";                    case TSStreamType.VC1_VIDEO:                        return "VC-1";                    case TSStreamType.MPEG1_AUDIO:                        return "MP1";                    case TSStreamType.MPEG2_AUDIO:                        return "MP2";                    case TSStreamType.LPCM_AUDIO:                        return "LPCM";                    case TSStreamType.AC3_AUDIO:                        if (((TSAudioStream)this).AudioMode == TSAudioMode.Extended)                            return "AC3-EX";                        else                            return "AC3";                    case TSStreamType.AC3_PLUS_AUDIO:                    case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:                        return "AC3+";                    case TSStreamType.AC3_TRUE_HD_AUDIO:                        return "TrueHD";                    case TSStreamType.DTS_AUDIO:                        if (((TSAudioStream)this).AudioMode == TSAudioMode.Extended)                            return "DTS-ES";                        else                            return "DTS";                    case TSStreamType.DTS_HD_AUDIO:                        return "DTS-HD HR";                    case TSStreamType.DTS_HD_SECONDARY_AUDIO:                        return "DTS Express";                    case TSStreamType.DTS_HD_MASTER_AUDIO:                        return "DTS-HD MA";                    case TSStreamType.PRESENTATION_GRAPHICS:                        return "PGS";                    case TSStreamType.INTERACTIVE_GRAPHICS:                        return "IGS";                    case TSStreamType.SUBTITLE:                        return "SUB";                    default:                        return "UNKNOWN";                }            }        }        public virtual string Description        {            get            {                return "";            }        }        public abstract TSStream Clone();                protected void CopyTo(TSStream stream)        {            stream.PID = PID;            stream.StreamType = StreamType;            stream.IsVBR = IsVBR;            stream.BitRate = BitRate;            stream.IsInitialized = IsInitialized;            stream.LanguageCode = _LanguageCode;            if (Descriptors != null)            {                stream.Descriptors = new List<TSDescriptor>();                foreach (TSDescriptor descriptor in Descriptors)                {                    stream.Descriptors.Add(descriptor.Clone());                }            }        }    }    public class TSVideoStream : TSStream    {        public TSVideoStream()        {        }        public int Width;        public int Height;        public bool IsInterlaced;                public int FrameRateEnumerator;        public int FrameRateDenominator;        public TSAspectRatio AspectRatio;        public string EncodingProfile;        private TSVideoFormat _VideoFormat;        public TSVideoFormat VideoFormat        {            get            {                return _VideoFormat;            }            set            {                _VideoFormat = value;                switch (value)                {                    case TSVideoFormat.VIDEOFORMAT_480i:                        Height = 480;                        IsInterlaced = true;                        break;                    case TSVideoFormat.VIDEOFORMAT_480p:                        Height = 480;                        IsInterlaced = false;                        break;                    case TSVideoFormat.VIDEOFORMAT_576i:                        Height = 576;                        IsInterlaced = true;                        break;                    case TSVideoFormat.VIDEOFORMAT_576p:                        Height = 576;                        IsInterlaced = false;                        break;                    case TSVideoFormat.VIDEOFORMAT_720p:                        Height = 720;                        IsInterlaced = false;                        break;                    case TSVideoFormat.VIDEOFORMAT_1080i:                        Height = 1080;                        IsInterlaced = true;                        break;                    case TSVideoFormat.VIDEOFORMAT_1080p:                        Height = 1080;                        IsInterlaced = false;                        break;                }            }        }        private TSFrameRate _FrameRate;        public TSFrameRate FrameRate        {            get            {                return _FrameRate;            }            set            {                _FrameRate = value;                switch (value)                {                    case TSFrameRate.FRAMERATE_23_976:                        FrameRateEnumerator = 24000;                        FrameRateDenominator = 1001;                        break;                    case TSFrameRate.FRAMERATE_24:                        FrameRateEnumerator = 24000;                        FrameRateDenominator = 1000;                        break;                    case TSFrameRate.FRAMERATE_25:                        FrameRateEnumerator = 25000;                        FrameRateDenominator = 1000;                        break;                    case TSFrameRate.FRAMERATE_29_97:                        FrameRateEnumerator = 30000;                        FrameRateDenominator = 1001;                        break;                    case TSFrameRate.FRAMERATE_50:                        FrameRateEnumerator = 50000;                        FrameRateDenominator = 1000;                        break;                    case TSFrameRate.FRAMERATE_59_94:                        FrameRateEnumerator = 60000;                        FrameRateDenominator = 1001;                        break;                }            }        }        public override string Description        {            get            {                string description = "";                if (Height > 0)                {                    description += string.Format("{0:D}{1} / ",                        Height,                        IsInterlaced ? "i" : "p");                }                if (FrameRateEnumerator > 0 &&                    FrameRateDenominator > 0)                {                    if (FrameRateEnumerator % FrameRateDenominator == 0)                    {                        description += string.Format("{0:D} fps / ",                            FrameRateEnumerator / FrameRateDenominator);                    }                    else                    {                        description += string.Format("{0:F3} fps / ",                            (double)FrameRateEnumerator / FrameRateDenominator);                    }                }                if (AspectRatio == TSAspectRatio.ASPECT_4_3)                {                    description += "4:3 / ";                }                else if (AspectRatio == TSAspectRatio.ASPECT_16_9)                {                    description += "16:9 / ";                }                if (EncodingProfile != null)                {                    description += EncodingProfile + " / ";                }                if (description.EndsWith(" / "))                {                    description = description.Substring(0, description.Length - 3);                }                return description;            }        }        public override TSStream Clone()        {            TSVideoStream stream = new TSVideoStream();            CopyTo(stream);            stream.VideoFormat = _VideoFormat;            stream.FrameRate = _FrameRate;            stream.Width = Width;            stream.Height = Height;            stream.IsInterlaced = IsInterlaced;                    stream.FrameRateEnumerator = FrameRateEnumerator;            stream.FrameRateDenominator = FrameRateDenominator;            stream.AspectRatio = AspectRatio;            stream.EncodingProfile = EncodingProfile;            return stream;        }    }    public enum TSAudioMode    {        Unknown,        DualMono,        Stereo,        Surround,        Extended    }    public class TSAudioStream : TSStream    {        public TSAudioStream()        {        }        public int SampleRate;        public int ChannelCount;        public int BitDepth;        public int LFE;        public int DialNorm;        public TSAudioMode AudioMode;        public TSAudioStream CoreStream;        public TSChannelLayout ChannelLayout;        public static int ConvertSampleRate(            TSSampleRate sampleRate)        {            switch (sampleRate)            {                case TSSampleRate.SAMPLERATE_48:                    return 48000;                case TSSampleRate.SAMPLERATE_96:                case TSSampleRate.SAMPLERATE_48_96:                    return 96000;                case TSSampleRate.SAMPLERATE_192:                case TSSampleRate.SAMPLERATE_48_192:                    return 192000;            }            return 0;        }        public string ChannelDescription        {            get            {                if (ChannelLayout == TSChannelLayout.CHANNELLAYOUT_MONO &&                    ChannelCount == 2)                {                }                string description = "";                if (ChannelCount > 0)                {                    description += string.Format(                        "{0:D}.{1:D}",                        ChannelCount, LFE);                }                else                {                    switch (ChannelLayout)                    {                        case TSChannelLayout.CHANNELLAYOUT_MONO:                            description += "1.0";                            break;                        case TSChannelLayout.CHANNELLAYOUT_STEREO:                            description += "2.0";                            break;                        case TSChannelLayout.CHANNELLAYOUT_MULTI:                            description += "5.1";                            break;                    }                }                if (AudioMode == TSAudioMode.Extended)                {                    if (StreamType == TSStreamType.AC3_AUDIO)                    {                        description += "-EX";                    }                    if (StreamType == TSStreamType.DTS_AUDIO ||                        StreamType == TSStreamType.DTS_HD_AUDIO ||                        StreamType == TSStreamType.DTS_HD_MASTER_AUDIO)                    {                        description += "-ES";                    }                }                return description;            }        }        public override string Description        {            get            {                string description = ChannelDescription;                if (SampleRate > 0)                {                    description += string.Format(                        " / {0:D} kHz", SampleRate / 1000);                }                if (BitRate > 0)                {                    description += string.Format(                        " / {0:D} kbps", (uint)Math.Round((double)BitRate / 1000));                }                if (BitDepth > 0)                {                    description += string.Format(                        " / {0:D}-bit", BitDepth);                }                if (DialNorm != 0)                {                    description += string.Format(                        " / DN {0}dB", DialNorm);                }                if (ChannelCount == 2)                {                    switch (AudioMode)                    {                        case TSAudioMode.DualMono:                            description += " / Dual Mono";                            break;                        case TSAudioMode.Surround:                            description += " / Dolby Surround";                            break;                    }                }                if (description.EndsWith(" / "))                {                    description = description.Substring(0, description.Length - 3);                }                if (CoreStream != null)                {                    string codec = "";                    switch (CoreStream.StreamType)                    {                        case TSStreamType.AC3_AUDIO:                            codec = "AC3 Embedded";                            break;                        case TSStreamType.DTS_AUDIO:                            codec = "DTS Core";                            break;                    }                    description += string.Format(                        " ({0}: {1})",                        codec,                        CoreStream.Description);                }                return description;            }        }        public override TSStream Clone()        {            TSAudioStream stream = new TSAudioStream();            CopyTo(stream);            stream.SampleRate = SampleRate;            stream.ChannelLayout = ChannelLayout;            stream.ChannelCount = ChannelCount;            stream.BitDepth = BitDepth;            stream.LFE = LFE;            stream.DialNorm = DialNorm;            stream.AudioMode = AudioMode;            if (CoreStream != null)            {                stream.CoreStream = (TSAudioStream)CoreStream.Clone();            }            return stream;        }    }    public class TSGraphicsStream : TSStream    {        public TSGraphicsStream()        {            IsVBR = true;            IsInitialized = true;        }        public override TSStream Clone()        {            TSGraphicsStream stream = new TSGraphicsStream();            CopyTo(stream);            return stream;        }    }    public class TSTextStream : TSStream    {        public TSTextStream()        {            IsVBR = true;            IsInitialized = true;        }        public override TSStream Clone()        {            TSTextStream stream = new TSTextStream();            CopyTo(stream);            return stream;        }    }}
 |