//============================================================================
// 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 TSCodecVC1
{
public static void Scan (
TSVideoStream stream ,
TSStreamBuffer buffer ,
ref string tag )
{
int parse = 0 ;
byte frameHeaderParse = 0 ;
byte sequenceHeaderParse = 0 ;
bool isInterlaced = false ;
for ( int i = 0 ; i < buffer . Length ; i + + )
{
parse = ( parse < < 8 ) + buffer . ReadByte ( ) ;
if ( parse = = 0x0000010D )
{
frameHeaderParse = 4 ;
}
else if ( frameHeaderParse > 0 )
{
- - frameHeaderParse ;
if ( frameHeaderParse = = 0 )
{
uint pictureType = 0 ;
if ( isInterlaced )
{
if ( ( parse & 0x80000000 ) = = 0 )
{
pictureType =
( uint ) ( ( parse & 0x78000000 ) > > 13 ) ;
}
else
{
pictureType =
( uint ) ( ( parse & 0x3c000000 ) > > 12 ) ;
}
}
else
{
pictureType =
( uint ) ( ( parse & 0xf0000000 ) > > 14 ) ;
}
if ( ( pictureType & 0x20000 ) = = 0 )
{
tag = "P" ;
}
else if ( ( pictureType & 0x10000 ) = = 0 )
{
tag = "B" ;
}
else if ( ( pictureType & 0x8000 ) = = 0 )
{
tag = "I" ;
}
else if ( ( pictureType & 0x4000 ) = = 0 )
{
tag = "BI" ;
}
else
{
tag = null ;
}
if ( stream . IsInitialized ) return ;
}
}
else if ( parse = = 0x0000010F )
{
sequenceHeaderParse = 6 ;
}
else if ( sequenceHeaderParse > 0 )
{
- - sequenceHeaderParse ;
switch ( sequenceHeaderParse )
{
case 5 :
int profileLevel = ( ( parse & 0x38 ) > > 3 ) ;
if ( ( ( parse & 0xC0 ) > > 6 ) = = 3 )
{
stream . EncodingProfile = string . Format (
"Advanced Profile {0}" , profileLevel ) ;
}
else
{
stream . EncodingProfile = string . Format (
"Main Profile {0}" , profileLevel ) ;
}
break ;
case 0 :
if ( ( ( parse & 0x40 ) > > 6 ) > 0 )
{
isInterlaced = true ;
}
else
{
isInterlaced = false ;
}
break ;
}
stream . IsVBR = true ;
stream . IsInitialized = true ;
}
}
}
}
}