@ -728,7 +728,7 @@ static always_inline int dv_guess_dct_mode(DCTELEM *blk) {
static inline void dv_guess_qnos ( EncBlockInfo * blks , int * qnos )
{
int size [ 5 ] ;
int i , j , k , a , prev ;
int i , j , k , a , prev , a2 ;
EncBlockInfo * b ;
do {
@ -751,6 +751,13 @@ static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
b - > bit_size [ a ] + = dv_rl2vlc_size ( k - prev - 1 , b - > mb [ k ] ) ;
prev = k ;
} else {
if ( b - > next [ k ] > = mb_area_start [ a + 1 ] & & b - > next [ k ] < 64 ) {
for ( a2 = a + 1 ; b - > next [ k ] > = mb_area_start [ a2 + 1 ] ; a2 + + ) ;
assert ( a2 < 4 ) ;
assert ( b - > mb [ b - > next [ k ] ] ) ;
b - > bit_size [ a2 ] + = dv_rl2vlc_size ( b - > next [ k ] - prev - 1 , b - > mb [ b - > next [ k ] ] )
- dv_rl2vlc_size ( b - > next [ k ] - k - 1 , b - > mb [ b - > next [ k ] ] ) ;
}
b - > next [ prev ] = b - > next [ k ] ;
}
}
@ -760,8 +767,26 @@ static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
}
}
}
} while ( ( vs_total_ac_bits < size [ 0 ] + size [ 1 ] + size [ 2 ] + size [ 3 ] + size [ 4 ] ) & &
( qnos [ 0 ] | qnos [ 1 ] | qnos [ 2 ] | qnos [ 3 ] | qnos [ 4 ] ) ) ;
if ( vs_total_ac_bits > = size [ 0 ] + size [ 1 ] + size [ 2 ] + size [ 3 ] + size [ 4 ] )
return ;
} while ( qnos [ 0 ] | qnos [ 1 ] | qnos [ 2 ] | qnos [ 3 ] | qnos [ 4 ] ) ;
for ( a = 2 ; a = = 2 | | vs_total_ac_bits < size [ 0 ] ; a + = a ) {
b = blks ;
size [ 0 ] = 0 ;
for ( j = 0 ; j < 6 * 5 ; j + + , b + + ) {
prev = b - > prev [ 0 ] ;
for ( k = b - > next [ prev ] ; k < 64 ; k = b - > next [ k ] ) {
if ( b - > mb [ k ] < a & & b - > mb [ k ] > - a ) {
b - > next [ prev ] = b - > next [ k ] ;
} else {
size [ 0 ] + = dv_rl2vlc_size ( k - prev - 1 , b - > mb [ k ] ) ;
prev = k ;
}
}
}
}
}
/*