⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aac_dec_decoding_fp.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 2 页
字号:

            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 + -