| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 | //============================================================================// 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//=============================================================================#undef DEBUGnamespace BDInfo{    public abstract class TSCodecMPEG2    {        public static void Scan(            TSVideoStream stream,            TSStreamBuffer buffer,            ref string tag)        {            int parse = 0;            int pictureParse = 0;            int sequenceHeaderParse = 0;            int extensionParse = 0;            int sequenceExtensionParse = 0;            for (int i = 0; i < buffer.Length; i++)            {                parse = (parse << 8) + buffer.ReadByte();                if (parse == 0x00000100)                {                    pictureParse = 2;                }                else if (parse == 0x000001B3)                {                    sequenceHeaderParse = 7;                }                else if (sequenceHeaderParse > 0)                {                    --sequenceHeaderParse;                    switch (sequenceHeaderParse)                    {#if DEBUG                        case 6:                            break;                        case 5:                            break;                        case 4:                            stream.Width =                                (int)((parse & 0xFFF000) >> 12);                            stream.Height =                                (int)(parse & 0xFFF);                            break;                        case 3:                            stream.AspectRatio =                                (TSAspectRatio)((parse & 0xF0) >> 4);                            switch ((parse & 0xF0) >> 4)                            {                                case 0: // Forbidden                                    break;                                case 1: // Square                                    break;                                case 2: // 4:3                                    break;                                case 3: // 16:9                                    break;                                case 4: // 2.21:1                                    break;                                default: // Reserved                                    break;                            }                            switch (parse & 0xF)                            {                                case 0: // Forbidden                                    break;                                case 1: // 23.976                                    stream.FrameRateEnumerator = 24000;                                    stream.FrameRateDenominator = 1001;                                    break;                                case 2: // 24                                    stream.FrameRateEnumerator = 24000;                                    stream.FrameRateDenominator = 1000;                                    break;                                case 3: // 25                                    stream.FrameRateEnumerator = 25000;                                    stream.FrameRateDenominator = 1000;                                    break;                                case 4: // 29.97                                    stream.FrameRateEnumerator = 30000;                                    stream.FrameRateDenominator = 1001;                                    break;                                case 5: // 30                                    stream.FrameRateEnumerator = 30000;                                    stream.FrameRateDenominator = 1000;                                    break;                                case 6: // 50                                    stream.FrameRateEnumerator = 50000;                                    stream.FrameRateDenominator = 1000;                                    break;                                case 7: // 59.94                                    stream.FrameRateEnumerator = 60000;                                    stream.FrameRateDenominator = 1001;                                    break;                                case 8: // 60                                    stream.FrameRateEnumerator = 60000;                                    stream.FrameRateDenominator = 1000;                                    break;                                default: // Reserved                                    stream.FrameRateEnumerator = 0;                                    stream.FrameRateDenominator = 0;                                    break;                            }                            break;                        case 2:                            break;                        case 1:                            break;#endif                        case 0:#if DEBUG                            stream.BitRate =                                (((parse & 0xFFFFC0) >> 6) * 200);#endif                            stream.IsVBR = true;                            stream.IsInitialized = true;                            break;                    }                }                else if (pictureParse > 0)                {                    --pictureParse;                    if (pictureParse == 0)                    {                        switch ((parse & 0x38) >> 3)                        {                            case 1:                                tag = "I";                                break;                            case 2:                                tag = "P";                                break;                            case 3:                                tag = "B";                                break;                            default:                                break;                        }                        if (stream.IsInitialized) return;                    }                }                else if (parse == 0x000001B5)                {                    extensionParse = 1;                }                else if (extensionParse > 0)                {                    --extensionParse;                    if (extensionParse == 0)                    {                        if ((parse & 0xF0) == 0x10)                        {                            sequenceExtensionParse = 1;                        }                    }                }                else if (sequenceExtensionParse > 0)                {                    --sequenceExtensionParse;#if DEBUG                    if (sequenceExtensionParse == 0)                    {                        uint sequenceExtension =                            ((parse & 0x8) >> 3);                        if (sequenceExtension == 0)                        {                            stream.IsInterlaced = true;                        }                        else                        {                            stream.IsInterlaced = false;                        }                    }#endif                }            }        }    }}
 |