📄 ac3dec_coupling.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 "ac3dec_tables.h"#include "ippac.h"#include "ipps.h"void UMC::AC3Decoder::MakeFloat_32f32f(Ipp32f *inmant, Ipp16s *inexp, Ipp32s size, Ipp32f *outfloat){ Ipp32s i; Ipp32s bias; Ipp32f tmp; for (i = 0; i < size; i++) { bias = 112 - (Ipp32s)inexp[i]; bias = bias << 23; bias = bias & 0x7FFFFFFF; *(Ipp32s*)(&tmp) = bias; outfloat[i] = inmant[i]*tmp; }}int UMC::AC3Decoder::DeCoupling(int nblk){ int i; for (i = 0; i < bsi.nfchans; i++) { MakeFloat_32f32f(&audblk[nblk]->fbw_mant[i][0], (Ipp16s *)&audblk[nblk]->fbw_exp[i][0], audblk[nblk]->endmant[i], &data_vectors.stream_coeffs.channel[i][0]); ippsZero_32f(&(data_vectors.stream_coeffs.channel[i][audblk[nblk]->endmant[i]]), 256 - audblk[nblk]->endmant[i]); } if (audblk[nblk]->cplinu) { uncoupleChannel( (Ipp16u)nblk ); } if (bsi.lfeon) { MakeFloat_32f32f(&audblk[nblk]->lfe_mant[0], (Ipp16s *)&audblk[nblk]->lfe_exp[0], 7, &data_vectors.stream_coeffs.channel[5][0]); } else { ippsZero_32f(&(data_vectors.stream_coeffs.channel[i][0]), 7); } return 1;}void UMC::AC3Decoder::uncoupleChannel(Ipp16u nblk){ int i, ch; int cplChannel = 0; for (ch = 0; ch < bsi.nfchans; ch++) { float *stream_koeffs = data_vectors.stream_coeffs.channel[ch]; float cpl_coord = 0; int bnd = 0; int ind;#ifndef REF_DECODER_COMPATIBLE int testBsi = 0, bnd1 = 0; if (bsi.acmod == 0x02 && ch == 1 && audblk[nblk]->phsflginu) testBsi = 1;#endif if (audblk[nblk]->chincpl[ch]) { float *stream_koeffs_cpl = data_vectors.stream_coeffs.cplChannel[cplChannel]; float dpfac = phscorFac[decoder_settings.out_acmod][bsi.acmod][bsi.surmixlev][ch]; float epfac = phscorFac[audblk[nblk]->phsoutmod][bsi.acmod][bsi.surmixlev][ch]; cplChannel++; for (i = audblk[nblk]->cplstrtmant; i < audblk[nblk]->cplendmant; i += 12) {#ifndef REF_DECODER_COMPATIBLE if (!audblk[nblk]->cplbndstrc[bnd]) { phsflg = audblk[nblk]->phsflg[bnd1]; ind = 15 + (int)(audblk[nblk]->phscor[bnd1] * dpfac + 0.5) - (int)(audblk[nblk]->phscor[bnd1] * epfac + 0.5); cpl_coord = audblk[nblk]->cplcoord[ch][bnd1] * phsCorTab[ind]; if (cpl_coord > 1) cpl_coord = 1; else if (cpl_coord < -1) cpl_coord = -1; bnd1++; } if (testBsi && phsflg) { ippsMulC_32f(stream_koeffs_cpl+i, -cpl_coord, stream_koeffs+i, 12); } else { ippsMulC_32f(stream_koeffs_cpl+i, cpl_coord, stream_koeffs+i, 12); }#else ind = 15 + (int)(audblk[nblk]->phscor[bnd] * dpfac + 0.5) - (int)(audblk[nblk]->phscor[bnd] * epfac + 0.5); cpl_coord = audblk[nblk]->cplcoord[ch][bnd] * phsCorTab[ind]; if (cpl_coord > 8) cpl_coord = 8; else if (cpl_coord < -8) cpl_coord = -8; ippsMulC_32f(stream_koeffs_cpl+i, cpl_coord, stream_koeffs+i, 12);#endif bnd++; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -