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

📄 ac3dec_downmixing.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*//////////////////////////////////////////////////////////////////////////////////                  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) 2002-2005 Intel Corporation. All Rights Reserved.//*/#include "umc_ac3_decoder.h"#include "ipps.h"#include "ippac.h"#define DB11           7509 * 256#define COMP_CUSTOM_A  0#define COMP_CUSTOM_D  1#define COMP_LINE      2#define COMP_RF        3static const short NFRONT[8] = { 2, 1, 2, 3, 2, 3, 2, 3 };static const short NREAR[8] = { 0, 0, 0, 0, 1, 1, 2, 2 };//#define m6dB  0.5000345f    /* -6.0 dB *///#define m3dB  0.7071312f    /* -3.0 dB *///#define m45dB 0.594292158f  /* -4.5 dB */#define m6dB  0.5f          /* -6.0 dB */#define m3dB  0.707106781f  /* -3.0 dB */#define m45dB 0.594603557f  /* -4.5 dB */const float cmixlev_lut[4] = {  m3dB, m45dB, m6dB, m45dB};const float smixlev_lut[4] = {  m3dB, m6dB, 0, m6dB};static const float karaokeTable[4][18] = {  {1.00000000f,  0.00000000f,  0.00000000f,  0.70710677f,   0.70710677f,  0.00000000f,  0.00000000f,  0.00000000f,   0.00000000f,  1.00000000f,  1.00000000f,  1.00000000f,   0.00000000f,  0.00000000f,  0.00000000f,  1.00000000f,   0.00000000f,  0.00000000f},  {1.00000000f,  0.70713121f,  0.00000000f,  0.70710677f,   0.70710677f,  0.70710677f,  0.70710677f,  0.00000000f,   0.00000000f,  1.00000000f,  1.00000000f,  1.00000000f,   0.00000000f,  0.00000000f,  0.00000000f,  1.00000000f,   1.00000000f,  0.00000000f},  {1.00000000f,  0.00000000f,  0.70713121f,  0.70710677f,   0.70710677f,  0.00000000f,  0.00000000f,  0.70710677f,   0.70710677f,  1.00000000f,  1.00000000f,  1.00000000f,   0.00000000f,  0.00000000f,  0.00000000f,  1.00000000f,   0.00000000f,  1.00000000f},  {1.00000000f,  0.70713121f,  0.70713121f,  0.70710677f,   0.70710677f,  1.00000000f,  0.00000000f,  0.00000000f,   1.00000000f,  1.00000000f,  1.00000000f, -1.00000000f,   0.00000000f,  1.00000000f,  1.00000000f,  1.00000000f,   0.00000000f,  0.00000000f},};float UMC::AC3Decoder::drc(int compre,                           int compr,                           int dynrng,                           int downmix,                           float dialnorm){  int tmp;  float gain;  if (decoder_settings.out_compmod == COMP_RF) {    if (compre) {      if (compr)        gain = (float)compr + DB11;      else              gain = (float)dynrng + DB11;    } else if (downmix) gain = (float)dynrng - DB11;    else gain = (float)dynrng;  } else if (decoder_settings.out_compmod == COMP_LINE) {    if (dynrng > 0)     gain = (float)dynrng * decoder_settings.drc_scaleLow;    else if (downmix)   gain = (float)dynrng;    else                gain = (float)dynrng * decoder_settings.drc_scaleHigh;  } else {    if (dynrng > 0)     gain = (float)dynrng * decoder_settings.drc_scaleLow;    else                gain = (float)dynrng * decoder_settings.drc_scaleHigh;    if (downmix)        gain = gain - DB11;  }  tmp = (int)(gain);  gain = ((float)((tmp & 0xFFFFF) + 1048576)) /         ((float)(1 << (20 - (tmp >> 20))));  if (decoder_settings.out_compmod != COMP_CUSTOM_A)    gain *= dialnorm;  return gain;}int UMC::AC3Decoder::Downmix(int dynrng,                             int dynrng2){  int   downmix;  float cmixgain;  /* center channel mix gain */  float smixgain;  /* surround channel mix gain */  float gain;  short infront, inrear, outfront, outrear;  float *samL  = NULL;  float *samC  = NULL;  float *samR  = NULL;  float *samSL = NULL ;  float *samSR = NULL;  float *samS  = NULL;  float *samLFE= NULL;  float *karaokeSL= NULL;//---------------------------------------------------------------------------------------------------------------------------/* init in_channel */  switch (bsi.acmod) {  case ACMOD_0:    samL = data_vectors.stream_samples.channel[0];    samR = data_vectors.stream_samples.channel[1];// ---    samC = data_vectors.stream_samples.channel[2];    samSL = data_vectors.stream_samples.channel[3];    samSR = data_vectors.stream_samples.channel[4];    samS = data_vectors.stream_samples.channel[6];    ippsZero_32f(samC, 512);    ippsZero_32f(samSL, 512);    ippsZero_32f(samSR, 512);    ippsZero_32f(samS, 512);    break;// ---  case ACMOD_10:    samC = data_vectors.stream_samples.channel[0];// ---    samL = data_vectors.stream_samples.channel[1];    samR = data_vectors.stream_samples.channel[2];    samSL = data_vectors.stream_samples.channel[3];    samSR = data_vectors.stream_samples.channel[4];    samS = data_vectors.stream_samples.channel[6];    ippsZero_32f(samL, 512);    ippsZero_32f(samR, 512);    ippsZero_32f(samSL, 512);    ippsZero_32f(samSR, 512);    ippsZero_32f(samS, 512);    break;  case ACMOD_20:    samL = data_vectors.stream_samples.channel[0];    samR = data_vectors.stream_samples.channel[1];// ---    samC = data_vectors.stream_samples.channel[2];    samSL = data_vectors.stream_samples.channel[3];    samSR = data_vectors.stream_samples.channel[4];    samS = data_vectors.stream_samples.channel[6];    ippsZero_32f(samC, 512);    ippsZero_32f(samSL, 512);    ippsZero_32f(samSR, 512);    ippsZero_32f(samS, 512);    break;  case ACMOD_30:    samL = data_vectors.stream_samples.channel[0];    samC = data_vectors.stream_samples.channel[1];    samR = data_vectors.stream_samples.channel[2];// ---    samSL = data_vectors.stream_samples.channel[3];    samSR = data_vectors.stream_samples.channel[4];    samS = data_vectors.stream_samples.channel[6];    ippsZero_32f(samSL, 512);    ippsZero_32f(samSR, 512);    ippsZero_32f(samS, 512);    break;  case ACMOD_21:    samL = data_vectors.stream_samples.channel[0];    samR = data_vectors.stream_samples.channel[1];    samS = data_vectors.stream_samples.channel[2];    karaokeSL = samS;// ---    samC = data_vectors.stream_samples.channel[3];    samSL = data_vectors.stream_samples.channel[4];    samSR = data_vectors.stream_samples.channel[6];    ippsZero_32f(samC, 512);    ippsZero_32f(samSL, 512);    ippsZero_32f(samSR, 512);    break;  case ACMOD_31:    samL = data_vectors.stream_samples.channel[0];    samC = data_vectors.stream_samples.channel[1];    samR = data_vectors.stream_samples.channel[2];    samS = data_vectors.stream_samples.channel[3];    karaokeSL = samS;// ---    samSL = data_vectors.stream_samples.channel[4];    samSR = data_vectors.stream_samples.channel[6];    ippsZero_32f(samSL, 512);    ippsZero_32f(samSR, 512);    break;  case ACMOD_22:    samL = data_vectors.stream_samples.channel[0];    samR = data_vectors.stream_samples.channel[1];    samSL = data_vectors.stream_samples.channel[2];    samSR = data_vectors.stream_samples.channel[3];    karaokeSL = samSL;// ---    samC = data_vectors.stream_samples.channel[4];    samS = data_vectors.stream_samples.channel[6];    ippsZero_32f(samC, 512);    ippsZero_32f(samS, 512);    break;  case ACMOD_32:    samL = data_vectors.stream_samples.channel[0];    samC = data_vectors.stream_samples.channel[1];    samR = data_vectors.stream_samples.channel[2];    samSL = data_vectors.stream_samples.channel[3];    samSR = data_vectors.stream_samples.channel[4];    karaokeSL = samSL;// ---    samS = data_vectors.stream_samples.channel[6];    ippsZero_32f(samS, 512);    break;  default:    break;  }     // switch( bsi.acmod )  samLFE = data_vectors.stream_samples.channel[5];  if (!bsi.lfeon) {    ippsZero_32f(samLFE, 512);  }/* * Set up downmix parameters */  infront = NFRONT[bsi.acmod];  inrear = NREAR[bsi.acmod];  outfront = NFRONT[decoder_settings.out_acmod];  outrear = NREAR[decoder_settings.out_acmod];  cmixgain = cmixlev_lut[bsi.cmixlev];  smixgain = smixlev_lut[bsi.surmixlev];  downmix = 0;  if (bsi.acmod == ACMOD_0) {   /* 1+1 mode, dual independent mono channels present */    gain = drc(bsi.compre, bsi.compr, dynrng, 0, bsi.dialnorm);    ippsMulC_32f_I(gain, samL, 512);    gain = drc(bsi.compr2e, bsi.compr2, dynrng2, 0, bsi.dialnorm2);    ippsMulC_32f_I(gain, samR, 512);    if (outfront == 1) {        /* 1 front loudspeaker (center) */      if (decoder_settings.dualmonomode == DUAL_LEFTMONO) {        ippsCopy_32f(samL, samC, 512);      } else if (decoder_settings.dualmonomode == DUAL_RGHTMONO) {        ippsCopy_32f(samR, samC, 512);      } else {        ippsAdd_32f(samL, samR, samC, 512);        ippsMulC_32f_I(m6dB, samC, 512);        // 0.501187233 = -6dB      }    } else if (outfront == 2) {      if (decoder_settings.dualmonomode == DUAL_LEFTMONO) {        ippsMulC_32f_I(m3dB, samL, 512);        // 0.707945 = -3dB        ippsCopy_32f(samL, samR, 512);      } else if (decoder_settings.dualmonomode == DUAL_RGHTMONO) {        ippsMulC_32f_I(m3dB, samR, 512);        // 0.707945 = -3dB        ippsCopy_32f(samR, samL, 512);      } else if (decoder_settings.dualmonomode == DUAL_MIXMONO) {        ippsAdd_32f_I(samR, samL, 512);        ippsMulC_32f_I(m6dB, samL, 512);        // 0.501187233 = -6dB

⌨️ 快捷键说明

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