📄 dec_amr.cpp
字号:
*-------------------------------------------------------*/ if ((mode == MR475) || (mode == MR515)) { /* MR475, MR515 */ index = *parm++; /* index of position */ i = *parm++; /* signs */ decode_2i40_9bits(subfrNr, i, index, code, pOverflow); L_temp = (Word32)st->sharp << 1; if (L_temp != (Word32)((Word16) L_temp)) { pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; } else { pit_sharp = (Word16) L_temp; } } else if (mode == MR59) { /* MR59 */ index = *parm++; /* index of position */ i = *parm++; /* signs */ decode_2i40_11bits(i, index, code); L_temp = (Word32)st->sharp << 1; if (L_temp != (Word32)((Word16) L_temp)) { pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; } else { pit_sharp = (Word16) L_temp; } } else if (mode == MR67) { /* MR67 */ index = *parm++; /* index of position */ i = *parm++; /* signs */ decode_3i40_14bits(i, index, code); L_temp = (Word32)st->sharp << 1; if (L_temp != (Word32)((Word16) L_temp)) { pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; } else { pit_sharp = (Word16) L_temp; } } else if (mode <= MR795) { /* MR74, MR795 */ index = *parm++; /* index of position */ i = *parm++; /* signs */ decode_4i40_17bits(i, index, code); L_temp = (Word32)st->sharp << 1; if (L_temp != (Word32)((Word16) L_temp)) { pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; } else { pit_sharp = (Word16) L_temp; } } else if (mode == MR102) { /* MR102 */ dec_8i40_31bits(parm, code, pOverflow); parm += 7; L_temp = (Word32)st->sharp << 1; if (L_temp != (Word32)((Word16) L_temp)) { pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; } else { pit_sharp = (Word16) L_temp; } } else { /* MR122 */ index = *parm++; if (bfi != 0) { ec_gain_pitch( &(st->ec_gain_p_st), st->state, &gain_pit, pOverflow); } else { gain_pit = d_gain_pitch(mode, index); } ec_gain_pitch_update( &(st->ec_gain_p_st), bfi, st->prev_bf, &gain_pit, pOverflow); dec_10i40_35bits(parm, code); parm += 10; /* pit_sharp = gain_pit; */ /* if (pit_sharp > 1.0) pit_sharp = 1.0; */ L_temp = (Word32)gain_pit << 1; if (L_temp != (Word32)((Word16) L_temp)) { pit_sharp = (gain_pit > 0) ? MAX_16 : MIN_16; } else { pit_sharp = (Word16) L_temp; } } /*-------------------------------------------------------* * - Add the pitch contribution to code[]. * *-------------------------------------------------------*/ for (i = T0; i < L_SUBFR; i++) { temp = mult(*(code + i - T0), pit_sharp, pOverflow); *(code + i) = add(*(code + i), temp, pOverflow); } /*------------------------------------------------------------* * - Decode codebook gain (MR122) or both pitch * * gain and codebook gain (all others) * * - Update pitch sharpening "sharp" with quantized gain_pit * *------------------------------------------------------------*/ if (mode == MR475) { /* read and decode pitch and code gain */ if (evenSubfr != 0) { index_mr475 = *parm++; /* index of gain(s) */ } if (bfi == 0) { Dec_gain( &(st->pred_state), mode, index_mr475, code, evenSubfr, &gain_pit, &gain_code, pOverflow); } else { ec_gain_pitch( &(st->ec_gain_p_st), st->state, &gain_pit, pOverflow); ec_gain_code( &(st->ec_gain_c_st), &(st->pred_state), st->state, &gain_code, pOverflow); } ec_gain_pitch_update( &st->ec_gain_p_st, bfi, st->prev_bf, &gain_pit, pOverflow); ec_gain_code_update( &st->ec_gain_c_st, bfi, st->prev_bf, &gain_code, pOverflow); pit_sharp = gain_pit; if (pit_sharp > SHARPMAX) { pit_sharp = SHARPMAX; } } else if ((mode <= MR74) || (mode == MR102)) { /* read and decode pitch and code gain */ index = *parm++; /* index of gain(s) */ if (bfi == 0) { Dec_gain( &(st->pred_state), mode, index, code, evenSubfr, &gain_pit, &gain_code, pOverflow); } else { ec_gain_pitch( &(st->ec_gain_p_st), st->state, &gain_pit, pOverflow); ec_gain_code( &(st->ec_gain_c_st), &(st->pred_state), st->state, &gain_code, pOverflow); } ec_gain_pitch_update( &(st->ec_gain_p_st), bfi, st->prev_bf, &gain_pit, pOverflow); ec_gain_code_update( &(st->ec_gain_c_st), bfi, st->prev_bf, &gain_code, pOverflow); pit_sharp = gain_pit; if (pit_sharp > SHARPMAX) { pit_sharp = SHARPMAX; } if (mode == MR102) { if (st->old_T0 > (L_SUBFR + 5)) { if (pit_sharp < 0) { pit_sharp = ~((~pit_sharp) >> 2); } else { pit_sharp = pit_sharp >> 2; } } } } else { /* read and decode pitch gain */ index = *parm++; /* index of gain(s) */ if (mode == MR795) { /* decode pitch gain */ if (bfi != 0) { ec_gain_pitch( &(st->ec_gain_p_st), st->state, &gain_pit, pOverflow); } else { gain_pit = d_gain_pitch(mode, index); } ec_gain_pitch_update( &(st->ec_gain_p_st), bfi, st->prev_bf, &gain_pit, pOverflow); /* read and decode code gain */ index = *parm++; if (bfi == 0) { d_gain_code( &(st->pred_state), mode, index, code, &gain_code, pOverflow); } else { ec_gain_code( &(st->ec_gain_c_st), &(st->pred_state), st->state, &gain_code, pOverflow); } ec_gain_code_update( &(st->ec_gain_c_st), bfi, st->prev_bf, &gain_code, pOverflow); pit_sharp = gain_pit; if (pit_sharp > SHARPMAX) { pit_sharp = SHARPMAX; } } else { /* MR122 */ if (bfi == 0) { d_gain_code( &(st->pred_state), mode, index, code, &gain_code, pOverflow); } else { ec_gain_code( &(st->ec_gain_c_st), &(st->pred_state), st->state, &gain_code, pOverflow); } ec_gain_code_update( &(st->ec_gain_c_st), bfi, st->prev_bf, &gain_code, pOverflow); pit_sharp = gain_pit; } } /* store pitch sharpening for next subframe */ /* (for modes which use the previous pitch gain for */ /* pitch sharpening in the search phase) */ /* do not update sharpening in even subframes for MR475 */ if ((mode != MR475) || (evenSubfr == 0)) { st->sharp = gain_pit; if (st->sharp > SHARPMAX) { st->sharp = SHARPMAX; } } pit_sharp = shl(pit_sharp, 1, pOverflow); if (pit_sharp > 16384) { for (i = 0; i < L_SUBFR; i++) { temp = mult(st->exc[i], pit_sharp, pOverflow); L_temp = L_mult(temp, gain_pit, pOverflow); if (mode == MR122) { if (L_temp < 0) { L_temp = ~((~L_temp) >> 1); } else { L_temp = L_temp >> 1; } } *(excp + i) = pv_round(L_temp, pOverflow); } } /*-------------------------------------------------------* * - Store list of LTP gains needed in the source * * characteristic detector (SCD) * *-------------------------------------------------------*/ if (bfi == 0) { for (i = 0; i < 8; i++) { st->ltpGainHistory[i] = st->ltpGainHistory[i+1]; } st->ltpGainHistory[8] = gain_pit; } /*-------------------------------------------------------* * - Limit gain_pit if in background noise and BFI * * for MR475, MR515, MR59 * *-------------------------------------------------------*/ if ((st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 && ((mode == MR475) || (mode == MR515) || (mode == MR59))) { if (gain_pit > 12288) /* if (gain_pit > 0.75) in Q14*/ {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -