📄 aac_dec_decoding_fp.c
字号:
for (i = sfb_offset[sfb] * len_window_group;
i < sfb_offset[sfb + 1] * len_window_group; i++) {
p_spectrum[i] *= norm;
}
}
}
}
p_spectrum += sfb_offset[max_sfb] * len_window_group;
p_spectrum_l += sfb_offset[max_sfb] * len_window_group;
}
pData = pDataR;
p_spectrum = p_spectrumR;
p_spectrum_l = p_spectrumL;
}
return 0;
}
/********************************************************************/
void FDP(Ipp32f *p_spectrum,
s_SE_Individual_channel_stream *pData,
IppsFDPState_32f *pFDPState)
{
if (pData->window_sequence != EIGHT_SHORT_SEQUENCE) {
ippsFDPInv_32f_I(p_spectrum, pData->sfb_offset_long_window,
pData->pred_max_sfb, pData->prediction_used,
pFDPState);
if ((pData->predictor_reset) &&
pData->predictor_reset_group_number > 0 &&
pData->predictor_reset_group_number < 31) {
ippsFDPResetGroup_32f(30, pData->predictor_reset_group_number - 1,
pFDPState);
}
} else {
ippsFDPReset_32f(pFDPState);
}
}
/********************************************************************/
Ipp32s deinterlieve(s_SE_Individual_channel_stream *pData,
Ipp32f *p_spectrum)
{
if ((pData->window_sequence == EIGHT_SHORT_SEQUENCE)) {
Ipp32s *sfb_offset = pData->sfb_offset_short_window;
Ipp32s num_window_groups = pData->num_window_groups;
Ipp32s max_sfb = pData->max_sfb;
Ipp32f buf[1024];
Ipp32f *pBuf = buf;
Ipp32s g, sfb, b;
ippsCopy_32f(p_spectrum, buf, 1024);
for (g = 0; g < num_window_groups; g++) {
Ipp32s len_window_group = pData->len_window_group[g];
Ipp32s offset = 0;
for (sfb = 0; sfb < max_sfb; sfb++) {
Ipp32s len = sfb_offset[sfb + 1] - sfb_offset[sfb];
for (b = 0; b < len_window_group; b++) {
ippsCopy_32f(pBuf, p_spectrum + b * 128 + offset, (Ipp16s)len);
pBuf += len;
}
offset += len;
for (b = 0; b < len_window_group; b++) {
ippsZero_32f(p_spectrum + b * 128 + offset, 128 - offset);
}
}
p_spectrum += 128*len_window_group;
}
}
return 0;
}
/********************************************************************/
Ipp32f gain_table[4][8] = {
{ 1.0000000000000000f, 1.0905077326652577f,
1.1892071150027210f, 1.2968395546510096f,
1.4142135623730951f, 1.5422108254079410f,
1.6817928305074292f, 1.8340080864093427f },
{ 1.0000000000000000f, 1.1892071150027210f,
1.4142135623730949f, 1.6817928305074288f,
0.f, 0.f, 0.f, 0.f},
{ 1.f, 1.4142135623730951f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
{ 1.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}
};
/********************************************************************/
void coupling_gain_calculation(sCoupling_channel_element *pElement,
sCoupling_channel_data *pData,
Ipp32f cc_gain[18][MAX_GROUP_NUMBER][MAX_SFB])
{
Ipp32f *pgain_table = gain_table[pData->gain_element_scale];
Ipp32s shift = (3 - pData->gain_element_scale);
Ipp32s ch = 0;
Ipp32s c, g, sfb;
for (c = 0; c < pData->num_gain_element_lists; c++) {
if (pData->cge[c]) {
Ipp32s fac = -pElement->cc_fact[c][0][0];
Ipp32s ifac = fac >> shift;
Ipp32s x = ((127 + ifac) << 23);
Ipp32f scale = (*(Ipp32f*)&x) * pgain_table[fac - (ifac << shift)];
for (g = 0; g < pElement->stream.num_window_groups; g++) {
for (sfb = 0; sfb < pElement->stream.max_sfb; sfb++) {
if (pElement->stream.sfb_cb[g][sfb] != ZERO_HCB) {
cc_gain[ch][g][sfb] = scale;
} else {
cc_gain[ch][g][sfb] = 0;
}
}
}
} else {
if (pData->gain_element_sign) {
for (g = 0; g < pElement->stream.num_window_groups; g++) {
for (sfb = 0; sfb < pElement->stream.max_sfb; sfb++) {
if (pElement->stream.sfb_cb[g][sfb] != ZERO_HCB) {
Ipp32s sign = pElement->cc_fact[c][g][sfb] & 1;
Ipp32s fac = -(pElement->cc_fact[c][g][sfb] >> 1);
Ipp32s ifac = fac >> shift;
Ipp32s x = ((127 + ifac) << 23);
Ipp32f scale = (*(Ipp32f*)&x) * pgain_table[fac - (ifac << shift)];
if (sign) scale = -scale;
cc_gain[ch][g][sfb] = scale;
} else {
cc_gain[ch][g][sfb] = 0;
}
}
}
} else {
for (g = 0; g < pElement->stream.num_window_groups; g++) {
for (sfb = 0; sfb < pElement->stream.max_sfb; sfb++) {
if (pElement->stream.sfb_cb[g][sfb] != ZERO_HCB) {
Ipp32s fac = -(pElement->cc_fact[c][g][sfb]);
Ipp32s ifac = fac >> shift;
Ipp32s x = ((127 + ifac) << 23);
Ipp32f scale = (*(Ipp32f*)&x) * pgain_table[fac - (ifac << shift)];
cc_gain[ch][g][sfb] = scale;
} else {
cc_gain[ch][g][sfb] = 0;
}
}
}
}
}
if (pData->cc_lr[c] == 3) {
ch++;
} else {
ch += 2;
}
}
}
/********************************************************************/
void coupling_spectrum(AACDec *state,
sCoupling_channel_data *pData,
Ipp32f *c_spectrum,
Ipp32f cc_gain[18][MAX_GROUP_NUMBER][MAX_SFB])
{
Ipp32f *m_spectrum, *pc_spectrum;
Ipp32s c, ch, g, m_ch, sfb, w;
Ipp32s *sfb_offset = pData->sfb_offset;
Ipp32s max_sfb = pData->max_sfb;
Ipp32s num_window_groups = pData->num_window_groups;
Ipp32s num_el = 0;
ch = 0;
for (c = 0; c < pData->num_coupled_elements + 1; c++) {
m_ch = pData->cc_target_ch[c];
if (m_ch < 0) continue;
/* if cpe and only right channel */
if ((pData->cc_target_id[c]) && (pData->cc_lr[num_el] == 1))
m_ch++;
m_spectrum = state->m_spectrum_data[m_ch];
pc_spectrum = c_spectrum;
for (g = 0; g < num_window_groups; g++) {
Ipp32s len_window_group = pData->len_window_group[g];
for (w = 0; w < len_window_group; w++) {
for (sfb = 0; sfb < max_sfb; sfb++) {
Ipp32s len = sfb_offset[sfb + 1] - sfb_offset[sfb];
ippsAddProductC_32f(pc_spectrum + sfb_offset[sfb], cc_gain[ch][g][sfb],
m_spectrum + sfb_offset[sfb], len);
}
m_spectrum += 128;
pc_spectrum += 128;
}
}
if (pData->cc_target_id[c]) { /* if cpe */
if (pData->cc_lr[num_el] == 3) {
m_spectrum = state->m_spectrum_data[m_ch+1];
pc_spectrum = c_spectrum;
for (g = 0; g < num_window_groups; g++) {
Ipp32s len_window_group = pData->len_window_group[g];
for (w = 0; w < len_window_group; w++) {
for (sfb = 0; sfb < max_sfb; sfb++) {
Ipp32s len = sfb_offset[sfb + 1] - sfb_offset[sfb];
ippsAddProductC_32f(pc_spectrum + sfb_offset[sfb], cc_gain[ch+1][g][sfb],
m_spectrum + sfb_offset[sfb], len);
}
m_spectrum += 128;
pc_spectrum += 128;
}
}
num_el++;
} else if (pData->cc_lr[num_el] == 0) {
m_spectrum = state->m_spectrum_data[m_ch+1];
pc_spectrum = c_spectrum;
for (g = 0; g < num_window_groups; g++) {
Ipp32s len_window_group = pData->len_window_group[g];
for (w = 0; w < len_window_group; w++) {
for (sfb = 0; sfb < max_sfb; sfb++) {
Ipp32s len = sfb_offset[sfb + 1] - sfb_offset[sfb];
ippsAddProductC_32f(pc_spectrum + sfb_offset[sfb], cc_gain[ch][g][sfb],
m_spectrum + sfb_offset[sfb], len);
}
m_spectrum += 128;
pc_spectrum += 128;
}
}
}
}
ch += 2;
num_el++;
}
}
/********************************************************************/
void coupling_samples(AACDec *state,
sCoupling_channel_data *pData,
Ipp32f *c_samlpes,
Ipp32f cc_gain[18][MAX_GROUP_NUMBER][MAX_SFB])
{
Ipp32s c, ch, m_ch;
Ipp32s num_el = 0;
ch = 0;
for (c = 0; c < pData->num_coupled_elements + 1; c++) {
m_ch = pData->cc_target_ch[c];
if (m_ch < 0) continue;
/* if cpe and only right channel */
if ((pData->cc_target_id[c]) && (pData->cc_lr[num_el] == 1))
m_ch++;
ippsAddProductC_32f(c_samlpes, cc_gain[ch][0][0],
state->m_curr_samples[m_ch], 1024);
if (pData->cc_target_id[c]) { /* if cpe */
if (pData->cc_lr[num_el] == 3) {
ippsAddProductC_32f(c_samlpes, cc_gain[ch+1][0][0],
state->m_curr_samples[m_ch+1], 1024);
num_el++;
} else if (pData->cc_lr[num_el] == 0) {
ippsAddProductC_32f(c_samlpes, cc_gain[ch][0][0],
state->m_curr_samples[m_ch+1], 1024);
}
}
ch += 2;
num_el++;
}
}
/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -