📄 ac3dec_downmixing.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"#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 + -