@ -69,7 +69,6 @@ typedef struct RiceContext {
enum CodingMode coding_mode ;
int porder ;
int params [ MAX_PARTITIONS ] ;
uint32_t udata [ FLAC_MAX_BLOCKSIZE ] ;
} RiceContext ;
typedef struct FlacSubframe {
@ -80,7 +79,11 @@ typedef struct FlacSubframe {
int order ;
int32_t coefs [ MAX_LPC_ORDER ] ;
int shift ;
RiceContext rc ;
uint32_t rc_udata [ FLAC_MAX_BLOCKSIZE ] ;
uint64_t rc_sums [ 32 ] [ MAX_PARTITIONS ] ;
int32_t samples [ FLAC_MAX_BLOCKSIZE ] ;
int32_t residual [ FLAC_MAX_BLOCKSIZE + 11 ] ;
} FlacSubframe ;
@ -674,14 +677,16 @@ static void calc_sum_next(int level, uint64_t sums[32][MAX_PARTITIONS], int kmax
}
}
static uint64_t calc_rice_params ( RiceContext * rc , int pmin , int pmax ,
static uint64_t calc_rice_params ( RiceContext * rc ,
uint32_t udata [ FLAC_MAX_BLOCKSIZE ] ,
uint64_t sums [ 32 ] [ MAX_PARTITIONS ] ,
int pmin , int pmax ,
int32_t * data , int n , int pred_order , int exact )
{
int i ;
uint64_t bits [ MAX_PARTITION_ORDER + 1 ] ;
int opt_porder ;
RiceContext tmp_rc ;
uint64_t sums [ 32 ] [ MAX_PARTITIONS ] ;
int kmax = ( 1 < < rc - > coding_mode ) - 2 ;
av_assert1 ( pmin > = 0 & & pmin < = MAX_PARTITION_ORDER ) ;
@ -691,9 +696,9 @@ static uint64_t calc_rice_params(RiceContext *rc, int pmin, int pmax,
tmp_rc . coding_mode = rc - > coding_mode ;
for ( i = 0 ; i < n ; i + + )
rc - > udata [ i ] = ( 2 * data [ i ] ) ^ ( data [ i ] > > 31 ) ;
udata [ i ] = ( 2 * data [ i ] ) ^ ( data [ i ] > > 31 ) ;
calc_sum_top ( pmax , exact ? kmax : 0 , rc - > udata , n , pred_order , sums ) ;
calc_sum_top ( pmax , exact ? kmax : 0 , udata , n , pred_order , sums ) ;
opt_porder = pmin ;
bits [ pmin ] = UINT32_MAX ;
@ -701,9 +706,7 @@ static uint64_t calc_rice_params(RiceContext *rc, int pmin, int pmax,
bits [ i ] = calc_optimal_rice_params ( & tmp_rc , i , sums , n , pred_order , kmax , exact ) ;
if ( bits [ i ] < bits [ opt_porder ] ) {
opt_porder = i ;
rc - > coding_mode = tmp_rc . coding_mode ;
rc - > porder = tmp_rc . porder ;
memcpy ( rc - > params , tmp_rc . params , sizeof ( rc - > params ) ) ;
* rc = tmp_rc ;
}
if ( i = = pmin )
break ;
@ -734,7 +737,7 @@ static uint64_t find_subframe_rice_params(FlacEncodeContext *s,
uint64_t bits = 8 + pred_order * sub - > obits + 2 + sub - > rc . coding_mode ;
if ( sub - > type = = FLAC_SUBFRAME_LPC )
bits + = 4 + 5 + pred_order * s - > options . lpc_coeff_precision ;
bits + = calc_rice_params ( & sub - > rc , pmin , pmax , sub - > residual ,
bits + = calc_rice_params ( & sub - > rc , sub - > rc_udata , sub - > rc_sums , pmin , pmax , sub - > residual ,
s - > frame . blocksize , pred_order , s - > options . exact_rice_parameters ) ;
return bits ;
}