📄 ac3dec_downmixing.cpp
字号:
ippsCopy_32f(samL, samR, 512); } } else { if (decoder_settings.dualmonomode == DUAL_LEFTMONO) { ippsCopy_32f(samL, samC, 512); ippsZero_32f(samL, 512); ippsZero_32f(samR, 512); } else if (decoder_settings.dualmonomode == DUAL_RGHTMONO) { ippsCopy_32f(samR, samC, 512); ippsZero_32f(samL, 512); ippsZero_32f(samR, 512); } else if (decoder_settings.dualmonomode == DUAL_MIXMONO) { ippsMulC_32f_I(m6dB, samL, 512); // 0.501187233 = -6dB ippsMulC_32f_I(m6dB, samR, 512); // 0.501187233 = -6dB ippsAdd_32f(samL, samR, samC, 512); ippsZero_32f(samL, 512); ippsZero_32f(samR, 512); } } } else if (bsi.karaokeMode) { int karaokeCapable = decoder_settings.karaokeCapable; downmix = 1; if (outfront == 1) { if (karaokeCapable >= 0) { float c0 = karaokeTable[karaokeCapable][0]; float c1 = karaokeTable[karaokeCapable][1]; float c2 = karaokeTable[karaokeCapable][2]; ippsMulC_32f_I(c0, samC, 512); ippsAddProductC_32f(karaokeSL, c1, samC, 512); ippsAddProductC_32f(samSR, c2, samC, 512); } else { ippsMulC_32f_I(cmixgain * m3dB * 2, samC, 512); ippsAddProductC_32f(karaokeSL, m3dB * smixgain, samC, 512); ippsAddProductC_32f(samSR, m3dB * smixgain, samC, 512); } ippsAdd_32f_I(samR, samL, 512); ippsAddProductC_32f(samL, m3dB, samC, 512); } else if (outfront == 2) { if (karaokeCapable >= 0) { float c0 = karaokeTable[karaokeCapable][3]; float c1 = karaokeTable[karaokeCapable][4]; float c2 = karaokeTable[karaokeCapable][5]; float c3 = karaokeTable[karaokeCapable][6]; float c4 = karaokeTable[karaokeCapable][7]; float c5 = karaokeTable[karaokeCapable][8]; ippsAddProductC_32f(samC, c0, samL, 512); ippsAddProductC_32f(samC, c1, samR, 512); ippsAddProductC_32f(karaokeSL, c2, samL, 512); ippsAddProductC_32f(karaokeSL, c3, samR, 512); ippsAddProductC_32f(samSR, c4, samL, 512); ippsAddProductC_32f(samSR, c5, samR, 512); } else { ippsAddProductC_32f(samC, cmixgain, samL, 512); ippsAddProductC_32f(samC, cmixgain, samR, 512); if (inrear == 1) { ippsAddProductC_32f(samS, smixgain * m3dB, samL, 512); ippsAddProductC_32f(samS, smixgain * m3dB, samR, 512); } else if (inrear == 2) { ippsAddProductC_32f(samSL, smixgain, samL, 512); ippsAddProductC_32f(samSR, smixgain, samR, 512); } } } else if (outfront == 3) { if (karaokeCapable >= 0) { float c0 = karaokeTable[karaokeCapable][9]; float c1 = karaokeTable[karaokeCapable][10]; float c2 = karaokeTable[karaokeCapable][11]; float c3 = karaokeTable[karaokeCapable][12]; float c4 = karaokeTable[karaokeCapable][13]; float c5 = karaokeTable[karaokeCapable][14]; float c6 = karaokeTable[karaokeCapable][15]; float c7 = karaokeTable[karaokeCapable][16]; float c8 = karaokeTable[karaokeCapable][17]; if (c0 >= 0) { ippsAddProductC_32f(samC, c3, samL, 512); } else ippsAddProductC_32f(samC, c3, samR, 512); if (c1 >= 0) ippsAddProductC_32f(karaokeSL, c4, samL, 512); else ippsAddProductC_32f(karaokeSL, c4, samR, 512); if (c2 >= 0) ippsAddProductC_32f(samSR, c5, samL, 512); else ippsAddProductC_32f(samSR, c5, samR, 512); ippsMulC_32f_I(c6, samC, 512); ippsAddProductC_32f(karaokeSL, c7, samC, 512); ippsAddProductC_32f(samSR, c8, samC, 512); } else { if (inrear == 1) { ippsAddProductC_32f(samS, smixgain, samC, 512); } else if (inrear == 2) { ippsAddProductC_32f(samSL, smixgain, samL, 512); ippsAddProductC_32f(samSR, smixgain, samR, 512); } } } ippsZero_32f(karaokeSL, 512); ippsZero_32f(samSR, 512); } else { if (decoder_settings.out_acmod == ACMOD_0) { // Dolby Surround compatible if (infront != 2) { ippsMulC_32f_I(m3dB, samC, 512); ippsAdd_32f_I(samC, samL, 512); ippsAdd_32f_I(samC, samR, 512); if (infront != 1) downmix = 1; } if (inrear == 1) { ippsMulC_32f_I(m3dB, samS, 512); ippsSub_32f_I(samS, samL, 512); ippsAdd_32f_I(samS, samR, 512); downmix = 1; } else if (inrear == 2) { ippsAdd_32f_I(samSR, samSL, 512); ippsMulC_32f_I(m3dB, samSL, 512); ippsSub_32f_I(samSL, samL, 512); ippsAdd_32f_I(samSL, samR, 512); downmix = 1; } } else if (decoder_settings.out_acmod == ACMOD_10) { /* center only */ if (infront == 3) { ippsMulC_32f_I(2 * cmixgain * m3dB, samC, 512); downmix = 1; } if (infront != 1) { ippsAdd_32f_I(samL, samR, 512); ippsMulC_32f_I(m3dB, samR, 512); ippsAdd_32f_I(samR, samC, 512); downmix = 1; } if (inrear == 1) { ippsMulC_32f_I(smixgain * m3dB, samS, 512); ippsAdd_32f_I(samS, samC, 512); if (smixgain > 0) downmix = 1; } else if (inrear == 2) { ippsMulC_32f_I(smixgain * m3dB, samSL, 512); ippsAdd_32f_I(samSL, samC, 512); ippsMulC_32f_I(smixgain * m3dB, samSR, 512); ippsAdd_32f_I(samSR, samC, 512); if (smixgain > 0) downmix = 1; } } else { /* more than center output requested */ if (outfront == 2) { if (infront == 1) { ippsMulC_32f_I(m3dB, samC, 512); ippsCopy_32f(samC, samL, 512); ippsCopy_32f(samC, samR, 512); } else if (infront == 3) { ippsMulC_32f_I(cmixgain, samC, 512); ippsAdd_32f_I(samC, samL, 512); ippsAdd_32f_I(samC, samR, 512); downmix = 1; } } if (inrear == 1) { /* single surround channel coded */ if (outrear == 0) { /* no surround loudspeakers */ ippsMulC_32f_I(smixgain * m3dB, samS, 512); ippsAdd_32f_I(samS, samL, 512); ippsAdd_32f_I(samS, samR, 512); if (smixgain > 0) downmix = 1; } else if (outrear == 2) { /* two surround loudspeaker channels */ ippsMulC_32f_I(m3dB, samS, 512); ippsCopy_32f(samS, samSL, 512); ippsCopy_32f(samS, samSR, 512); } } else if (inrear == 2) { /* two surround channels encoded */ if (outrear == 0) { ippsMulC_32f_I(smixgain, samSL, 512); ippsAdd_32f_I(samSL, samL, 512); ippsMulC_32f_I(smixgain, samSR, 512); ippsAdd_32f_I(samSR, samR, 512); if (smixgain > 0) downmix = 1; } else if (outrear == 1) { ippsAdd_32f_I(samSR, samSL, 512); ippsMulC_32f_I(m3dB, samSL, 512); ippsCopy_32f(samSL, samS, 512); downmix = 1; } } } } /* write out_channel */ switch (decoder_settings.out_acmod) { case ACMOD_0: data_vectors.temp[0] = samL; data_vectors.temp[1] = samR; if (decoder_settings.outlfeon) data_vectors.temp[2] = samLFE; break; case ACMOD_10: data_vectors.temp[0] = samC; if (decoder_settings.outlfeon) data_vectors.temp[1] = samLFE; break;// --- case ACMOD_20: data_vectors.temp[0] = samL; data_vectors.temp[1] = samR; if (decoder_settings.outlfeon) data_vectors.temp[2] = samLFE; break;// --- case ACMOD_30: data_vectors.temp[0] = samL; data_vectors.temp[1] = samC; data_vectors.temp[2] = samR; if (decoder_settings.outlfeon) data_vectors.temp[3] = samLFE; break; case ACMOD_21: data_vectors.temp[0] = samL; data_vectors.temp[1] = samR; data_vectors.temp[2] = samS; if (decoder_settings.outlfeon) data_vectors.temp[3] = samLFE; break;// --- case ACMOD_31: data_vectors.temp[0] = samL; data_vectors.temp[1] = samC; data_vectors.temp[2] = samR; data_vectors.temp[3] = samS; if (decoder_settings.outlfeon) data_vectors.temp[4] = samLFE; break;// --- case ACMOD_22: data_vectors.temp[0] = samL; data_vectors.temp[1] = samR; data_vectors.temp[2] = samSL; data_vectors.temp[3] = samSR; if (decoder_settings.outlfeon) data_vectors.temp[4] = samLFE; break;// --- case ACMOD_32: data_vectors.temp[0] = samL; data_vectors.temp[1] = samC; data_vectors.temp[2] = samR; data_vectors.temp[3] = samSL; data_vectors.temp[4] = samSR; if (decoder_settings.outlfeon) data_vectors.temp[5] = samLFE; break; default: break; } // switch( out_acmod ) if (bsi.acmod != ACMOD_0) { int i; gain = drc(bsi.compre, bsi.compr, dynrng, downmix, bsi.dialnorm); for (i = 0; i < nChannelOut; i++) { ippsMulC_32f_I(gain, data_vectors.temp[i], 512); } } return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -