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

📄 aac_enc_quantization_fp.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 3 页
字号:
  pBlock->start_common_scalefac = -SF_OFFSET;
  pBlock->finish_common_scalefac = -SF_OFFSET;

  if (pBlock->ns_mode) {
    Ipp32s  startSF[MAX_SECTION_NUMBER];
    Ipp32s  finishSF[MAX_SECTION_NUMBER];
    Ipp16s  maxXQuant[MAX_SECTION_NUMBER];
    Ipp16s* ns_scale_factors = pBlock->ns_scale_factors;
    Ipp16s* pMaxXQuant = maxXQuant;
    Ipp32s  numSfb = pStream->num_window_groups * pStream->max_sfb;
    Ipp32s  minSf = 100000;
    Ipp32s  maxSf = -100000;

    for (sfb = 0; sfb < numSfb; sfb++) {
      aac_LimitSF(mdct_scaled + sfb_offset[sfb], sfb_width[sfb],
                  &startSF[sfb], &finishSF[sfb]);
    }

    aac_FindSF(pStream, qData, mdct_scaled, mdct_line_abs, startSF,
               finishSF, ns_scale_factors, maxXQuant);

    aac_MinMaxSF(pStream, mdct_scaled, startSF, ns_scale_factors,
                 maxXQuant, &minSf, &maxSf, 60);

    aac_UpdateSF(pStream, mdct_scaled, mdct_line_abs, startSF,
                 ns_scale_factors, maxXQuant, minSf, *bitsToPeCoeff,
                 0.2f * pBlock->bits_per_frame);

    aac_MinMaxSF(pStream, mdct_scaled, startSF, ns_scale_factors,
                 maxXQuant, &minSf, &maxSf, 60);

    for (sfb = 0; sfb < numSfb; sfb++) {
      if (maxXQuant[sfb] != 0) {
        ns_scale_factors[sfb] = (Ipp16s)(maxSf - ns_scale_factors[sfb]);
        if (ns_scale_factors[sfb] > 0) {
          Ipp32f mul = (Ipp32f)scalefac_pow[SF_OFFSET - ns_scale_factors[sfb]];
          ippsMulC_32f_I(mul, mdct_scaled + sfb_offset[sfb], sfb_width[sfb]);
        }
      }
    }

    for (win = 0; win < pStream->num_window_groups; win++) {
      firstNonZeroSfb = -1;

      for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
        if (pMaxXQuant[sfb] != 0) {
          if (firstNonZeroSfb < 0) {
            firstNonZeroSfb = sfb;
          }
        }
      }

      if (firstNonZeroSfb < 0) {
        for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
          ns_scale_factors[sfb] = 0;
        }
      } else {
        for (sfb = 0; sfb < firstNonZeroSfb; sfb++) {
          ns_scale_factors[sfb] = ns_scale_factors[firstNonZeroSfb];
        }

        for (sfb = firstNonZeroSfb + 1; sfb < pStream->max_sfb; sfb++) {
          if (pMaxXQuant[sfb] == 0) {
            ns_scale_factors[sfb] = ns_scale_factors[sfb - 1];
          }
        }
      }
      ns_scale_factors += pStream->max_sfb;
      pMaxXQuant += pStream->max_sfb;
    }
    ns_scale_factors = pBlock->ns_scale_factors;
    pBlock->last_frame_common_scalefactor[0] = maxSf;
    pBlock->common_scalefactor_update[0] = 1;
  }

  aac_LimitSF(mdct_scaled, pStream->max_line,
              &pBlock->start_common_scalefac,
              &pBlock->finish_common_scalefac);

  main_loop(pBlock, pStream, mdct_line, mdct_scaled,
            &bitsForScaleFactorData);

  if (pBlock->ns_mode) {
    Ipp32f mdct_rqnt[N_LONG/2];
    Ipp16s x_quant_unsigned[N_LONG/2];
    Ipp32s numSfb = pStream->num_window_groups * pStream->max_sfb;
    Ipp32f noise[MAX_SECTION_NUMBER], real_sf;
    Ipp32f pe = 0;

    *scalefactorDataBits = (*scalefactorDataBits) * 0.9f +
                           bitsForScaleFactorData * 0.1f;

    for (sfb = 0; sfb < numSfb; sfb++) {
      Ipp32s scalefactor = pStream->scale_factors[sfb] + pBlock->ns_scale_factors[sfb];
      Ipp32f sf = (Ipp32f)scalefac_pow[scalefactor];
      Ipp32f temp = (Ipp32f)(MAGIC_NUMBER - 0.5f)/sf;
      Ipp32s sfb_start = sfb_offset[sfb];
      Ipp32f energy = qData->energy[sfb];

      ippsAddC_32f(mdct_scaled + sfb_start, temp, mdct_rqnt, sfb_width[sfb]);
      ippsMulC_Low_32f16s(mdct_rqnt, sf, x_quant_unsigned, sfb_width[sfb]);
      ippsPow43_16s32f(x_quant_unsigned, mdct_rqnt, sfb_width[sfb]);
      ippsCalcSF_16s32f(&pStream->scale_factors[sfb], SF_OFFSET, &real_sf, 1);
      ippsMulC_32f_I(real_sf, mdct_rqnt, sfb_width[sfb]);
      ippsSub_32f_I(mdct_line_abs + sfb_start, mdct_rqnt, sfb_width[sfb]);
      ippsDotProd_32f(mdct_rqnt, mdct_rqnt, sfb_width[sfb], &noise[sfb]);

      if (energy > noise[sfb]) {
        pe += (Ipp32f)(sfb_width[sfb] * log10(energy / noise[sfb]));
      }
    }

    qData->outPe = pe;

    if (pe > 0) {
      *bitsToPeCoeff = (*bitsToPeCoeff) * 0.9f +
        (pe/(pBlock->used_bits - bitsForScaleFactorData)) * 0.1f;
    }
  }
}

