diff --git a/lib_com/bits_alloc.c b/lib_com/bits_alloc.c index 56e523b39225dcfd923c9ef48b9fad9514ee7b8e..3837d62543c99b71e9107f19bbb6c5241f3fe1b4 100644 --- a/lib_com/bits_alloc.c +++ b/lib_com/bits_alloc.c @@ -394,6 +394,9 @@ static ivas_error acelp_FCB_allocator( int16_t nBits_tmp; int16_t *p_fixed_cdk_index; ivas_error error; +#ifdef FIX_680_ACELP_TABLE_OMASA + int16_t max_n; +#endif error = IVAS_ERR_OK; @@ -424,13 +427,31 @@ static ivas_error acelp_FCB_allocator( } /* distribute the bit-budget equally between subframes */ +#ifdef FIX_680_ACELP_TABLE_OMASA + if ( L_subfr > L_SUBFR ) /* access fast_FCB_bits_2sfr */ + { + max_n = 6; + } + else + { + max_n = ACELP_FIXED_CDK_NB; + } + for ( cdbk = 0; cdbk < max_n; cdbk++ ) + { + if ( fcb_table( cdbk, L_subfr ) * nb_subfr > *nBits ) + { + break; + } + } + cdbk--; +#else cdbk = 0; while ( fcb_table( cdbk, L_subfr ) * nb_subfr <= *nBits ) { cdbk++; } cdbk--; - +#endif #ifdef DEBUGGING if ( cdbk < 0 && coder_type != TRANSITION ) { @@ -455,29 +476,35 @@ static ivas_error acelp_FCB_allocator( *nBits -= nBits_tmp * nb_subfr; /* try to increase the FCB bit-budget of the first subframe(s) */ - step = fcb_table( cdbk + 1, L_subfr ) - nBits_tmp; - while ( *nBits >= step ) +#ifdef FIX_680_ACELP_TABLE_OMASA + if ( cdbk < ACELP_FIXED_CDK_NB - 1 ) { - ( *p_fixed_cdk_index )++; - *nBits -= step; - p_fixed_cdk_index++; - } - - /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ - step = fcb_table( fixed_cdk_index[sfr] + 1, L_subfr ) - fcb_table( fixed_cdk_index[sfr], L_subfr ); - if ( *nBits >= step && cdbk >= 0 ) - { - fixed_cdk_index[sfr]++; - *nBits -= step; +#endif + step = fcb_table( cdbk + 1, L_subfr ) - nBits_tmp; + while ( *nBits >= step ) + { + ( *p_fixed_cdk_index )++; + *nBits -= step; + p_fixed_cdk_index++; + } - if ( *nBits >= step && fixed_cdk_index[sfr + 1] == fixed_cdk_index[sfr] - 1 ) + /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ + step = fcb_table( fixed_cdk_index[sfr] + 1, L_subfr ) - fcb_table( fixed_cdk_index[sfr], L_subfr ); + if ( *nBits >= step && cdbk >= 0 ) { - sfr++; fixed_cdk_index[sfr]++; *nBits -= step; + + if ( *nBits >= step && fixed_cdk_index[sfr + 1] == fixed_cdk_index[sfr] - 1 ) + { + sfr++; + fixed_cdk_index[sfr]++; + *nBits -= step; + } } +#ifdef FIX_680_ACELP_TABLE_OMASA } - +#endif /* TRANSITION coding: allocate highest FCBQ bit-budget to the subframe with the glottal-shape codebook */ if ( tc_subfr >= L_SUBFR ) { diff --git a/lib_com/options.h b/lib_com/options.h index 7415cb9fcadef39ff770e383a9a2829cc9146a11..35fe524417d9eb96af6dee81da960372b60ff7b8 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -243,6 +243,7 @@ #define FIX_675_WB_OMASA /* Nokia: Fix for issue 675 solving the crash in OMASA for WB input */ #define FIX_683_JBM_CLEANUP /* FhG: Fix for issue 683, add clean up for ISM and MASA file writers */ #define FIX_689_USAN_QSPHERICAL /* Nokia: Fix usan error from issue 689 */ +#define FIX_680_ACELP_TABLE_OMASA /* Nokia: Fix for issue 680 preventing overindexing of PulseConfTable */ /* ################## End BE DEVELOPMENT switches ######################### */