diff options
Diffstat (limited to 'silk/NSQ.c')
-rw-r--r-- | silk/NSQ.c | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -226,6 +226,10 @@ void silk_noise_shape_quantizer( silk_short_prediction_create_arch_coef(a_Q12_arch, a_Q12, predictLPCOrder); #endif + /* We're getting desperate to hit the target -- pretend there's + no dithering to make hitting the target more likely. */ + if (Lambda_Q10 > 3072) offset_Q10 = 0; + for( i = 0; i < length; i++ ) { /* Generate dither */ NSQ->rand_seed = silk_RAND( NSQ->rand_seed ); @@ -287,6 +291,19 @@ void silk_noise_shape_quantizer( /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); + if (Lambda_Q10 > 2048) { + /* For aggressive RDO, the bias becomes more than one pulse. */ + int rdo_offset = Lambda_Q10/2 - 512; + if (q1_Q10 > rdo_offset) { + q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); + } else if (q1_Q10 < -rdo_offset) { + q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); + } else if (q1_Q10 < 0) { + q1_Q0 = -1; + } else { + q1_Q0 = 0; + } + } if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); |