@ -571,7 +571,7 @@ int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContex
}
}
/* fill lookup tables for intensity compensation */
/* fill lookup tables for intensity compensation */
# define INIT_LUT(lumscale, lumshift, luty, lutuv) do { \
# define INIT_LUT(lumscale, lumshift, luty, lutuv, chain ) do { \
int scale , shift , i ; \
int scale , shift , i ; \
if ( ! lumscale ) { \
if ( ! lumscale ) { \
scale = - 64 ; \
scale = - 64 ; \
@ -586,11 +586,36 @@ int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContex
shift = lumshift < < 6 ; \
shift = lumshift < < 6 ; \
} \
} \
for ( i = 0 ; i < 256 ; i + + ) { \
for ( i = 0 ; i < 256 ; i + + ) { \
luty [ i ] = av_clip_uint8 ( ( scale * i + shift + 32 ) > > 6 ) ; \
int iy = chain ? luty [ i ] : i ; \
lutuv [ i ] = av_clip_uint8 ( ( scale * ( i - 128 ) + 128 * 64 + 32 ) > > 6 ) ; \
int iu = chain ? lutuv [ i ] : i ; \
luty [ i ] = av_clip_uint8 ( ( scale * iy + shift + 32 ) > > 6 ) ; \
lutuv [ i ] = av_clip_uint8 ( ( scale * ( iu - 128 ) + 128 * 64 + 32 ) > > 6 ) ; \
} \
} \
} while ( 0 )
} while ( 0 )
static void rotate_luts ( VC1Context * v )
{
# define ROTATE(DEF, L, N, C, A) do { \
if ( v - > s . pict_type = = AV_PICTURE_TYPE_BI | | v - > s . pict_type = = AV_PICTURE_TYPE_B ) { \
C = A ; \
} else { \
DEF ; \
memcpy ( & tmp , & L , sizeof ( tmp ) ) ; \
memcpy ( & L , & N , sizeof ( tmp ) ) ; \
memcpy ( & N , & tmp , sizeof ( tmp ) ) ; \
C = N ; \
} \
} while ( 0 )
ROTATE ( int tmp , v - > last_use_ic , v - > next_use_ic , v - > curr_use_ic , v - > aux_use_ic ) ;
ROTATE ( uint8_t tmp [ 2 ] [ 256 ] , v - > last_luty , v - > next_luty , v - > curr_luty , v - > aux_luty ) ;
ROTATE ( uint8_t tmp [ 2 ] [ 256 ] , v - > last_lutuv , v - > next_lutuv , v - > curr_lutuv , v - > aux_lutuv ) ;
INIT_LUT ( 32 , 0 , v - > curr_luty [ 0 ] , v - > curr_lutuv [ 0 ] , 0 ) ;
INIT_LUT ( 32 , 0 , v - > curr_luty [ 1 ] , v - > curr_lutuv [ 1 ] , 0 ) ;
v - > curr_use_ic = 0 ;
}
int ff_vc1_parse_frame_header ( VC1Context * v , GetBitContext * gb )
int ff_vc1_parse_frame_header ( VC1Context * v , GetBitContext * gb )
{
{
int pqindex , lowquant , status ;
int pqindex , lowquant , status ;
@ -677,8 +702,8 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
( v - > s . pict_type = = AV_PICTURE_TYPE_P ) ? ' P ' : ( ( v - > s . pict_type = = AV_PICTURE_TYPE_I ) ? ' I ' : ' B ' ) ,
( v - > s . pict_type = = AV_PICTURE_TYPE_P ) ? ' P ' : ( ( v - > s . pict_type = = AV_PICTURE_TYPE_I ) ? ' I ' : ' B ' ) ,
pqindex , v - > pq , v - > halfpq , v - > rangeredfrm ) ;
pqindex , v - > pq , v - > halfpq , v - > rangeredfrm ) ;
if ( v - > s . pict_type = = AV_PICTURE_TYPE_I | | v - > s . pict_type = = AV_PICTURE_TYPE_P )
if ( v - > first_pic_header_flag )
v - > use_ic = 0 ;
rotate_luts ( v ) ;
switch ( v - > s . pict_type ) {
switch ( v - > s . pict_type ) {
case AV_PICTURE_TYPE_P :
case AV_PICTURE_TYPE_P :
@ -692,9 +717,10 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
v - > mv_mode2 = ff_vc1_mv_pmode_table2 [ lowquant ] [ get_unary ( gb , 1 , 3 ) ] ;
v - > mv_mode2 = ff_vc1_mv_pmode_table2 [ lowquant ] [ get_unary ( gb , 1 , 3 ) ] ;
v - > lumscale = get_bits ( gb , 6 ) ;
v - > lumscale = get_bits ( gb , 6 ) ;
v - > lumshift = get_bits ( gb , 6 ) ;
v - > lumshift = get_bits ( gb , 6 ) ;
v - > use_ic = 1 ;
v - > last_ use_ic = 1 ;
/* fill lookup tables for intensity compensation */
/* fill lookup tables for intensity compensation */
INIT_LUT ( v - > lumscale , v - > lumshift , v - > luty , v - > lutuv ) ;
INIT_LUT ( v - > lumscale , v - > lumshift , v - > last_luty [ 0 ] , v - > last_lutuv [ 0 ] , 1 ) ;
INIT_LUT ( v - > lumscale , v - > lumshift , v - > last_luty [ 1 ] , v - > last_lutuv [ 1 ] , 1 ) ;
}
}
v - > qs_last = v - > s . quarter_sample ;
v - > qs_last = v - > s . quarter_sample ;
if ( v - > mv_mode = = MV_PMODE_1MV_HPEL | | v - > mv_mode = = MV_PMODE_1MV_HPEL_BILIN )
if ( v - > mv_mode = = MV_PMODE_1MV_HPEL | | v - > mv_mode = = MV_PMODE_1MV_HPEL_BILIN )
@ -942,12 +968,12 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
if ( v - > postprocflag )
if ( v - > postprocflag )
v - > postproc = get_bits ( gb , 2 ) ;
v - > postproc = get_bits ( gb , 2 ) ;
if ( v - > s . pict_type = = AV_PICTURE_TYPE_I | | v - > s . pict_type = = AV_PICTURE_TYPE_P )
v - > use_ic = 0 ;
if ( v - > parse_only )
if ( v - > parse_only )
return 0 ;
return 0 ;
if ( v - > first_pic_header_flag )
rotate_luts ( v ) ;
switch ( v - > s . pict_type ) {
switch ( v - > s . pict_type ) {
case AV_PICTURE_TYPE_I :
case AV_PICTURE_TYPE_I :
case AV_PICTURE_TYPE_BI :
case AV_PICTURE_TYPE_BI :
@ -998,7 +1024,9 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
if ( v - > intcomp ) {
if ( v - > intcomp ) {
v - > lumscale = get_bits ( gb , 6 ) ;
v - > lumscale = get_bits ( gb , 6 ) ;
v - > lumshift = get_bits ( gb , 6 ) ;
v - > lumshift = get_bits ( gb , 6 ) ;
INIT_LUT ( v - > lumscale , v - > lumshift , v - > luty , v - > lutuv ) ;
INIT_LUT ( v - > lumscale , v - > lumshift , v - > last_luty [ 0 ] , v - > last_lutuv [ 0 ] , 1 ) ;
INIT_LUT ( v - > lumscale , v - > lumshift , v - > last_luty [ 1 ] , v - > last_lutuv [ 1 ] , 1 ) ;
v - > last_use_ic = 1 ;
}
}
status = bitplane_decoding ( v - > s . mbskip_table , & v - > skip_is_raw , v ) ;
status = bitplane_decoding ( v - > s . mbskip_table , & v - > skip_is_raw , v ) ;
av_log ( v - > s . avctx , AV_LOG_DEBUG , " SKIPMB plane encoding: "
av_log ( v - > s . avctx , AV_LOG_DEBUG , " SKIPMB plane encoding: "
@ -1041,17 +1069,38 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
int mvmode2 ;
int mvmode2 ;
mvmode2 = get_unary ( gb , 1 , 3 ) ;
mvmode2 = get_unary ( gb , 1 , 3 ) ;
v - > mv_mode2 = ff_vc1_mv_pmode_table2 [ lowquant ] [ mvmode2 ] ;
v - > mv_mode2 = ff_vc1_mv_pmode_table2 [ lowquant ] [ mvmode2 ] ;
if ( v - > field_mode )
if ( v - > field_mode ) {
v - > intcompfield = decode210 ( gb ) ;
v - > intcompfield = decode210 ( gb ) ^ 3 ;
v - > lumscale = get_bits ( gb , 6 ) ;
} else
v - > lumshift = get_bits ( gb , 6 ) ;
v - > intcompfield = 3 ;
INIT_LUT ( v - > lumscale , v - > lumshift , v - > luty , v - > lutuv ) ;
if ( ( v - > field_mode ) & & ! v - > intcompfield ) {
v - > lumscale2 = v - > lumscale = 32 ;
v - > lumshift2 = v - > lumshift = 0 ;
if ( v - > intcompfield & 1 ) {
v - > lumscale = get_bits ( gb , 6 ) ;
v - > lumshift = get_bits ( gb , 6 ) ;
}
if ( ( v - > intcompfield & 2 ) & & v - > field_mode ) {
v - > lumscale2 = get_bits ( gb , 6 ) ;
v - > lumscale2 = get_bits ( gb , 6 ) ;
v - > lumshift2 = get_bits ( gb , 6 ) ;
v - > lumshift2 = get_bits ( gb , 6 ) ;
INIT_LUT ( v - > lumscale2 , v - > lumshift2 , v - > luty2 , v - > lutuv2 ) ;
} else if ( ! v - > field_mode ) {
v - > lumscale2 = v - > lumscale ;
v - > lumshift2 = v - > lumshift ;
}
if ( v - > field_mode & & v - > second_field ) {
if ( v - > cur_field_type ) {
INIT_LUT ( v - > lumscale , v - > lumshift , v - > curr_luty [ v - > cur_field_type ^ 1 ] , v - > curr_lutuv [ v - > cur_field_type ^ 1 ] , 0 ) ;
INIT_LUT ( v - > lumscale2 , v - > lumshift2 , v - > last_luty [ v - > cur_field_type ] , v - > last_lutuv [ v - > cur_field_type ] , 1 ) ;
} else {
INIT_LUT ( v - > lumscale2 , v - > lumshift2 , v - > curr_luty [ v - > cur_field_type ^ 1 ] , v - > curr_lutuv [ v - > cur_field_type ^ 1 ] , 0 ) ;
INIT_LUT ( v - > lumscale , v - > lumshift , v - > last_luty [ v - > cur_field_type ] , v - > last_lutuv [ v - > cur_field_type ] , 1 ) ;
}
v - > next_use_ic = v - > curr_use_ic = 1 ;
} else {
INIT_LUT ( v - > lumscale , v - > lumshift , v - > last_luty [ 0 ] , v - > last_lutuv [ 0 ] , 1 ) ;
INIT_LUT ( v - > lumscale2 , v - > lumshift2 , v - > last_luty [ 1 ] , v - > last_lutuv [ 1 ] , 1 ) ;
}
}
v - > use_ic = 1 ;
v - > last_ use_ic = 1 ;
}
}
v - > qs_last = v - > s . quarter_sample ;
v - > qs_last = v - > s . quarter_sample ;
if ( v - > mv_mode = = MV_PMODE_1MV_HPEL | | v - > mv_mode = = MV_PMODE_1MV_HPEL_BILIN )
if ( v - > mv_mode = = MV_PMODE_1MV_HPEL | | v - > mv_mode = = MV_PMODE_1MV_HPEL_BILIN )