/****************************************************************************/

void main_loop(sQuantizationBlock* pBlock,
               sEnc_individual_channel_stream* pStream,
               Ipp32f* mdct_line,
               Ipp32f* mdct_scaled,
               Ipp32s* bitsForScaleFactorData)
{
  Ipp32f tmp_x_quant[N_LONG/2];
  Ipp16s mdct_sign[N_LONG/2];
  Ipp16s x_quant_unsigned[N_LONG/2];
  Ipp16s x_quant_signed_pred[N_LONG/2];
  Ipp16s maxXQuant[MAX_SECTION_NUMBER];
  Ipp32f sf, temp;
  Ipp32s start_common_scalefac = pBlock->start_common_scalefac;
  Ipp32s finish_common_scalefac = pBlock->finish_common_scalefac;
  Ipp32s common_scalefactor;
  Ipp32s common_scalefactor_update;
  Ipp32s needed_bits, bits_for_scale_factor_data;
  Ipp32s num_scale_factor;
  Ipp32s i;

  num_scale_factor = pStream->num_window_groups * pStream->max_sfb;

  for (i = 0; i < pStream->max_line; i++) {
    mdct_sign[i] = SIGN(mdct_line[i]);
  }

  common_scalefactor = pBlock->last_frame_common_scalefactor[0];
  common_scalefactor_update = pBlock->common_scalefactor_update[0];

  if (common_scalefactor < start_common_scalefac)
    common_scalefactor = start_common_scalefac;

  if (common_scalefactor > finish_common_scalefac)
    common_scalefactor = finish_common_scalefac;

  for(;;) {
    sf = (Ipp32f)scalefac_pow[common_scalefactor + SF_OFFSET];
    temp = (Ipp32f)(MAGIC_NUMBER - 0.5f)/sf;
    ippsAddC_32f(mdct_scaled, temp, tmp_x_quant, pStream->max_line);
    ippsMulC_Low_32f16s(tmp_x_quant, sf, x_quant_unsigned, pStream->max_line);
    ippsMul_16s(mdct_sign, x_quant_unsigned, pStream->x_quant, pStream->max_line);

    if (pBlock->ns_mode) {
      int win, sfb, firstNonZeroSfb;
      Ipp16s* ns_scale_factors = pBlock->ns_scale_factors;
      Ipp16s* pMaxXQuant = maxXQuant;

      for (sfb = 0; sfb < pStream->num_window_groups * pStream->max_sfb; sfb++) {
        Ipp32s sfb_start = pStream->sfb_offset[sfb];
        Ipp32s width = pStream->sfb_width[sfb];

        ippsMax_16s(x_quant_unsigned + sfb_start, width, maxXQuant + sfb);
      }

      for (win = 0; win < pStream->num_window_groups; win++) {
        firstNonZeroSfb = -1;

        for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
          if (pMaxXQuant[sfb] != 0) {
            if (firstNonZeroSfb < 0) {
              firstNonZeroSfb = sfb;
            }
          }
        }

        if (firstNonZeroSfb < 0) {
          for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
            ns_scale_factors[sfb] = 0;
          }
        } else {
          for (sfb = 0; sfb < firstNonZeroSfb; sfb++) {
            ns_scale_factors[sfb] = ns_scale_factors[firstNonZeroSfb];
          }

          for (sfb = firstNonZeroSfb + 1; sfb < pStream->max_sfb; sfb++) {
            if (pMaxXQuant[sfb] == 0) {
              ns_scale_factors[sfb] = ns_scale_factors[sfb - 1];
            }
          }
        }
        ns_scale_factors += pStream->max_sfb;
        pMaxXQuant += pStream->max_sfb;
      }
    }

    needed_bits = best_codebooks_search(pStream, x_quant_unsigned,
                                        pStream->x_quant, NULL,
                                        x_quant_signed_pred);


    if (pBlock->ns_mode) {
      common_scalefactor += SF_OFFSET;
      for (i = 0; i < num_scale_factor; i++) {
        pStream->scale_factors[i] = (Ipp16s)(common_scalefactor -
          pBlock->ns_scale_factors[i]);
      }
      common_scalefactor -= SF_OFFSET;
      bits_for_scale_factor_data = enc_scale_factor_data(pStream, NULL, 0);
    } else {
      bits_for_scale_factor_data = num_scale_factor;

      for (i = 0; i < num_scale_factor; i++) {
        if (pStream->sfb_cb[i] == 0)
          bits_for_scale_factor_data--;
      }
    }

    needed_bits += bits_for_scale_factor_data;

    if (needed_bits == pBlock->available_bits)
      break;

    if (needed_bits > pBlock->available_bits) {
      if (common_scalefactor == finish_common_scalefac)
        break;

      if (common_scalefactor_update < 0) {
        common_scalefactor_update = -common_scalefactor_update;
      }
      common_scalefactor_update = (common_scalefactor_update + 1) >> 1;
    } else {
      if (common_scalefactor == start_common_scalefac)
        break;

      if (common_scalefactor_update == 1)
        break;

      if (common_scalefactor_update > 0) {
        common_scalefactor_update = -common_scalefactor_update;
      }
      common_scalefactor_update >>= 1;
    }

    common_scalefactor += common_scalefactor_update;

    if (common_scalefactor < start_common_scalefac)
      common_scalefactor = start_common_scalefac;

    if (common_scalefactor > finish_common_scalefac)
      common_scalefactor = finish_common_scalefac;

  }

  pBlock->common_scalefactor_update[0] =
    common_scalefactor - pBlock->last_frame_common_scalefactor[0];
  pBlock->last_frame_common_scalefactor[0] = common_scalefactor;

  if (pBlock->common_scalefactor_update[0] >= 0) {
    if (pBlock->common_scalefactor_update[0] <= 2)
      pBlock->common_scalefactor_update[0] = 2;
  } else {
    if (pBlock->common_scalefactor_update[0] >= -2)
      pBlock->common_scalefactor_update[0] = -2;
  }

  pBlock->used_bits = needed_bits;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -