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

📄 aac_enc_quantization_int.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 2 页
字号:
  Ipp16s x_quant_signed_pred[N_LONG/2];
  Ipp16s *x_quant_unsigned_pred;
  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, pred;
  Ipp32s index, scale, shift;
  Ipp32s magic_number;

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

  pred = 0;
  if (mdct_line_pred) {
    pred = 1;
  }

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

  x_quant_unsigned_pred = 0;

  if (pred) {
    for (i = 0; i < pStream->max_line; i++) {
      mdct_sign_pred[i] = SIGN(mdct_line_pred[i]);
    }
    x_quant_unsigned_pred = quant_unsigned_pred;
  }

  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 (;;) {
    index = (-common_scalefactor) & 0xF;
    scale = pow34_scaleFact +
      (3 * ((-common_scalefactor) >> 4) + scalefac_pow_shift[index]);

    magic_number = (Ipp32s)MAGIC_NUMBER_I - 32768;

    shift = scale + 16;
    if (scale >= 0) magic_number = 0;
    else if (scale > -16) {
      magic_number = ((magic_number + (1 << (shift - 1))) >> shift);
      shift = 0;
    } else if (scale < -16) {
      shift = -shift;
      scale = -16;
    }

    ippsMulC_16s_Sfs(mdct_scaled, scalefac_pow[index], tmp_x_quant,
                     pStream->max_line, 15 + shift);

    ippsAddC_16s_Sfs(tmp_x_quant, (Ipp16s)magic_number, x_quant_unsigned,
                     pStream->max_line, -scale);

    ippsMul_16s(mdct_sign, x_quant_unsigned, pStream->x_quant, pStream->max_line);

    if (pred) {
      ippsMulC_16s_Sfs(mdct_scaled_pred, scalefac_pow[index], tmp_x_quant,
                       pStream->max_line, 15 + shift);

      ippsAddC_16s_Sfs(tmp_x_quant, (Ipp16s)magic_number,
                       x_quant_unsigned_pred, pStream->max_line, -scale);

      ippsMul_16s(mdct_sign_pred, x_quant_unsigned_pred,
                  x_quant_signed_pred, pStream->max_line);
    }

    needed_bits = best_codebooks_search(pStream, x_quant_unsigned,
                                        pStream->x_quant, x_quant_unsigned_pred,
                                        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;
  common_scalefactor += SF_OFFSET;

  if (!pBlock->ns_mode) {
    for (i = 0; i < num_scale_factor; i++) {
      pStream->scale_factors[i] = (Ipp16s)common_scalefactor;
    }
  }

  if (pred) {
    Ipp32s *pred_used, pred_present;
    Ipp32s max_sfb_pred = pStream->max_sfb;

    pred_present = 0;
    pred_used = 0;

    if (pStream->audioObjectType == AOT_AAC_LTP) {
      pred_present = pStream->ltp_data_present;
      pred_used = pStream->ltp_long_used;
      if (max_sfb_pred > MAX_LTP_SFB_LONG) max_sfb_pred = MAX_LTP_SFB_LONG;
    }

    if (pred_present) {
      Ipp32s sfb;
      for (sfb = 0; sfb < max_sfb_pred; sfb++) {
        if (pred_used[sfb]) {
          Ipp32s begin = pStream->sfb_offset[sfb];
          Ipp32s end = pStream->sfb_offset[sfb+1];

          for (i = begin; i < end; i++) {
            pStream->x_quant[i] = x_quant_signed_pred[i];
          }
        }
      }
    }
  }
}

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

#define IFQSTEP 18658
#define SCALED_MAX 28773

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

static void aaciencCalcDist(sQuantizationBlock* pBlock,
                            sEnc_individual_channel_stream* pStream,
                            sDistortionBlock* pDist,
                            Ipp32s* mdct_line_int,
                            Ipp32s* mdct_line_pred_int,
                            Ipp32s  mdct_scaleFactor)
{
  Ipp32s mdct_rqnt[1024];
  Ipp32s *px_min = pDist->x_min;
  Ipp32s *px_min_pred = pDist->x_min_pred;
  Ipp32s *dist = pDist->distortion;
  Ipp32s *pred_used, pred_used_buf[MAX_SECTION_NUMBER];
  Ipp32s *saved_pred_used = pDist->saved_pred_used;
  Ipp32s *amplified = pDist->amplified;
  Ipp32s *sfb_offset = pStream->sfb_offset;
  Ipp16s *scale_factors = (Ipp16s*)pStream->scale_factors;
  Ipp16s *saved_scale_factors = (Ipp16s*)pDist->saved_scale_factors;
  Ipp16s *ns_scale_factors = pBlock->ns_scale_factors;
  Ipp32s shift = 2 * mdct_scaleFactor + pBlock->sfb_width_scale - 1;
  Ipp64s noise64;
  Ipp32s noise;
  Ipp32s i, sfb, win;
  Ipp16s dist_max16;

  if (mdct_line_pred_int) {
    Ipp32s pred_present;

    pred_present = 0;
    pred_used = 0;

    if (pStream->audioObjectType == AOT_AAC_LTP) {
      if (pStream->ltp_data_present) {
        pred_used = pStream->ltp_long_used;
      } else {
        pred_used = pred_used_buf;
        for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
          pred_used[sfb] = 0;
        }
      }
    } else {
      pred_used = pred_used_buf;
      for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
        pred_used[sfb] = 0;
      }
    }
  } else {
    pred_used = pred_used_buf;
    for (sfb = 0; sfb < MAX_SECTION_NUMBER; sfb++) {
      pred_used[sfb] = 0;
    }
  }

  pDist->above = 0;
  pDist->max_dist = 0;
  pDist->sum_dist = 0;
  pDist->above_dist = 0;

  for (win = 0; win < pStream->num_window_groups; win++) {
    for (sfb = 1; sfb < pStream->ath_max_sfb; sfb++) {
      Ipp32s sfb_start = sfb_offset[sfb];
      Ipp32s width = sfb_offset[sfb+1] - sfb_offset[sfb];

      if ((scale_factors[sfb] != saved_scale_factors[sfb]) ||
          (pred_used[sfb] != saved_pred_used[sfb]) ||
          (amplified[sfb])) {

        ippsPow43Scale_16s32s_Sf(pStream->x_quant, mdct_rqnt,
                                  scale_factors + sfb, sfb_offset + sfb,
                                  SF_OFFSET, 1, 1, 0);
        if (pred_used[sfb]) {
          noise64 = 0;
          for (i = 0; i < width; i++) {
            Ipp32s temp;
            temp = mdct_line_pred_int[sfb_start+i] - mdct_rqnt[i];
            noise64 += temp * (Ipp64s)temp;
          }
        } else {
          noise64 = 0;
          for (i = 0; i < width; i++) {
            Ipp32s temp;
            temp = mdct_line_int[sfb_start+i] - mdct_rqnt[i];
            noise64 += temp * (Ipp64s)temp;
          }
        }

        if (shift > 0) {
          noise = (Ipp32s)(noise64 >> shift);
        } else {
          noise = (Ipp32s)(noise64 << -shift);
        }

        dist[sfb] = 0;
        if (px_min_pred[sfb] > 0)
          ippsDiv_32s_Sfs(px_min_pred + sfb, &noise, dist + sfb, 1, -20);

        amplified[sfb] = 0;
        saved_scale_factors[sfb] = scale_factors[sfb];
        saved_pred_used[sfb] = pred_used[sfb];
      }

      pDist->sum_dist += dist[sfb];


      if (dist[sfb] >= 1) {
        pDist->above++;
        pDist->above_dist += dist[sfb];
      }

      if (dist[sfb] > pDist->max_dist) {
        pDist->max_dist = dist[sfb];
      }
    }

    scale_factors += pStream->max_sfb;
    saved_scale_factors += pStream->max_sfb;
    ns_scale_factors += pStream->max_sfb;
    sfb_offset += pStream->max_sfb;
    px_min += pStream->max_sfb;
    px_min_pred += pStream->max_sfb;
    dist += pStream->max_sfb;
    pred_used += pStream->max_sfb;
    saved_pred_used += pStream->max_sfb;
    amplified += pStream->max_sfb;
  }

  if (pDist->max_dist > (1 << 20))  {
    ippsSqrt_32s16s_Sfs(&pDist->max_dist, &dist_max16, 1, 0);
    pDist->max_dist = ((Ipp32s)dist_max16 << 10);
  }
}

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

