@ -73,10 +73,10 @@ static const uint16_t table_mb_intra[64][2];
/** Sequence quantizer mode */
//@{
# define QUANT_FRAME_IMPLICIT 0
# define QUANT_FRAME_EXPLICIT 1
# define QUANT_NON_UNIFORM 2
# define QUANT_UNIFORM 3
# define QUANT_FRAME_IMPLICIT 0 ///< Implicitly specified at frame level
# define QUANT_FRAME_EXPLICIT 1 ///< Explicitly specified at frame level
# define QUANT_NON_UNIFORM 2 ///< Non-uniform quant used for all frames
# define QUANT_UNIFORM 3 ///< Uniform quant used for all frames
//@}
/** Where quant can be changed */
@ -278,7 +278,7 @@ typedef struct VC9Context{
* - # 3 - > [ - 1024 , 1023.f ] x [ - 256 , 255.f ]
*/
uint8_t mvrange ;
uint8_t pquantizer ;
uint8_t pquantizer ; ///< Uniform (over sequence) quantizer in use
uint8_t * previous_line_cbpcy ; ///< To use for predicted CBPCY
VLC * cbpcy_vlc ; ///< Current CBPCY VLC table
VLC * ttmb_vlc ; ///< Current MB Transform Type VLC table
@ -299,10 +299,10 @@ typedef struct VC9Context{
uint8_t numpanscanwin ;
uint8_t tfcntr ;
uint8_t rptfrm , tff , rff ;
uint8 _t topleftx ;
uint8 _t toplefty ;
uint8 _t bottomrightx ;
uint8 _t bottomrighty ;
uint16 _t topleftx ;
uint16 _t toplefty ;
uint16 _t bottomrightx ;
uint16 _t bottomrighty ;
uint8_t uvsamp ;
uint8_t postproc ;
int hrd_num_leaky_buckets ;
@ -335,6 +335,7 @@ static int get_prefix(GetBitContext *gb, int stop, int len)
tmp = get_bits ( gb , 1 ) ;
i + + ;
}
if ( i = = len & & tmp ! = stop ) return len + 1 ;
return i ;
# else
unsigned int buf ;
@ -366,7 +367,7 @@ static int get_prefix(GetBitContext *gb, int stop, int len)
static int vc9_init_common ( VC9Context * v )
{
static int done = 0 ;
int i ;
int i = 0 ;
/* Set the bit planes */
v - > mv_type_mb_plane = ( struct BitPlane ) { NULL , 0 , 0 , 0 } ;
@ -1113,7 +1114,7 @@ static int vop_dquant_decoding(VC9Context *v)
static int decode_b_picture_primary_header ( VC9Context * v )
{
GetBitContext * gb = & v - > s . gb ;
int pqindex , status ;
int pqindex ;
/* Prolog common to all frametypes should be done in caller */
if ( v - > profile = = PROFILE_SIMPLE )
@ -1121,7 +1122,6 @@ static int decode_b_picture_primary_header(VC9Context *v)
av_log ( v - > s . avctx , AV_LOG_ERROR , " Found a B frame while in Simple Profile! \n " ) ;
return FRAME_SKIPED ;
}
v - > bfraction = vc9_bfraction_lut [ get_vlc2 ( gb , vc9_bfraction_vlc . table ,
VC9_BFRACTION_VLC_BITS , 2 ) ] ;
if ( v - > bfraction < - 1 )
@ -1148,9 +1148,18 @@ static int decode_b_picture_primary_header(VC9Context *v)
if ( v - > quantizer_mode = = QUANT_FRAME_EXPLICIT )
v - > pquantizer = get_bits ( gb , 1 ) ;
/* Read the MV type/mode */
if ( v - > extended_mv = = 1 )
v - > mvrange = get_prefix ( gb , 0 , 3 ) ;
if ( v - > profile > PROFILE_MAIN )
{
if ( v - > postprocflag ) v - > postproc = get_bits ( gb , 2 ) ;
if ( v - > extended_mv = = 1 & & v - > s . pict_type ! = BI_TYPE )
v - > mvrange = get_prefix ( gb , 0 , 3 ) ;
}
else
{
if ( v - > extended_mv = = 1 )
v - > mvrange = get_prefix ( gb , 0 , 3 ) ;
}
/* Read the MV mode */
if ( v - > s . pict_type ! = BI_TYPE )
{
v - > mv_mode = get_bits ( gb , 1 ) ;
@ -1185,13 +1194,14 @@ static int decode_b_picture_primary_header(VC9Context *v)
* @ return Status
* @ warning Also handles BI frames
* @ warning To call once all MB arrays are allocated
* @ todo Support Advanced Profile headers
*/
static int decode_b_picture_secondary_header ( VC9Context * v )
{
GetBitContext * gb = & v - > s . gb ;
int status ;
bitplane_decoding ( & v - > skip_mb_plane , v ) ;
status = bitplane_decoding ( & v - > skip_mb_plane , v ) ;
if ( status < 0 ) return - 1 ;
# if TRACE
if ( v - > mv_mode = = MV_PMODE_MIXED_MV )
@ -1244,11 +1254,12 @@ static int decode_b_picture_secondary_header(VC9Context *v)
* @ see Tables 5 + 7 , p53 - 54 and 55 - 57
* @ param v VC9 context
* @ return Status
* @ todo Support Advanced Profile headers
*/
static int decode_i_picture_header ( VC9Context * v )
static int decode_i_picture_primary_ header ( VC9Context * v )
{
GetBitContext * gb = & v - > s . gb ;
int pqindex , status = 0 ;
int pqindex ;
/* Prolog common to all frametypes should be done in caller */
//BF = Buffer Fullness
@ -1270,33 +1281,37 @@ static int decode_i_picture_header(VC9Context *v)
v - > pquantizer = get_bits ( gb , 1 ) ;
av_log ( v - > s . avctx , AV_LOG_DEBUG , " I frame: QP=%i (+%i/2) \n " ,
v - > pq , v - > halfpq ) ;
return 0 ;
}
/** I frame header decoding, secondary part
* @ param v VC9 context
* @ return Status
* @ todo Support Advanced Profile headers
*/
static int decode_i_picture_secondary_header ( VC9Context * v )
{
int status ;
# if HAS_ADVANCED_PROFILE
if ( v - > profile < = PROFILE_MAIN )
# endif
{
if ( v - > extended_mv ) v - > mvrange = get_prefix ( gb , 0 , 3 ) ;
if ( v - > multires ) v - > respic = get_bits ( gb , 2 ) ;
}
# if HAS_ADVANCED_PROFILE
else
if ( v - > profile > PROFILE_MAIN )
{
v - > s . ac_pred = get_bits ( gb , 1 ) ;
if ( v - > postprocflag ) v - > postproc = get_bits ( gb , 1 ) ;
v - > s . ac_pred = get_bits ( & v - > s . gb , 1 ) ;
if ( v - > postprocflag ) v - > postproc = get_bits ( & v - > s . gb , 1 ) ;
/* 7.1.1.34 + 8.5.2 */
if ( v - > overlap & & v - > pq < 9 )
{
v - > condover = get_bits ( gb , 1 ) ;
v - > condover = get_bits ( & v - > s . gb , 1 ) ;
if ( v - > condover )
{
v - > condover = 2 + get_bits ( gb , 1 ) ;
v - > condover = 2 + get_bits ( & v - > s . gb , 1 ) ;
if ( v - > condover = = 3 )
{
status = bitplane_decoding ( & v - > over_flags_plane , v ) ;
if ( status < 0 ) return - 1 ;
# if TRACE
# if TRACE
av_log ( v - > s . avctx , AV_LOG_DEBUG , " Overflags plane encoding: "
" Imode: %i, Invert: %i \n " , status > > 1 , status & 1 ) ;
# endif
# endif
}
}
}
@ -1304,19 +1319,20 @@ static int decode_i_picture_header(VC9Context *v)
# endif
/* Epilog (AC/DC syntax) should be done in caller */
return status ;
return 0 ;
}
/** P frame header decoding, primary part
* @ see Tables 5 + 7 , p53 - 54 and 55 - 57
* @ param v VC9 context
* @ todo Support Advanced Profile headers
* @ return Status
*/
static int decode_p_picture_primary_header ( VC9Context * v )
{
/* INTERFRM, FRMCNT, RANGEREDFRM read in caller */
GetBitContext * gb = & v - > s . gb ;
int lowquant , pqindex , status = 0 ;
int lowquant , pqindex ;
pqindex = get_bits ( gb , 5 ) ;
if ( v - > quantizer_mode = = QUANT_FRAME_IMPLICIT )
@ -1418,6 +1434,8 @@ static int decode_p_picture_secondary_header(VC9Context *v)
/** Frame header decoding, first part, in Simple and Main profiles
* @ see Tables 5 + 7 , p53 - 54 and 55 - 57
* @ param v VC9 context
* @ todo FIXME : RANGEREDFRM element not read if BI frame from Table6 , P54
* However , 7.1 .1 .8 says " all frame types, for main profiles "
* @ return Status
*/
static int standard_decode_picture_primary_header ( VC9Context * v )
@ -1442,9 +1460,9 @@ static int standard_decode_picture_primary_header(VC9Context *v)
switch ( v - > s . pict_type )
{
case I_TYPE : status = decode_i_picture_header ( v ) ; break ;
case I_TYPE : status = decode_i_picture_primary_ header ( v ) ; break ;
case P_TYPE : status = decode_p_picture_primary_header ( v ) ; break ;
case BI_TYPE :
case BI_TYPE : //Same as B
case B_TYPE : status = decode_b_picture_primary_header ( v ) ; break ;
}
@ -1470,7 +1488,10 @@ static int standard_decode_picture_secondary_header(VC9Context *v)
{
case P_TYPE : status = decode_p_picture_secondary_header ( v ) ; break ;
case B_TYPE : status = decode_b_picture_secondary_header ( v ) ; break ;
case BI_TYPE :
case I_TYPE : break ; //Nothing needed as it's done in the epilog
}
if ( status < 0 ) return FRAME_SKIPED ;
/* AC Syntax */
v - > ac_table_level = decode012 ( gb ) ;
@ -1504,7 +1525,7 @@ static int advanced_decode_picture_primary_header(VC9Context *v)
{
GetBitContext * gb = & v - > s . gb ;
static const int type_table [ 4 ] = { P_TYPE , B_TYPE , I_TYPE , BI_TYPE } ;
int type , i ;
int type ;
if ( v - > interlace )
{
@ -1548,13 +1569,12 @@ static int advanced_decode_picture_primary_header(VC9Context *v)
switch ( v - > s . pict_type )
{
case I_TYPE : if ( decode_i_picture_header ( v ) < 0 ) return - 1 ;
case I_TYPE : if ( decode_i_picture_primary_ header ( v ) < 0 ) return - 1 ;
case P_TYPE : if ( decode_p_picture_primary_header ( v ) < 0 ) return - 1 ;
case BI_TYPE :
case B_TYPE : if ( decode_b_picture_primary_header ( v ) < 0 ) return FRAME_SKIPED ;
default : break ;
default : return - 1 ;
}
return 0 ;
}
/** Frame header decoding, secondary part
@ -1564,14 +1584,16 @@ static int advanced_decode_picture_primary_header(VC9Context *v)
static int advanced_decode_picture_secondary_header ( VC9Context * v )
{
GetBitContext * gb = & v - > s . gb ;
int index ;
int index , status = 0 ;
switch ( v - > s . pict_type )
{
case P_TYPE : if ( decode_p_picture_secondary_header ( v ) < 0 ) return - 1 ;
case B_TYPE : if ( decode_b_picture_secondary_header ( v ) < 0 ) return FRAME_SKIPED ;
default : break ;
case P_TYPE : status = decode_p_picture_secondary_header ( v ) ; break ;
case B_TYPE : status = decode_b_picture_secondary_header ( v ) ; break ;
case BI_TYPE :
case I_TYPE : status = decode_i_picture_secondary_header ( v ) ; break ;
}
if ( status < 0 ) return FRAME_SKIPED ;
/* AC Syntax */
v - > ac_table_level = decode012 ( gb ) ;