@ -418,7 +418,7 @@ static void h263_decode_dquant(MpegEncContext *s){
static int h263_decode_block ( MpegEncContext * s , int16_t * block ,
static int h263_decode_block ( MpegEncContext * s , int16_t * block ,
int n , int coded )
int n , int coded )
{
{
int level , i , j , last , run ;
int level , i , j , run ;
RLTable * rl = & ff_h263_rl_inter ;
RLTable * rl = & ff_h263_rl_inter ;
const uint8_t * scan_table ;
const uint8_t * scan_table ;
GetBitContext gb = s - > gb ;
GetBitContext gb = s - > gb ;
@ -493,26 +493,22 @@ retry:
if ( CONFIG_FLV_DECODER & & s - > h263_flv > 1 ) {
if ( CONFIG_FLV_DECODER & & s - > h263_flv > 1 ) {
int is11 = SHOW_UBITS ( re , & s - > gb , 1 ) ;
int is11 = SHOW_UBITS ( re , & s - > gb , 1 ) ;
SKIP_CACHE ( re , & s - > gb , 1 ) ;
SKIP_CACHE ( re , & s - > gb , 1 ) ;
last = SHOW_UBITS ( re , & s - > gb , 1 ) ;
run = SHOW_UBITS ( re , & s - > gb , 7 ) + 1 ;
SKIP_CACHE ( re , & s - > gb , 1 ) ;
run = SHOW_UBITS ( re , & s - > gb , 6 ) ;
if ( is11 ) {
if ( is11 ) {
SKIP_COUNTER ( re , & s - > gb , 6 ) ;
SKIP_COUNTER ( re , & s - > gb , 1 + 7 ) ;
UPDATE_CACHE ( re , & s - > gb ) ;
UPDATE_CACHE ( re , & s - > gb ) ;
level = SHOW_SBITS ( re , & s - > gb , 11 ) ;
level = SHOW_SBITS ( re , & s - > gb , 11 ) ;
SKIP_COUNTER ( re , & s - > gb , 1 + 1 + 6 + 1 1 ) ;
SKIP_COUNTER ( re , & s - > gb , 11 ) ;
} else {
} else {
SKIP_CACHE ( re , & s - > gb , 6 ) ;
SKIP_CACHE ( re , & s - > gb , 7 ) ;
level = SHOW_SBITS ( re , & s - > gb , 7 ) ;
level = SHOW_SBITS ( re , & s - > gb , 7 ) ;
SKIP_COUNTER ( re , & s - > gb , 1 + 1 + 6 + 7 ) ;
SKIP_COUNTER ( re , & s - > gb , 1 + 7 + 7 ) ;
}
}
} else {
} else {
last = SHOW_UBITS ( re , & s - > gb , 1 ) ;
run = SHOW_UBITS ( re , & s - > gb , 7 ) + 1 ;
SKIP_CACHE ( re , & s - > gb , 1 ) ;
SKIP_CACHE ( re , & s - > gb , 7 ) ;
run = SHOW_UBITS ( re , & s - > gb , 6 ) ;
SKIP_CACHE ( re , & s - > gb , 6 ) ;
level = ( int8_t ) SHOW_UBITS ( re , & s - > gb , 8 ) ;
level = ( int8_t ) SHOW_UBITS ( re , & s - > gb , 8 ) ;
SKIP_COUNTER ( re , & s - > gb , 1 + 6 + 8 ) ;
SKIP_COUNTER ( re , & s - > gb , 7 + 8 ) ;
if ( level = = - 128 ) {
if ( level = = - 128 ) {
UPDATE_CACHE ( re , & s - > gb ) ;
UPDATE_CACHE ( re , & s - > gb ) ;
if ( s - > codec_id = = AV_CODEC_ID_RV10 ) {
if ( s - > codec_id = = AV_CODEC_ID_RV10 ) {
@ -528,15 +524,19 @@ retry:
}
}
}
}
} else {
} else {
run - - ;
last = run > = 192 ;
run & = 63 ;
if ( SHOW_UBITS ( re , & s - > gb , 1 ) )
if ( SHOW_UBITS ( re , & s - > gb , 1 ) )
level = - level ;
level = - level ;
SKIP_COUNTER ( re , & s - > gb , 1 ) ;
SKIP_COUNTER ( re , & s - > gb , 1 ) ;
}
}
i + = run ;
i + = run ;
if ( i > = 64 ) {
if ( i > 64 ) {
// redo update without last flag
i = i - run + ( ( run - 1 ) & 63 ) ;
if ( i < 64 ) {
// only last marker, no overrun
block [ scan_table [ i ] ] = level ;
break ;
}
if ( s - > alt_inter_vlc & & rl = = & ff_h263_rl_inter & & ! s - > mb_intra ) {
if ( s - > alt_inter_vlc & & rl = = & ff_h263_rl_inter & & ! s - > mb_intra ) {
CLOSE_READER ( re , & s - > gb ) ;
CLOSE_READER ( re , & s - > gb ) ;
//Looks like a hack but no, it's the way it is supposed to work ...
//Looks like a hack but no, it's the way it is supposed to work ...
@ -549,11 +549,8 @@ retry:
av_log ( s - > avctx , AV_LOG_ERROR , " run overflow at %dx%d i:%d \n " , s - > mb_x , s - > mb_y , s - > mb_intra ) ;
av_log ( s - > avctx , AV_LOG_ERROR , " run overflow at %dx%d i:%d \n " , s - > mb_x , s - > mb_y , s - > mb_intra ) ;
return - 1 ;
return - 1 ;
}
}
j = scan_table [ i ] ;
j = scan_table [ i - 1 ] ;
block [ j ] = level ;
block [ j ] = level ;
if ( last )
break ;
i + + ;
}
}
CLOSE_READER ( re , & s - > gb ) ;
CLOSE_READER ( re , & s - > gb ) ;
}
}