Loading lib_dec/dec4t64_fx.c +0 −235 Original line number Diff line number Diff line Loading @@ -793,242 +793,7 @@ void D_ACELP_decode_43bit_fx( UWord16 idxs[], Word16 code[], Word16 *pulsestrack return; } #ifdef IVAS_CODE_FCB /*-------------------------------------------------------* * dec_1p_N1() * * Decode 1 pulse with N+1 bits *-------------------------------------------------------*/ static void dec_1p_N1_L_subfr( const int32_t index, /* i : quantization index */ const int16_t nb_pos, /* i : number of positions */ const int16_t N, /* i : nb. of bits */ int16_t pos[] /* o : pulse position */ ) { int16_t i, pos1; int32_t mask; mask = ( ( 1 << N ) - 1 ); pos1 = (int16_t) ( index & mask ); i = (int16_t) ( index >> N ) & 1; if ( i == 1 ) { pos1 += nb_pos; } pos[0] = pos1; return; } /*-------------------------------------------------------* * add_pulses() * * Add decoded pulses to the codeword *-------------------------------------------------------*/ static void add_pulses_L_subfr( const int16_t nb_pos, /* i : number of positions */ const int16_t pos[], /* i : pulse position */ const int16_t nb_pulse, /* i : nb. of pulses */ const int16_t track, /* i : no. of the tracks */ float code[] /* i/o: decoded codevector */ ) { int16_t i, k; for ( k = 0; k < nb_pulse; k++ ) { i = ( ( pos[k] & ( nb_pos - 1 ) ) * NB_TRACK_FCB_4T ) + track; if ( ( pos[k] & nb_pos ) == 0 ) { code[i] += 1.0f; } else { code[i] -= 1.0f; } } return; } /*----------------------------------------------------------------------------------* * dec_acelp_fast() * * fast algebraic codebook decoder *----------------------------------------------------------------------------------*/ void dec_acelp_fast( Decoder_State *st, /* i/o: decoder state structure */ const int16_t cdk_index, /* i : codebook index */ float code[], /* o : algebraic (fixed) codebook excitation */ const int16_t L_subfr /* i : subframe length */ ) { int16_t k, pos[7], skip_track; int32_t L_index; PulseConfig config; skip_track = -1; set_f( code, 0.0f, L_subfr ); if ( L_subfr == L_SUBFR ) { config = PulseConfTable[cdk_index]; if ( cdk_index == 2 ) { dec_acelp_2t32( st, code ); } else if ( config.nb_pulse == 2 ) { /* 10 bits, 2 pulses, 4 tracks 1010 (used only even tracks) */ for ( k = 0; k < NB_TRACK_FCB_4T - 1; k += 2 ) { L_index = get_next_indice( st, 5 ); dec_1p_N1( L_index, 4, 0, pos ); add_pulses( pos, 1, k, code ); } } else if ( config.nb_pulse == 3 ) { if ( config.codetrackpos == TRACKPOS_FIXED_FIRST ) { /* 15 bits, 3 pulses, 4 tracks 1110 fixed track to first ? */ for ( k = 0; k < NB_TRACK_FCB_4T - 1; k++ ) { L_index = get_next_indice( st, 5 ); dec_1p_N1( L_index, 4, 0, pos ); add_pulses( pos, 1, k, code ); } } else if ( config.codetrackpos == TRACKPOS_FREE_THREE ) { /* 17 bits, 3 pulses, 4 tracks (used all tracks) - 1110, 1101, 1011, 0111 */ skip_track = get_next_indice( st, 2 ); for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) { if ( k != skip_track ) { L_index = get_next_indice( st, 5 ); dec_1p_N1( L_index, 4, 0, pos ); add_pulses( pos, 1, k, code ); } } } } else { if ( config.bits == 20 ) { skip_track = -1; } else if ( config.codetrackpos == TRACKPOS_FIXED_FIRST ) { skip_track = 0; } else if ( config.codetrackpos == TRACKPOS_FREE_ONE ) { skip_track = get_next_indice( st, 2 ); } for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) { if ( k == skip_track ) { L_index = get_next_indice( st, 9 ); dec_2p_2N1( L_index, 4, 0, pos ); add_pulses( pos, 2, k, code ); } else { L_index = get_next_indice( st, 5 ); dec_1p_N1( L_index, 4, 0, pos ); add_pulses( pos, 1, k, code ); } } } } else /* L_subfr == 2*L_SUBFR */ { config.bits = cdk_index; if ( cdk_index == 14 ) { /* 14 bits, 2 pulses, 2 tracks: 11 (used all tracks) */ int16_t index, i0, i1; index = get_next_indice( st, 14 ); i0 = ( ( index >> 7 ) & ( NB_POS_FCB_2T_128 - 1 ) ) * NB_TRACK_FCB_2T; i1 = ( ( index & ( NB_POS_FCB_2T_128 - 1 ) ) * NB_TRACK_FCB_2T ) + 1; code[i0] = -1.0f; if ( ( index & 0x2000 ) == 0 ) { code[i0] = 1.0f; } code[i1] = -1.0f; if ( ( index & 0x40 ) == 0 ) { code[i1] = 1.0f; } } else if ( cdk_index == 12 ) { /* 12 bits, 2 pulses, 4 tracks: 1010 (used only even tracks) */ for ( k = 0; k < NB_TRACK_FCB_4T - 1; k += 2 ) { L_index = get_next_indice( st, 6 ); dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); } } else if ( cdk_index == 18 ) { /* 18 bits, 3 pulses, 4 tracks: 1110 (used first three tracks) */ for ( k = 0; k < NB_TRACK_FCB_4T - 1; k++ ) { L_index = get_next_indice( st, 6 ); dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); } } else if ( cdk_index == 20 ) { /* 20 bits, 3 pulses, 4 tracks (used all tracks): 1110, 1101, 1011, 0111 */ skip_track = get_next_indice( st, 2 ); for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) { if ( k != skip_track ) { L_index = get_next_indice( st, 6 ); dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); } } } else if ( cdk_index == 24 ) { /* 24 bits, 4 pulses, 4 tracks: 1111 */ for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) { L_index = get_next_indice( st, 6 ); dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); } } } return; } #endif /*-------------------------------------------------------* * dec_1p_N1() Loading Loading
lib_dec/dec4t64_fx.c +0 −235 Original line number Diff line number Diff line Loading @@ -793,242 +793,7 @@ void D_ACELP_decode_43bit_fx( UWord16 idxs[], Word16 code[], Word16 *pulsestrack return; } #ifdef IVAS_CODE_FCB /*-------------------------------------------------------* * dec_1p_N1() * * Decode 1 pulse with N+1 bits *-------------------------------------------------------*/ static void dec_1p_N1_L_subfr( const int32_t index, /* i : quantization index */ const int16_t nb_pos, /* i : number of positions */ const int16_t N, /* i : nb. of bits */ int16_t pos[] /* o : pulse position */ ) { int16_t i, pos1; int32_t mask; mask = ( ( 1 << N ) - 1 ); pos1 = (int16_t) ( index & mask ); i = (int16_t) ( index >> N ) & 1; if ( i == 1 ) { pos1 += nb_pos; } pos[0] = pos1; return; } /*-------------------------------------------------------* * add_pulses() * * Add decoded pulses to the codeword *-------------------------------------------------------*/ static void add_pulses_L_subfr( const int16_t nb_pos, /* i : number of positions */ const int16_t pos[], /* i : pulse position */ const int16_t nb_pulse, /* i : nb. of pulses */ const int16_t track, /* i : no. of the tracks */ float code[] /* i/o: decoded codevector */ ) { int16_t i, k; for ( k = 0; k < nb_pulse; k++ ) { i = ( ( pos[k] & ( nb_pos - 1 ) ) * NB_TRACK_FCB_4T ) + track; if ( ( pos[k] & nb_pos ) == 0 ) { code[i] += 1.0f; } else { code[i] -= 1.0f; } } return; } /*----------------------------------------------------------------------------------* * dec_acelp_fast() * * fast algebraic codebook decoder *----------------------------------------------------------------------------------*/ void dec_acelp_fast( Decoder_State *st, /* i/o: decoder state structure */ const int16_t cdk_index, /* i : codebook index */ float code[], /* o : algebraic (fixed) codebook excitation */ const int16_t L_subfr /* i : subframe length */ ) { int16_t k, pos[7], skip_track; int32_t L_index; PulseConfig config; skip_track = -1; set_f( code, 0.0f, L_subfr ); if ( L_subfr == L_SUBFR ) { config = PulseConfTable[cdk_index]; if ( cdk_index == 2 ) { dec_acelp_2t32( st, code ); } else if ( config.nb_pulse == 2 ) { /* 10 bits, 2 pulses, 4 tracks 1010 (used only even tracks) */ for ( k = 0; k < NB_TRACK_FCB_4T - 1; k += 2 ) { L_index = get_next_indice( st, 5 ); dec_1p_N1( L_index, 4, 0, pos ); add_pulses( pos, 1, k, code ); } } else if ( config.nb_pulse == 3 ) { if ( config.codetrackpos == TRACKPOS_FIXED_FIRST ) { /* 15 bits, 3 pulses, 4 tracks 1110 fixed track to first ? */ for ( k = 0; k < NB_TRACK_FCB_4T - 1; k++ ) { L_index = get_next_indice( st, 5 ); dec_1p_N1( L_index, 4, 0, pos ); add_pulses( pos, 1, k, code ); } } else if ( config.codetrackpos == TRACKPOS_FREE_THREE ) { /* 17 bits, 3 pulses, 4 tracks (used all tracks) - 1110, 1101, 1011, 0111 */ skip_track = get_next_indice( st, 2 ); for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) { if ( k != skip_track ) { L_index = get_next_indice( st, 5 ); dec_1p_N1( L_index, 4, 0, pos ); add_pulses( pos, 1, k, code ); } } } } else { if ( config.bits == 20 ) { skip_track = -1; } else if ( config.codetrackpos == TRACKPOS_FIXED_FIRST ) { skip_track = 0; } else if ( config.codetrackpos == TRACKPOS_FREE_ONE ) { skip_track = get_next_indice( st, 2 ); } for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) { if ( k == skip_track ) { L_index = get_next_indice( st, 9 ); dec_2p_2N1( L_index, 4, 0, pos ); add_pulses( pos, 2, k, code ); } else { L_index = get_next_indice( st, 5 ); dec_1p_N1( L_index, 4, 0, pos ); add_pulses( pos, 1, k, code ); } } } } else /* L_subfr == 2*L_SUBFR */ { config.bits = cdk_index; if ( cdk_index == 14 ) { /* 14 bits, 2 pulses, 2 tracks: 11 (used all tracks) */ int16_t index, i0, i1; index = get_next_indice( st, 14 ); i0 = ( ( index >> 7 ) & ( NB_POS_FCB_2T_128 - 1 ) ) * NB_TRACK_FCB_2T; i1 = ( ( index & ( NB_POS_FCB_2T_128 - 1 ) ) * NB_TRACK_FCB_2T ) + 1; code[i0] = -1.0f; if ( ( index & 0x2000 ) == 0 ) { code[i0] = 1.0f; } code[i1] = -1.0f; if ( ( index & 0x40 ) == 0 ) { code[i1] = 1.0f; } } else if ( cdk_index == 12 ) { /* 12 bits, 2 pulses, 4 tracks: 1010 (used only even tracks) */ for ( k = 0; k < NB_TRACK_FCB_4T - 1; k += 2 ) { L_index = get_next_indice( st, 6 ); dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); } } else if ( cdk_index == 18 ) { /* 18 bits, 3 pulses, 4 tracks: 1110 (used first three tracks) */ for ( k = 0; k < NB_TRACK_FCB_4T - 1; k++ ) { L_index = get_next_indice( st, 6 ); dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); } } else if ( cdk_index == 20 ) { /* 20 bits, 3 pulses, 4 tracks (used all tracks): 1110, 1101, 1011, 0111 */ skip_track = get_next_indice( st, 2 ); for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) { if ( k != skip_track ) { L_index = get_next_indice( st, 6 ); dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); } } } else if ( cdk_index == 24 ) { /* 24 bits, 4 pulses, 4 tracks: 1111 */ for ( k = 0; k < NB_TRACK_FCB_4T; k++ ) { L_index = get_next_indice( st, 6 ); dec_1p_N1_L_subfr( L_index, NB_POS_FCB_4T_128, 5, pos ); add_pulses_L_subfr( NB_POS_FCB_4T_128, pos, 1, k, code ); } } } return; } #endif /*-------------------------------------------------------* * dec_1p_N1() Loading