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

📄 aac_enc_quantization_fp.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
字号:
/*////                  INTEL CORPORATION PROPRIETARY INFORMATION//     This software is supplied under the terms of a license agreement or//     nondisclosure agreement with Intel Corporation and may not be copied//     or disclosed except in accordance with the terms of that agreement.//          Copyright(c) 2003-2005 Intel Corporation. All Rights Reserved.////     Intel Integrated Performance Primitives AAC Encode Sample for Windows*////  By downloading and installing this sample, you hereby agree that the//  accompanying Materials are being provided to you under the terms and//  conditions of the End User License Agreement for the Intel Integrated//  Performance Primitives product previously accepted by you. Please refer//  to the file ipplic.htm located in the root directory of your Intel IPP//  product installation for more information.////  MPEG-4 and AAC are international standards promoted by ISO, IEC, ITU, ETSI//  and other organizations. Implementations of these standards, or the standard//  enabled platforms may require licenses from various entities, including//  Intel Corporation.//*/#include <math.h>#include <stdio.h>#include "ippac.h"#include "ipps.h"#include "aac_enc_quantization_fp.h"#include "aac_enc_search.h"/****************************************************************************/void main_loop(sQuantizationBlock* pBlock,               sEnc_individual_channel_stream* pStream,               Ipp32f* mdct_line,               Ipp32f* mdct_scaled,               Ipp32f* mdct_line_pred,               Ipp32f* mdct_scaled_pred);/****************************************************************************/void Quantization(sQuantizationBlock* pBlock,                  sEnc_individual_channel_stream* pStream,                  Ipp32f* mdct_line,                  Ipp32f* mdct_line_pred){  Ipp32f mdct_line_abs[N_LONG/2];  Ipp32f mdct_scaled[N_LONG/2];  Ipp32f mdct_scaled_pred[N_LONG/2];  float max_mdct_line, max_mdct_line_pred;  float start_common_scalefac;  float finish_common_scalefac;  pBlock->start_common_scalefac = -SF_OFFSET;  pBlock->finish_common_scalefac = -SF_OFFSET;  max_mdct_line = 0;  ippsAbs_32f(mdct_line, mdct_line_abs, N_LONG/2);  ippsPow34_32f(mdct_line_abs, mdct_scaled, N_LONG/2);  ippsMax_32f(mdct_scaled, N_LONG/2, &max_mdct_line);  if (mdct_line_pred) {    max_mdct_line_pred = 0;    ippsAbs_32f(mdct_line_pred, mdct_line_abs, N_LONG/2);    ippsPow34_32f(mdct_line_abs, mdct_scaled_pred, N_LONG/2);    ippsMax_32f(mdct_scaled_pred, N_LONG/2, &max_mdct_line_pred);    if (max_mdct_line_pred > max_mdct_line) {      max_mdct_line = max_mdct_line_pred;    }  }  if (max_mdct_line > 0) {    start_common_scalefac = (float)log(max_mdct_line/MAX_QUANT)/(float)log(2);    start_common_scalefac *= (float)16/(float)3;    pBlock->start_common_scalefac = (int)floor((double)start_common_scalefac);    if (pBlock->start_common_scalefac < start_common_scalefac)      pBlock->start_common_scalefac++;    finish_common_scalefac = (float)log(max_mdct_line/(1 - MAGIC_NUMBER))/(float)log(2);    finish_common_scalefac *= (float)16/(float)3;    pBlock->finish_common_scalefac = (int)floor((double)finish_common_scalefac);    if (pBlock->finish_common_scalefac < finish_common_scalefac)      pBlock->finish_common_scalefac++;    pBlock->finish_common_scalefac++;    if (pBlock->start_common_scalefac > 255 - SF_OFFSET) {      pBlock->start_common_scalefac = 255 - SF_OFFSET;    } else if (pBlock->start_common_scalefac < -SF_OFFSET) {      pBlock->start_common_scalefac = -SF_OFFSET;    }    if (pBlock->finish_common_scalefac > 255 - SF_OFFSET) {      pBlock->finish_common_scalefac = 255 - SF_OFFSET;    } else if (pBlock->finish_common_scalefac < -SF_OFFSET) {      pBlock->finish_common_scalefac = -SF_OFFSET;    }  }  main_loop(pBlock, pStream, mdct_line, mdct_scaled,            mdct_line_pred, mdct_scaled_pred);}/****************************************************************************/Ipp32f scalefac_pow[] = {  (Ipp32f)4.408719e+005, (Ipp32f)3.871411e+005, (Ipp32f)3.399587e+005,  (Ipp32f)2.985266e+005, (Ipp32f)2.621440e+005, (Ipp32f)2.301955e+005,  (Ipp32f)2.021407e+005, (Ipp32f)1.775050e+005, (Ipp32f)1.558718e+005,  (Ipp32f)1.368751e+005, (Ipp32f)1.201936e+005, (Ipp32f)1.055451e+005,  (Ipp32f)9.268190e+004, (Ipp32f)8.138639e+004, (Ipp32f)7.146751e+004,  (Ipp32f)6.275749e+004, (Ipp32f)5.510899e+004, (Ipp32f)4.839264e+004,  (Ipp32f)4.249484e+004, (Ipp32f)3.731583e+004, (Ipp32f)3.276800e+004,  (Ipp32f)2.877444e+004, (Ipp32f)2.526758e+004, (Ipp32f)2.218812e+004,  (Ipp32f)1.948397e+004, (Ipp32f)1.710938e+004, (Ipp32f)1.502419e+004,  (Ipp32f)1.319314e+004, (Ipp32f)1.158524e+004, (Ipp32f)1.017330e+004,  (Ipp32f)8.933439e+003, (Ipp32f)7.844686e+003, (Ipp32f)6.888623e+003,  (Ipp32f)6.049080e+003, (Ipp32f)5.311855e+003, (Ipp32f)4.664478e+003,  (Ipp32f)4.096000e+003, (Ipp32f)3.596804e+003, (Ipp32f)3.158448e+003,  (Ipp32f)2.773515e+003, (Ipp32f)2.435496e+003, (Ipp32f)2.138673e+003,  (Ipp32f)1.878024e+003, (Ipp32f)1.649142e+003, (Ipp32f)1.448155e+003,  (Ipp32f)1.271662e+003, (Ipp32f)1.116680e+003, (Ipp32f)9.805858e+002,  (Ipp32f)8.610779e+002, (Ipp32f)7.561350e+002, (Ipp32f)6.639819e+002,  (Ipp32f)5.830598e+002, (Ipp32f)5.120000e+002, (Ipp32f)4.496006e+002,  (Ipp32f)3.948060e+002, (Ipp32f)3.466894e+002, (Ipp32f)3.044370e+002,  (Ipp32f)2.673341e+002, (Ipp32f)2.347530e+002, (Ipp32f)2.061428e+002,  (Ipp32f)1.810193e+002, (Ipp32f)1.589578e+002, (Ipp32f)1.395850e+002,  (Ipp32f)1.225732e+002, (Ipp32f)1.076347e+002, (Ipp32f)9.451687e+001,  (Ipp32f)8.299773e+001, (Ipp32f)7.288247e+001, (Ipp32f)6.400000e+001,  (Ipp32f)5.620007e+001, (Ipp32f)4.935075e+001, (Ipp32f)4.333618e+001,  (Ipp32f)3.805463e+001, (Ipp32f)3.341676e+001, (Ipp32f)2.934413e+001,  (Ipp32f)2.576785e+001, (Ipp32f)2.262742e+001, (Ipp32f)1.986972e+001,  (Ipp32f)1.744812e+001, (Ipp32f)1.532165e+001, (Ipp32f)1.345434e+001,  (Ipp32f)1.181461e+001, (Ipp32f)1.037472e+001, (Ipp32f)9.110309e+000,  (Ipp32f)8.000000e+000, (Ipp32f)7.025009e+000, (Ipp32f)6.168843e+000,  (Ipp32f)5.417022e+000, (Ipp32f)4.756828e+000, (Ipp32f)4.177095e+000,  (Ipp32f)3.668016e+000, (Ipp32f)3.220981e+000, (Ipp32f)2.828427e+000,  (Ipp32f)2.483716e+000, (Ipp32f)2.181015e+000, (Ipp32f)1.915207e+000,  (Ipp32f)1.681793e+000, (Ipp32f)1.476826e+000, (Ipp32f)1.296840e+000,  (Ipp32f)1.138789e+000, (Ipp32f)1.000000e+000, (Ipp32f)8.781261e-001,  (Ipp32f)7.711054e-001, (Ipp32f)6.771278e-001, (Ipp32f)5.946036e-001,  (Ipp32f)5.221369e-001, (Ipp32f)4.585020e-001, (Ipp32f)4.026226e-001,  (Ipp32f)3.535534e-001, (Ipp32f)3.104645e-001, (Ipp32f)2.726269e-001,  (Ipp32f)2.394008e-001, (Ipp32f)2.102241e-001, (Ipp32f)1.846033e-001,  (Ipp32f)1.621049e-001, (Ipp32f)1.423486e-001, (Ipp32f)1.250000e-001,  (Ipp32f)1.097658e-001, (Ipp32f)9.638818e-002, (Ipp32f)8.464097e-002,  (Ipp32f)7.432544e-002, (Ipp32f)6.526711e-002, (Ipp32f)5.731275e-002,  (Ipp32f)5.032782e-002, (Ipp32f)4.419417e-002, (Ipp32f)3.880806e-002,  (Ipp32f)3.407837e-002, (Ipp32f)2.992510e-002, (Ipp32f)2.627801e-002,  (Ipp32f)2.307541e-002, (Ipp32f)2.026312e-002, (Ipp32f)1.779357e-002,  (Ipp32f)1.562500e-002, (Ipp32f)1.372072e-002, (Ipp32f)1.204852e-002,  (Ipp32f)1.058012e-002, (Ipp32f)9.290681e-003, (Ipp32f)8.158389e-003,  (Ipp32f)7.164094e-003, (Ipp32f)6.290978e-003, (Ipp32f)5.524272e-003,  (Ipp32f)4.851007e-003, (Ipp32f)4.259796e-003, (Ipp32f)3.740638e-003,  (Ipp32f)3.284752e-003, (Ipp32f)2.884426e-003, (Ipp32f)2.532890e-003,  (Ipp32f)2.224197e-003, (Ipp32f)1.953125e-003, (Ipp32f)1.715090e-003,  (Ipp32f)1.506065e-003, (Ipp32f)1.322515e-003, (Ipp32f)1.161335e-003,  (Ipp32f)1.019799e-003, (Ipp32f)8.955118e-004, (Ipp32f)7.863722e-004,  (Ipp32f)6.905340e-004, (Ipp32f)6.063759e-004, (Ipp32f)5.324745e-004,  (Ipp32f)4.675797e-004, (Ipp32f)4.105940e-004, (Ipp32f)3.605533e-004,  (Ipp32f)3.166112e-004, (Ipp32f)2.780246e-004, (Ipp32f)2.441406e-004,  (Ipp32f)2.143863e-004, (Ipp32f)1.882582e-004, (Ipp32f)1.653144e-004,  (Ipp32f)1.451669e-004, (Ipp32f)1.274748e-004, (Ipp32f)1.119390e-004,  (Ipp32f)9.829653e-005, (Ipp32f)8.631675e-005, (Ipp32f)7.579699e-005,  (Ipp32f)6.655931e-005, (Ipp32f)5.844747e-005, (Ipp32f)5.132424e-005,  (Ipp32f)4.506916e-005, (Ipp32f)3.957640e-005, (Ipp32f)3.475307e-005,  (Ipp32f)3.051758e-005, (Ipp32f)2.679828e-005, (Ipp32f)2.353227e-005,  (Ipp32f)2.066430e-005, (Ipp32f)1.814586e-005, (Ipp32f)1.593435e-005,  (Ipp32f)1.399237e-005, (Ipp32f)1.228707e-005, (Ipp32f)1.078959e-005,  (Ipp32f)9.474623e-006, (Ipp32f)8.319914e-006, (Ipp32f)7.305933e-006,  (Ipp32f)6.415531e-006, (Ipp32f)5.633645e-006, (Ipp32f)4.947050e-006,  (Ipp32f)4.344134e-006, (Ipp32f)3.814697e-006, (Ipp32f)3.349785e-006,  (Ipp32f)2.941534e-006, (Ipp32f)2.583037e-006, (Ipp32f)2.268233e-006,  (Ipp32f)1.991794e-006, (Ipp32f)1.749046e-006, (Ipp32f)1.535883e-006,  (Ipp32f)1.348699e-006, (Ipp32f)1.184328e-006, (Ipp32f)1.039989e-006,  (Ipp32f)9.132417e-007, (Ipp32f)8.019413e-007, (Ipp32f)7.042056e-007,  (Ipp32f)6.183813e-007, (Ipp32f)5.430167e-007, (Ipp32f)4.768372e-007,  (Ipp32f)4.187231e-007, (Ipp32f)3.676917e-007, (Ipp32f)3.228797e-007,  (Ipp32f)2.835291e-007, (Ipp32f)2.489743e-007, (Ipp32f)2.186308e-007,  (Ipp32f)1.919854e-007, (Ipp32f)1.685874e-007, (Ipp32f)1.480410e-007,  (Ipp32f)1.299987e-007, (Ipp32f)1.141552e-007, (Ipp32f)1.002427e-007,  (Ipp32f)8.802570e-008, (Ipp32f)7.729766e-008, (Ipp32f)6.787709e-008,  (Ipp32f)5.960464e-008, (Ipp32f)5.234039e-008, (Ipp32f)4.596146e-008,  (Ipp32f)4.035996e-008, (Ipp32f)3.544113e-008, (Ipp32f)3.112178e-008,  (Ipp32f)2.732885e-008, (Ipp32f)2.399818e-008, (Ipp32f)2.107342e-008,  (Ipp32f)1.850512e-008, (Ipp32f)1.624983e-008, (Ipp32f)1.426940e-008,  (Ipp32f)1.253033e-008, (Ipp32f)1.100321e-008, (Ipp32f)9.662208e-009,  (Ipp32f)8.484637e-009, (Ipp32f)7.450581e-009, (Ipp32f)6.542549e-009,  (Ipp32f)5.745183e-009, (Ipp32f)5.044995e-009, (Ipp32f)4.430142e-009,  (Ipp32f)3.890223e-009, (Ipp32f)3.416106e-009, (Ipp32f)2.999772e-009,  (Ipp32f)2.634178e-009, (Ipp32f)2.313140e-009, (Ipp32f)2.031229e-009,  (Ipp32f)1.783675e-009};/****************************************************************************/void main_loop(sQuantizationBlock* pBlock,               sEnc_individual_channel_stream* pStream,               Ipp32f* mdct_line,               Ipp32f* mdct_scaled,               Ipp32f* mdct_line_pred,               Ipp32f* mdct_scaled_pred){  Ipp32f tmp_x_quant[N_LONG/2];  Ipp16s mdct_sign[N_LONG/2];  Ipp16s mdct_sign_pred[N_LONG/2];  Ipp16s x_quant_unsigned[N_LONG/2];  Ipp16s quant_unsigned_pred[N_LONG/2];  Ipp16s x_quant_signed_pred[N_LONG/2];  Ipp16s *x_quant_unsigned_pred;  Ipp32f sf, temp;  int start_common_scalefac = pBlock->start_common_scalefac;  int finish_common_scalefac = pBlock->finish_common_scalefac;  int common_scalefactor;  int common_scalefactor_update;  int needed_bits, bits_for_scale_factor_data;  int num_scale_factor, pred;  int i;  num_scale_factor = pStream->num_window_groups * pStream->max_sfb;  pred = 0;  if (mdct_line_pred) {    pred = 1;  }  for (i = 0; i < N_LONG/2; i++) {    mdct_sign[i] = SIGN(mdct_line[i]);  }  x_quant_unsigned_pred = 0;  if (pred) {    for (i = 0; i < N_LONG/2; 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(;;) {    sf = (Ipp32f)scalefac_pow[common_scalefactor + SF_OFFSET];    temp = (Ipp32f)(MAGIC_NUMBER - 0.5f)/sf;    ippsAddC_32f(mdct_scaled, temp, tmp_x_quant, N_LONG/2);    ippsMulC_Low_32f16s(tmp_x_quant, sf, x_quant_unsigned, N_LONG/2);    ippsMul_16s(mdct_sign, x_quant_unsigned, pStream->x_quant, N_LONG/2);    if (pred) {      ippsAddC_32f(mdct_scaled_pred, temp, tmp_x_quant, N_LONG/2);      ippsMulC_Low_32f16s(tmp_x_quant, sf, x_quant_unsigned_pred, N_LONG/2);      ippsMul_16s(mdct_sign_pred, x_quant_unsigned_pred, x_quant_signed_pred, N_LONG/2);    }    needed_bits = best_codebooks_search(pStream, x_quant_unsigned,                                        pStream->x_quant, x_quant_unsigned_pred,                                        x_quant_signed_pred);    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;  for (i = 0; i < num_scale_factor; i++) {    pStream->scale_factors[i] = (short)common_scalefactor;  }  if (pred) {    int *pred_used, pred_present;    int 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) {      int sfb;      for (sfb = 0; sfb < max_sfb_pred; sfb++) {        if (pred_used[sfb]) {          int begin = pStream->sfb_offset[sfb];          int end = pStream->sfb_offset[sfb+1];          for (i = begin; i < end; i++) {            pStream->x_quant[i] = x_quant_signed_pred[i];          }        }      }    }  }}/****************************************************************************/

⌨️ 快捷键说明

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