static Ipp32s aaciencAdjustSF(sQuantizationBlock* pBlock,
                              sEnc_individual_channel_stream* pStream,
                              sDistortionBlock* pDist,
                              Ipp16s* mdct_scaled,
                              Ipp32s* mdct_line_pred_int,
                              Ipp16s* mdct_scaled_pred,
                              Ipp32s* pow34_scaleFact)
{
  Ipp32s *dist = pDist->distortion;
  Ipp32s *sfb_offset = pStream->sfb_offset;
  Ipp32s *amplified = pDist->amplified;
  Ipp16s *ns_scale_factors = pBlock->ns_scale_factors;
  Ipp32s sca_min, sca_max, sca_min_pred, sca_max_pred;
  Ipp32s sfb, win;
  Ipp32s ret_flag = 0;
  Ipp16s sca_min16, sca_max16;

  for (win = 0; win < pStream->num_window_groups; win++) {
    for (sfb = 1; sfb < pStream->ath_max_sfb; sfb++) {
      if (dist[sfb] >= pDist->max_dist) {
        if (ns_scale_factors[sfb] >= 5) {
          return 0;
        } else {
          Ipp32s sfb_start = sfb_offset[sfb];
          Ipp32s width = sfb_offset[sfb+1] - sfb_offset[sfb];

          ns_scale_factors[sfb] += 1;
          amplified[sfb] = 1;

          ippsMinMax_16s(mdct_scaled + sfb_start, width, &sca_min16, &sca_max16);
          sca_min = -((Ipp32s)sca_min16);
          sca_max = sca_max16;

          if (sca_min > sca_max) {
            sca_max = sca_min - 1;
          }

          if (mdct_line_pred_int) {
            ippsMinMax_16s(mdct_scaled_pred + sfb_start, width, &sca_min16, &sca_max16);
            sca_min_pred = -((Ipp32s)sca_min16);
            sca_max_pred = sca_max16;

            if (sca_min_pred > sca_max_pred) {
              sca_max_pred = sca_min_pred - 1;
            }

            if (sca_max_pred > sca_max) {
              sca_max = sca_max_pred;
            }
          }

          if (sca_max >= SCALED_MAX) {
            *pow34_scaleFact = *pow34_scaleFact + 1;
            ippsRShiftC_16s_I(1, mdct_scaled, pStream->max_line);
            if (mdct_line_pred_int) {
              ippsRShiftC_16s_I(1, mdct_scaled_pred,pStream->max_line);
            }
          }

          ippsMulC_16s_ISfs(IFQSTEP, mdct_scaled + sfb_start, width, 14);

          if (mdct_line_pred_int) {
            ippsMulC_16s_ISfs(IFQSTEP, mdct_scaled_pred + sfb_start, width, 14);
          }
        }
      }
      if (ns_scale_factors[sfb] == 0) {
        ret_flag = 1;
      }
    }
    ns_scale_factors += pStream->max_sfb;
    sfb_offset += pStream->max_sfb;
    dist += pStream->max_sfb;
    amplified += pStream->max_sfb;
  }

  return ret_flag;
}

⌨️ 快捷键说明

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