diff options
Diffstat (limited to 'BDInfo/TSCodecMPEG2.cs')
| -rw-r--r-- | BDInfo/TSCodecMPEG2.cs | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/BDInfo/TSCodecMPEG2.cs b/BDInfo/TSCodecMPEG2.cs new file mode 100644 index 000000000..6418a3ad9 --- /dev/null +++ b/BDInfo/TSCodecMPEG2.cs @@ -0,0 +1,211 @@ +//============================================================================ +// 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 DEBUG + +using System; +using System.Collections.Generic; +using System.Text; + +namespace 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 + } + } + } + } +} |
