@ -138,99 +138,6 @@ static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred)
} \
} while ( 0 )
static inline int mpeg1_decode_block_intra ( MpegEncContext * s ,
int16_t * block , int index )
{
int dc , diff , i = 0 , component ;
RLTable * rl = & ff_rl_mpeg1 ;
uint8_t * const scantable = s - > intra_scantable . permutated ;
const uint16_t * quant_matrix = s - > intra_matrix ;
const int qscale = s - > qscale ;
/* DC coefficient */
component = index < = 3 ? 0 : index - 4 + 1 ;
diff = decode_dc ( & s - > gb , component ) ;
if ( diff > = 0xffff )
return AVERROR_INVALIDDATA ;
dc = s - > last_dc [ component ] ;
dc + = diff ;
s - > last_dc [ component ] = dc ;
block [ 0 ] = dc * quant_matrix [ 0 ] ;
{
OPEN_READER ( re , & s - > gb ) ;
/* now quantify & encode AC coefficients */
while ( 1 ) {
int level , run , j ;
UPDATE_CACHE ( re , & s - > gb ) ;
GET_RL_VLC ( level , run , re , & s - > gb , rl - > rl_vlc [ 0 ] ,
TEX_VLC_BITS , 2 , 0 ) ;
if ( level = = 127 ) {
break ;
} else if ( level ! = 0 ) {
i + = run ;
if ( i > MAX_INDEX )
break ;
j = scantable [ i ] ;
level = ( level * qscale * quant_matrix [ j ] ) > > 4 ;
level = ( level - 1 ) | 1 ;
level = ( level ^ SHOW_SBITS ( re , & s - > gb , 1 ) ) -
SHOW_SBITS ( re , & s - > gb , 1 ) ;
LAST_SKIP_BITS ( re , & s - > gb , 1 ) ;
} else {
/* escape */
run = SHOW_UBITS ( re , & s - > gb , 6 ) + 1 ;
LAST_SKIP_BITS ( re , & s - > gb , 6 ) ;
UPDATE_CACHE ( re , & s - > gb ) ;
level = SHOW_SBITS ( re , & s - > gb , 8 ) ;
SKIP_BITS ( re , & s - > gb , 8 ) ;
if ( level = = - 128 ) {
level = SHOW_UBITS ( re , & s - > gb , 8 ) - 256 ;
LAST_SKIP_BITS ( re , & s - > gb , 8 ) ;
} else if ( level = = 0 ) {
level = SHOW_UBITS ( re , & s - > gb , 8 ) ;
LAST_SKIP_BITS ( re , & s - > gb , 8 ) ;
}
i + = run ;
if ( i > MAX_INDEX )
break ;
j = scantable [ i ] ;
if ( level < 0 ) {
level = - level ;
level = ( level * qscale * quant_matrix [ j ] ) > > 4 ;
level = ( level - 1 ) | 1 ;
level = - level ;
} else {
level = ( level * qscale * quant_matrix [ j ] ) > > 4 ;
level = ( level - 1 ) | 1 ;
}
}
block [ j ] = level ;
}
CLOSE_READER ( re , & s - > gb ) ;
}
check_scantable_index ( s , i ) ;
s - > block_last_index [ index ] = i ;
return 0 ;
}
int ff_mpeg1_decode_block_intra ( MpegEncContext * s , int16_t * block , int index )
{
return mpeg1_decode_block_intra ( s , block , index ) ;
}
static inline int mpeg1_decode_block_inter ( MpegEncContext * s ,
int16_t * block , int n )
{
@ -874,9 +781,20 @@ FF_ENABLE_DEPRECATION_WARNINGS
return ret ;
}
} else {
for ( i = 0 ; i < 6 ; i + + )
if ( ( ret = mpeg1_decode_block_intra ( s , * s - > pblocks [ i ] , i ) ) < 0 )
for ( i = 0 ; i < 6 ; i + + ) {
ret = ff_mpeg1_decode_block_intra ( & s - > gb ,
s - > intra_matrix ,
s - > intra_scantable . permutated ,
s - > last_dc , * s - > pblocks [ i ] ,
i , s - > qscale ) ;
if ( ret < 0 ) {
av_log ( s - > avctx , AV_LOG_ERROR , " ac-tex damaged at %d %d \n " ,
s - > mb_x , s - > mb_y ) ;
return ret ;
}
s - > block_last_index [ i ] = ret ;
}
}
} else {
if ( mb_type & MB_TYPE_ZERO_MV ) {