123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- //============================================================================
- // 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 TSCodecAVC
- {
- public static void Scan(
- TSVideoStream stream,
- TSStreamBuffer buffer,
- ref string tag)
- {
- uint parse = 0;
- byte accessUnitDelimiterParse = 0;
- byte sequenceParameterSetParse = 0;
- string profile = null;
- string level = null;
- byte constraintSet0Flag = 0;
- byte constraintSet1Flag = 0;
- byte constraintSet2Flag = 0;
- byte constraintSet3Flag = 0;
- for (int i = 0; i < buffer.Length; i++)
- {
- parse = (parse << 8) + buffer.ReadByte();
- if (parse == 0x00000109)
- {
- accessUnitDelimiterParse = 1;
- }
- else if (accessUnitDelimiterParse > 0)
- {
- --accessUnitDelimiterParse;
- if (accessUnitDelimiterParse == 0)
- {
- switch ((parse & 0xFF) >> 5)
- {
- case 0: // I
- case 3: // SI
- case 5: // I, SI
- tag = "I";
- break;
- case 1: // I, P
- case 4: // SI, SP
- case 6: // I, SI, P, SP
- tag = "P";
- break;
- case 2: // I, P, B
- case 7: // I, SI, P, SP, B
- tag = "B";
- break;
- }
- if (stream.IsInitialized) return;
- }
- }
- else if (parse == 0x00000127 || parse == 0x00000167)
- {
- sequenceParameterSetParse = 3;
- }
- else if (sequenceParameterSetParse > 0)
- {
- --sequenceParameterSetParse;
- switch (sequenceParameterSetParse)
- {
- case 2:
- switch (parse & 0xFF)
- {
- case 66:
- profile = "Baseline Profile";
- break;
- case 77:
- profile = "Main Profile";
- break;
- case 88:
- profile = "Extended Profile";
- break;
- case 100:
- profile = "High Profile";
- break;
- case 110:
- profile = "High 10 Profile";
- break;
- case 122:
- profile = "High 4:2:2 Profile";
- break;
- case 144:
- profile = "High 4:4:4 Profile";
- break;
- default:
- profile = "Unknown Profile";
- break;
- }
- break;
- case 1:
- constraintSet0Flag = (byte)
- ((parse & 0x80) >> 7);
- constraintSet1Flag = (byte)
- ((parse & 0x40) >> 6);
- constraintSet2Flag = (byte)
- ((parse & 0x20) >> 5);
- constraintSet3Flag = (byte)
- ((parse & 0x10) >> 4);
- break;
- case 0:
- byte b = (byte)(parse & 0xFF);
- if (b == 11 && constraintSet3Flag == 1)
- {
- level = "1b";
- }
- else
- {
- level = string.Format(
- "{0:D}.{1:D}",
- b / 10, (b - ((b / 10) * 10)));
- }
- stream.EncodingProfile = string.Format(
- "{0} {1}", profile, level);
- stream.IsVBR = true;
- stream.IsInitialized = true;
- break;
- }
- }
- }
- return;
- }
- }
- }
|