📄 ac3dec_mantissa.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 + -