📄 mp3enc_layer3_int.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_mp3_enc_int.h"namespace UMC {/* Coefficient Wi * (2/3)^2 * sqrt(2) in Q31 */static const Ipp32s pIMWin[4][36] ={ { 58876489, 176181383, 292145429, 405886073, 516537678, 623258120, 725235191, 821692784, 911896799, 995160729, 1070850885, 1138391219, 1197267708, 1247032268, 1287306158, 1317782872, 1338230462, 1348493310, 1348493310, 1338230462, 1317782872, 1287306158, 1247032268, 1197267708, 1138391219, 1070850885, 995160729, 911896799, 821692784, 725235191, 623258120, 516537678, 405886073, 292145429, 176181383, 58876489 }, { 58876489, 176181383, 292145429, 405886073, 516537678, 623258120, 725235191, 821692784, 911896799, 995160729, 1070850885, 1138391219, 1197267708, 1247032268, 1287306158, 1317782872, 1338230462, 1348493310, 1349778000, 1349778000, 1349778000, 1349778000, 1349778000, 1349778000, 1338230462, 1247032268, 1070850885, 821692784, 516537678, 176181383, 0,0,0,0,0,0 }, { 176181383, 516537678, 821692784, 1070850885, 1247032268, 1338230462, 1338230462, 1247032268, 1070850885, 821692784, 516537678, 176181383, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0, 176181383,516537678,821692784,1070850885,1247032268,1338230462, 1349778000,1349778000,1349778000,1349778000,1349778000,1349778000, 1348493310,1338230462,1317782872,1287306158,1247032268,1197267708, 1138391219,1070850885,995160729,911896799,821692784,725235191,623258120, 516537678,405886073,292145429,176181383,58876489 }};/*// cos(17*pi/72) cos(15*pi/72) cos(13*pi/72) cos(11*pi/72)// cos( 9*pi/72) cos( 7*pi/72) cos( 5*pi/72) cos( 3*pi/72)// cos( pi/72)// in Q31*/static const Ipp32s _d72cos[9] ={ 1583291025, 1703713325, 1811169339, 1904841260, 1984016189, 2048091557, 2096579711, 2129111628, 2145439719};/*// sin(17*pi/72) sin(15*pi/72) sin(13*pi/72) sin(11*pi/72)// sin( 9*pi/72) sin( 7*pi/72) sin( 5*pi/72) sin( 3*pi/72)// sin( pi/72)// in Q31*/static const Ipp32s _d72sin[9] ={ 1450818924, 1307305214, 1153842123, 991597596, 821806413, 645760787, 464800532, 280302863, 93671921};/* coefficient in Q31 */static const Ipp32s _dt[8] ={ 1859775393, 1073741824, -2017974537, 372906622, 1645067915, 734482665, 2114858546, 1380375881};/*// cos(pi/24) cos(3*pi/24) cos(5*pi/24)// sin(pi/24) sin(3*pi/24) sin(5*pi/24)// in Q31*/static const Ipp32s _dcoef12[6] ={ 2129111628, 1984016189, 1703713325, 280302863, 821806413, 1307305214};/*/////////////////////////////////////////////////////////////////////////////// Name: ownsMDCT_36_32s// Description: Performs 36 points windowing and Forward MDCT for long block.// Input Arguments : pSrc - pointer to the input buffer which is the// output of windowing.// blockType - indication of the window type:// - 0: normal window; 1: start block;// - 2: short block; 3: stop block.// Output Arguments: pDst - pointer to the output buffer of Forward MDCT// for long block.******************************************************************************/static void ownsMDCT_36_32s( Ipp32s* pSrc, Ipp32s* pDst, int blockType){ int n; Ipp32s y[18], x[18], xa[9], a[27], m[11]; { Ipp32s data[36], data2[36]; /* phase 1 */ for( n = 0; n < 36; n += 4 ) { data[n+0] = _IPPS_MUL32_MP3_32S(pSrc[n+0], pIMWin[blockType][n+0]); data[n+1] = _IPPS_MUL32_MP3_32S(pSrc[n+1], pIMWin[blockType][n+1]); data[n+2] = _IPPS_MUL32_MP3_32S(pSrc[n+2], pIMWin[blockType][n+2]); data[n+3] = _IPPS_MUL32_MP3_32S(pSrc[n+3], pIMWin[blockType][n+3]); } /* phase 2 */ for( n = 0; n < 18; n += 2 ) { data2[n] = data[n] + data[35-n]; data2[35-n] = data[n] - data[35-n]; data2[n+1] = data[n+1] + data[34-n]; data2[34-n] = data[n+1] - data[34-n]; } /* phase 3 */ for( n = 0; n < 9; n++ ) { y[n] = data2[27+n] - data2[9+n]; y[9+n] = data2[n] - data2[18+n]; } /* phase 4 */ for( n = 0; n < 9; n++ ) { x[n] = (Ipp32s)(((Ipp64s)y[n] * _d72cos[n] - (Ipp64s)y[17-n] * _d72sin[n]) >> 31); x[9+n] = (Ipp32s)(((Ipp64s)y[9+n] * _d72cos[8-n] + (Ipp64s)y[8-n] * _d72sin[8-n])>>31); } } /* phase 5: 9 points DCT-II & DST-II */ /* Reverse Order of Input of DCT-II */ for( n = 0; n < 9; n++ ) { xa[n] = x[8-n]; } /* 9 points DCT-II */ a[1] = xa[3] + xa[5]; a[2] = xa[3] - xa[5]; a[3] = xa[6] + xa[2]; a[4] = xa[6] - xa[2]; a[5] = xa[1] + xa[7]; a[6] = xa[1] - xa[7]; a[7] = xa[8] + xa[0]; a[8] = xa[8] - xa[0]; a[9] = xa[4] + a[5]; a[10] = a[1] + a[3]; a[11] = a[10] + a[7]; a[12] = a[3] - a[7]; a[13] = a[1] - a[7]; a[14] = a[1] - a[3]; a[15] = a[2] - a[4]; a[16] = a[15] + a[8]; a[17] = a[4] + a[8]; a[18] = a[2] - a[8]; a[19] = a[2] + a[4]; m[1] = (Ipp32s)(((Ipp64s) - _dt[0] * a[6])>>31); m[2] = (Ipp32s)(((Ipp64s) _dt[1] * a[5])>>31); m[3] = (Ipp32s)(((Ipp64s) _dt[1] * a[11])>>31); m[4] = (Ipp32s)(((Ipp64s) - _dt[2] * a[12])>>31); m[5] = (Ipp32s)(((Ipp64s) - _dt[3] * a[13])>>31); m[6] = (Ipp32s)(((Ipp64s) - _dt[4] * a[14])>>31); m[7] = (Ipp32s)(((Ipp64s) - _dt[0] * a[16])>>31); m[8] = (Ipp32s)(((Ipp64s) - _dt[5] * a[17])>>31); m[9] = (Ipp32s)(((Ipp64s) - _dt[6] * a[18])>>31); m[10] = (Ipp32s)(((Ipp64s) - _dt[7] * a[19])>>31); a[20] = xa[4] - m[2]; a[21] = a[20] + m[4]; a[22] = a[20] - m[4]; a[23] = a[20] + m[5]; a[24] = m[1] + m[8]; a[25] = m[1] - m[8]; a[26] = m[1] + m[9]; y[0] = a[9] + a[11]; y[1] = m[10] - a[26]; y[2] = m[6] - a[21]; y[3] = m[7]; y[4] = a[22] - m[5]; y[5] = a[25] - m[9]; y[6] = m[3] - a[9]; y[7] = a[24] + m[10]; y[8] = a[23] + m[6]; /* Keep Order of Input of DST-II */ for( n = 0; n < 9; n++ ) { xa[n] = x[9+n]; } xa[1] = -xa[1]; xa[3] = -xa[3]; xa[5] = -xa[5]; xa[7] = -xa[7]; /* 9 points DCT-II */ a[1] = xa[3] + xa[5]; a[2] = xa[3] - xa[5]; a[3] = xa[6] + xa[2]; a[4] = xa[6] - xa[2]; a[5] = xa[1] + xa[7]; a[6] = xa[1] - xa[7]; a[7] = xa[8] + xa[0]; a[8] = xa[8] - xa[0]; a[9] = xa[4] + a[5]; a[10] = a[1] + a[3]; a[11] = a[10] + a[7]; a[12] = a[3] - a[7]; a[13] = a[1] - a[7]; a[14] = a[1] - a[3]; a[15] = a[2] - a[4]; a[16] = a[15] + a[8]; a[17] = a[4] + a[8]; a[18] = a[2] - a[8]; a[19] = a[2] + a[4]; m[1] = (Ipp32s)(((Ipp64s)-_dt[0] * a[6])>>31); m[2] = (Ipp32s)(((Ipp64s)_dt[1] * a[5])>>31); m[3] = (Ipp32s)(((Ipp64s)_dt[1] * a[11])>>31); m[4] = (Ipp32s)(((Ipp64s)-_dt[2] * a[12])>>31); m[5] = (Ipp32s)(((Ipp64s)-_dt[3] * a[13])>>31); m[6] = (Ipp32s)(((Ipp64s)-_dt[4] * a[14])>>31); m[7] = (Ipp32s)(((Ipp64s)-_dt[0] * a[16])>>31); m[8] = (Ipp32s)(((Ipp64s)-_dt[5] * a[17])>>31); m[9] = (Ipp32s)(((Ipp64s)-_dt[6] * a[18])>>31); m[10] = (Ipp32s)(((Ipp64s)-_dt[7] * a[19])>>31); a[20] = xa[4] - m[2]; a[21] = a[20] + m[4]; a[22] = a[20] - m[4]; a[23] = a[20] + m[5]; a[24] = m[1] + m[8]; a[25] = m[1] - m[8]; a[26] = m[1] + m[9]; /* Reverse output order of DST-II */ y[9] = a[9] + a[11]; y[10] = m[10] - a[26]; y[11] = m[6] - a[21]; y[12] = m[7]; y[13] = a[22] - m[5]; y[14] = a[25] - m[9]; y[15] = m[3] - a[9]; y[16] = a[24] + m[10]; y[17] = a[23] + m[6]; /* phase 6: output */ pDst[0] = y[0]; pDst[1] = -y[1] - y[17]; pDst[2] = -y[1] + y[17]; pDst[3] = y[2] + y[16]; pDst[4] = y[2] - y[16]; pDst[5] = -y[3] - y[15]; pDst[6] = -y[3] + y[15]; pDst[7] = y[4] + y[14]; pDst[8] = y[4] - y[14]; pDst[9] = -y[5] - y[13]; pDst[10] = -y[5] + y[13]; pDst[11] = y[6] + y[12]; pDst[12] = y[6] - y[12]; pDst[13] = -y[7] - y[11]; pDst[14] = -y[7] + y[11]; pDst[15] = y[8] + y[10]; pDst[16] = y[8] - y[10];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -