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

📄 ac3dec_mantissa.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
字号:
/*//////////////////////////////////////////////////////////////////////////////////                  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"#define DITHMULT  47989#define DITHER_GEN(x)                                            \{                                                                \  int tmp0, tmp1;                                                \  tmp0 = (((int)(DITHMULT * mants_tabls.dithtemp)) << 16) >> 16; \  mants_tabls.dithtemp = (short)tmp0;                            \  tmp1 = (((int)(DITHMULT * mants_tabls.dithtemp)) << 16) >> 16; \  mants_tabls.dithtemp = (short)tmp1;                            \  x = (0.707106781f * 0.5f * (tmp0 + tmp1));                     \}//------------------------------------------------------------------------------/* The mapping of coded mantissa value into the actual mantissa value is shown in tables Table 7.19 through Table 7.23.*/static const Ipp32f q_1[3] =   // Table 7.19 bap=1 (3-Level) Quantization{  (-2 << 15) / (Ipp32f)3, 0, (2 << 15) / (Ipp32f)3};static const Ipp32f q_2[5] =   // Table 7.20 bap=2 (5-Level) Quantization{  (-4 << 15) / (Ipp32f)5, (-2 << 15) / (Ipp32f)5, 0,  (2 << 15)  / (Ipp32f)5, (4 << 15)  / (Ipp32f)5};static const Ipp32f q_3[7] =   // Table 7.21 bap=3 (7-Level) Quantization{  (-6 << 15) / (Ipp32f)7, (-4 << 15) / (Ipp32f)7, (-2 << 15) / (Ipp32f)7, 0,  (2 << 15)  / (Ipp32f)7, (4 << 15)  / (Ipp32f)7, (6 << 15)  / (Ipp32f)7};static const Ipp32f q_4[11] =  // Table 7.22 bap=4 (11-Level) Quantization{  (-10 << 15) / (Ipp32f)11, (-8 << 15) / (Ipp32f)11, (-6 << 15) / (Ipp32f)11,  (-4 << 15)  / (Ipp32f)11, (-2 << 15) / (Ipp32f)11,                       0,  (2 << 15)   / (Ipp32f)11, (4 << 15)  / (Ipp32f)11, (6 << 15)  / (Ipp32f)11,  (8 << 15)   / (Ipp32f)11, (10 << 15) / (Ipp32f)11};static const Ipp32f q_5[15] =  // Table 7.23 bap=5 (15-Level) Quantization{  (-14 << 15) / (Ipp32f)15, (-12 << 15) / (Ipp32f)15, (-10 << 15) / (Ipp32f)15,  (-8 << 15)  / (Ipp32f)15, (-6 << 15)  / (Ipp32f)15, (-4 << 15)  / (Ipp32f)15,  (-2 << 15)  / (Ipp32f)15,                        0, (2 << 15)   / (Ipp32f)15,  (4 << 15)   / (Ipp32f)15, (6 << 15)   / (Ipp32f)15, (8 << 15)   / (Ipp32f)15,  (10 << 15)  / (Ipp32f)15, (12 << 15)  / (Ipp32f)15, (14 << 15)  / (Ipp32f)15};//Conversion from bap to number of bits in the mantissas//zeros account for cases 0,1,2,4 which are special casedstatic const Ipp16u  QNTTZTAB[16] = { 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 };static const Ipp16u  INV_QNTTZTAB[16] =  { 16, 16, 16, 13, 16, 12, 11, 12, 9, 8, 7, 6, 5, 4, 2, 0 };int UMC::AC3Decoder::getMantissas(Ipp16u *bap, int do_dither, Ipp32f *mant,                                  int count){  Ipp16u index;  int tmp;  if (do_dither) {    for (int i = 0; i < count; i++) {      switch (bap[i]) {      case 0:        DITHER_GEN(mant[i]);        break;      case 1:        if (mants_tabls.m_1_pointer > 2) {          mants_tabls.fast_m_1 = mants_tabls.fastM_9[getbits(5)];          mants_tabls.m_1_pointer = 0;        }        mant[i] = q_1[mants_tabls.fast_m_1[mants_tabls.m_1_pointer++]];        break;      case 2:        if (mants_tabls.m_2_pointer > 2) {          mants_tabls.fast_m_2 = mants_tabls.fastM_25[getbits(7)];          mants_tabls.m_2_pointer = 0;        }        mant[i] = q_2[mants_tabls.fast_m_2[mants_tabls.m_2_pointer++]];        break;      case 3:        mant[i] = q_3[getbits(3)];        break;      case 4:        if (mants_tabls.m_4_pointer > 1) {          mants_tabls.fast_m_4 = mants_tabls.fastM_11[getbits(7)];          mants_tabls.m_4_pointer = 0;        }        mant[i] = q_4[mants_tabls.fast_m_4[mants_tabls.m_4_pointer++]];        break;      case 5:        mant[i] = q_5[getbits(4)];        break;      default:        index = QNTTZTAB[bap[i]];        tmp = getbits(index);        tmp <<= (32 - index);        mant[i] = (Ipp32f)(tmp >>16);      }    }  } else {    for (int i = 0; i < count; i++) {      switch (bap[i]) {      case 0:        mant[i] = 0;        break;      case 1:        if (mants_tabls.m_1_pointer > 2) {          mants_tabls.fast_m_1 = mants_tabls.fastM_9[getbits(5)];          mants_tabls.m_1_pointer = 0;        }        mant[i] = q_1[mants_tabls.fast_m_1[mants_tabls.m_1_pointer++]];        break;      case 2:        if (mants_tabls.m_2_pointer > 2) {          mants_tabls.fast_m_2 = mants_tabls.fastM_25[getbits(7)];          mants_tabls.m_2_pointer = 0;        }        mant[i] = q_2[mants_tabls.fast_m_2[mants_tabls.m_2_pointer++]];        break;      case 3:        mant[i] = q_3[getbits(3)];        break;      case 4:        if (mants_tabls.m_4_pointer > 1) {          mants_tabls.fast_m_4 = mants_tabls.fastM_11[getbits(7)];          mants_tabls.m_4_pointer = 0;        }        mant[i] = q_4[mants_tabls.fast_m_4[mants_tabls.m_4_pointer++]];        break;      case 5:        mant[i] = q_5[getbits(4)];        break;      default:        index = QNTTZTAB[bap[i]];        tmp = getbits(index);        tmp <<= (32 - index);        mant[i] = (Ipp32f)(tmp >>16);      }    }  }  return 1;}int UMC::AC3Decoder::UnpackMantissas(int nblk){  int    i, j;  Ipp32u done_cpl = 0;  float  *mant_ptr;  Ipp16u *bap_ptr;  Ipp16s *exp_ptr;  int do_dither = 0;  int cplChannel = 0;  int count;  mants_tabls.m_1_pointer = mants_tabls.m_2_pointer = mants_tabls.m_4_pointer =    3;  for (i = 0; i < bsi.nfchans; i++) {    mant_ptr = &(audblk[nblk]->fbw_mant[i][0]);    bap_ptr = &(audblk[nblk]->fbw_bap[i][0]);    do_dither = audblk[nblk]->dithflag[i];    getMantissas(bap_ptr, do_dither, mant_ptr,                 audblk[nblk]->endmant[i]);    if (audblk[nblk]->cplinu && audblk[nblk]->chincpl[i]) {      j = audblk[nblk]->cplstrtmant;      mant_ptr = &audblk[nblk]->cpl_mant[j];      bap_ptr = &audblk[nblk]->cpl_bap[j];      exp_ptr = (Ipp16s *)&audblk[nblk]->cpl_exp[j];      count = audblk[nblk]->cplendmant - audblk[nblk]->cplstrtmant;      if (!done_cpl) {        getMantissas(bap_ptr, do_dither, mant_ptr, count);        MakeFloat_32f32f(mant_ptr, exp_ptr, count,                             &data_vectors.stream_coeffs.cplChannel[cplChannel][j]);      } else if (do_dither) {        int ii;        for (ii = 0; ii < count; ii++) {          if (bap_ptr[ii] == 0) {            float tmp;            DITHER_GEN(mant_ptr[ii]);            *(int*)(&tmp) = (((112 - (int)exp_ptr[ii]) << 23) & 0x7FFFFFFF);            data_vectors.stream_coeffs.cplChannel[cplChannel][j + ii] =              (float)mant_ptr[ii] * tmp;          } else {            data_vectors.stream_coeffs.cplChannel[cplChannel][j + ii] =              data_vectors.stream_coeffs.cplChannel[0][j + ii];          }        }      } else {        int ii;        for (ii = 0; ii < count; ii++) {          if (bap_ptr[ii] == 0) {            data_vectors.stream_coeffs.cplChannel[cplChannel][j + ii] = 0;          } else {            data_vectors.stream_coeffs.cplChannel[cplChannel][j + ii] =              data_vectors.stream_coeffs.cplChannel[0][j + ii];          }        }      }      done_cpl = 1;      cplChannel++;    }  }  if (bsi.lfeon) {    mant_ptr = &audblk[nblk]->lfe_mant[0];    bap_ptr = &audblk[nblk]->lfe_bap[0];    /* There are always 7 mantissas for lfe */    getMantissas(bap_ptr, 0, mant_ptr, 7);    mant_ptr += 7;  }  return 1;}

⌨️ 快捷键说明

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