imdct.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:28k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /**************************************************************************************
  36.  * Fixed-point MP3 decoder
  37.  * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
  38.  * June 2003
  39.  *
  40.  * imdct.c - antialias, inverse transform (short/long/mixed), windowing, 
  41.  *             overlap-add, frequency inversion
  42.  **************************************************************************************/
  43. #include "coder.h"
  44. #include "assembly.h"
  45. /**************************************************************************************
  46.  * Function:    AntiAlias
  47.  *
  48.  * Description: smooth transition across DCT block boundaries (every 18 coefficients)
  49.  *
  50.  * Inputs:      vector of dequantized coefficients, length = (nBfly+1) * 18
  51.  *              number of "butterflies" to perform (one butterfly means one
  52.  *                inter-block smoothing operation)
  53.  *
  54.  * Outputs:     updated coefficient vector x
  55.  *
  56.  * Return:      none
  57.  *
  58.  * Notes:       weighted average of opposite bands (pairwise) from the 8 samples 
  59.  *                before and after each block boundary
  60.  *              nBlocks = (nonZeroBound + 7) / 18, since nZB is the first ZERO sample 
  61.  *                above which all other samples are also zero
  62.  *              max gain per sample = 1.372
  63.  *                MAX(i) (abs(csa[i][0]) + abs(csa[i][1]))
  64.  *              bits gained = 0
  65.  *              assume at least 1 guard bit in x[] to avoid overflow
  66.  *                (should be guaranteed from dequant, and max gain from stproc * max 
  67.  *                 gain from AntiAlias < 2.0)
  68.  **************************************************************************************/
  69. static void AntiAlias(int *x, int nBfly)
  70. {
  71. int k, a0, b0, c0, c1;
  72. const int *c;
  73. /* csa = Q31 */
  74. for (k = nBfly; k > 0; k--) {
  75. c = csa[0];
  76. x += 18;
  77. a0 = x[-1]; c0 = *c; c++; b0 = x[0]; c1 = *c; c++;
  78. x[-1] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
  79. x[0] =  (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
  80. a0 = x[-2]; c0 = *c; c++; b0 = x[1]; c1 = *c; c++;
  81. x[-2] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
  82. x[1] =  (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
  83. a0 = x[-3]; c0 = *c; c++; b0 = x[2]; c1 = *c; c++;
  84. x[-3] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
  85. x[2] =  (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
  86. a0 = x[-4]; c0 = *c; c++; b0 = x[3]; c1 = *c; c++;
  87. x[-4] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
  88. x[3] =  (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
  89. a0 = x[-5]; c0 = *c; c++; b0 = x[4]; c1 = *c; c++;
  90. x[-5] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
  91. x[4] =  (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
  92. a0 = x[-6]; c0 = *c; c++; b0 = x[5]; c1 = *c; c++;
  93. x[-6] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
  94. x[5] =  (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
  95. a0 = x[-7]; c0 = *c; c++; b0 = x[6]; c1 = *c; c++;
  96. x[-7] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
  97. x[6] =  (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
  98. a0 = x[-8]; c0 = *c; c++; b0 = x[7]; c1 = *c; c++;
  99. x[-8] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
  100. x[7] =  (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
  101. }
  102. }
  103. /**************************************************************************************
  104.  * Function:    WinPrevious
  105.  *
  106.  * Description: apply specified window to second half of previous IMDCT (overlap part)
  107.  *
  108.  * Inputs:      vector of 9 coefficients (xPrev)
  109.  *
  110.  * Outputs:     18 windowed output coefficients (gain 1 integer bit)
  111.  *              window type (0, 1, 2, 3)
  112.  *
  113.  * Return:      none
  114.  * 
  115.  * Notes:       produces 9 output samples from 18 input samples via symmetry
  116.  *              all blocks gain at least 1 guard bit via window (long blocks get extra
  117.  *                sign bit, short blocks can have one addition but max gain < 1.0)
  118.  **************************************************************************************/
  119. static void WinPrevious(int *xPrev, int *xPrevWin, int btPrev)
  120. {
  121. int i, x, *xp, *xpwLo, *xpwHi, wLo, wHi;
  122. const int *wpLo, *wpHi;
  123. xp = xPrev;
  124. /* mapping (see IMDCT12x3): xPrev[0-2] = sum[6-8], xPrev[3-8] = sum[12-17] */
  125. if (btPrev == 2) {
  126. /* this could be reordered for minimum loads/stores */
  127. wpLo = imdctWin[btPrev];
  128. xPrevWin[ 0] = MULSHIFT32(wpLo[ 6], xPrev[2]) + MULSHIFT32(wpLo[0], xPrev[6]);
  129. xPrevWin[ 1] = MULSHIFT32(wpLo[ 7], xPrev[1]) + MULSHIFT32(wpLo[1], xPrev[7]);
  130. xPrevWin[ 2] = MULSHIFT32(wpLo[ 8], xPrev[0]) + MULSHIFT32(wpLo[2], xPrev[8]);
  131. xPrevWin[ 3] = MULSHIFT32(wpLo[ 9], xPrev[0]) + MULSHIFT32(wpLo[3], xPrev[8]);
  132. xPrevWin[ 4] = MULSHIFT32(wpLo[10], xPrev[1]) + MULSHIFT32(wpLo[4], xPrev[7]);
  133. xPrevWin[ 5] = MULSHIFT32(wpLo[11], xPrev[2]) + MULSHIFT32(wpLo[5], xPrev[6]);
  134. xPrevWin[ 6] = MULSHIFT32(wpLo[ 6], xPrev[5]);
  135. xPrevWin[ 7] = MULSHIFT32(wpLo[ 7], xPrev[4]);
  136. xPrevWin[ 8] = MULSHIFT32(wpLo[ 8], xPrev[3]);
  137. xPrevWin[ 9] = MULSHIFT32(wpLo[ 9], xPrev[3]);
  138. xPrevWin[10] = MULSHIFT32(wpLo[10], xPrev[4]);
  139. xPrevWin[11] = MULSHIFT32(wpLo[11], xPrev[5]);
  140. xPrevWin[12] = xPrevWin[13] = xPrevWin[14] = xPrevWin[15] = xPrevWin[16] = xPrevWin[17] = 0;
  141. } else {
  142. /* use ARM-style pointers (*ptr++) so that ADS compiles well */
  143. wpLo = imdctWin[btPrev] + 18;
  144. wpHi = wpLo + 17;
  145. xpwLo = xPrevWin;
  146. xpwHi = xPrevWin + 17;
  147. for (i = 9; i > 0; i--) {
  148. x = *xp++; wLo = *wpLo++; wHi = *wpHi--;
  149. *xpwLo++ = MULSHIFT32(wLo, x);
  150. *xpwHi-- = MULSHIFT32(wHi, x);
  151. }
  152. }
  153. }
  154. /**************************************************************************************
  155.  * Function:    FreqInvertRescale
  156.  *
  157.  * Description: do frequency inversion (odd samples of odd blocks) and rescale 
  158.  *                if necessary (extra guard bits added before IMDCT)
  159.  *
  160.  * Inputs:      output vector y (18 new samples, spaced NBANDS apart)
  161.  *              previous sample vector xPrev (9 samples)
  162.  *              index of current block
  163.  *              number of extra shifts added before IMDCT (usually 0)
  164.  *
  165.  * Outputs:     inverted and rescaled (as necessary) outputs
  166.  *              rescaled (as necessary) previous samples
  167.  *
  168.  * Return:      updated mOut (from new outputs y)
  169.  **************************************************************************************/
  170. static int FreqInvertRescale(int *y, int *xPrev, int blockIdx, int es)
  171. {
  172. int i, d, mOut;
  173. int y0, y1, y2, y3, y4, y5, y6, y7, y8;
  174. if (es == 0) {
  175. /* fast case - frequency invert only (no rescaling) - can fuse into overlap-add for speed, if desired */
  176. if (blockIdx & 0x01) {
  177. y += NBANDS;
  178. y0 = *y; y += 2*NBANDS;
  179. y1 = *y; y += 2*NBANDS;
  180. y2 = *y; y += 2*NBANDS;
  181. y3 = *y; y += 2*NBANDS;
  182. y4 = *y; y += 2*NBANDS;
  183. y5 = *y; y += 2*NBANDS;
  184. y6 = *y; y += 2*NBANDS;
  185. y7 = *y; y += 2*NBANDS;
  186. y8 = *y; y += 2*NBANDS;
  187. y -= 18*NBANDS;
  188. *y = -y0; y += 2*NBANDS;
  189. *y = -y1; y += 2*NBANDS;
  190. *y = -y2; y += 2*NBANDS;
  191. *y = -y3; y += 2*NBANDS;
  192. *y = -y4; y += 2*NBANDS;
  193. *y = -y5; y += 2*NBANDS;
  194. *y = -y6; y += 2*NBANDS;
  195. *y = -y7; y += 2*NBANDS;
  196. *y = -y8; y += 2*NBANDS;
  197. }
  198. return 0;
  199. } else {
  200. /* undo pre-IMDCT scaling, clipping if necessary */
  201. mOut = 0;
  202. if (blockIdx & 0x01) {
  203. /* frequency invert */
  204. for (i = 0; i < 18; i+=2) {
  205. d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS;
  206. d = -*y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS;
  207. d = *xPrev; CLIP_2N(d, 31 - es); *xPrev++ = d << es;
  208. }
  209. } else {
  210. for (i = 0; i < 18; i+=2) {
  211. d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS;
  212. d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS;
  213. d = *xPrev; CLIP_2N(d, 31 - es); *xPrev++ = d << es;
  214. }
  215. }
  216. return mOut;
  217. }
  218. }
  219. /* format = Q31
  220.  * #define M_PI 3.14159265358979323846
  221.  * double u = 2.0 * M_PI / 9.0;
  222.  * float c0 = sqrt(3.0) / 2.0; 
  223.  * float c1 = cos(u);          
  224.  * float c2 = cos(2*u);        
  225.  * float c3 = sin(u);          
  226.  * float c4 = sin(2*u);
  227.  */
  228. static const int c9_0 = 0x6ed9eba1;
  229. static const int c9_1 = 0x620dbe8b;
  230. static const int c9_2 = 0x163a1a7e;
  231. static const int c9_3 = 0x5246dd49;
  232. static const int c9_4 = 0x7e0e2e32;
  233. /* format = Q31
  234.  * cos(((0:8) + 0.5) * (pi/18)) 
  235.  */
  236. static const int c18[9] = {
  237. 0x7f834ed0, 0x7ba3751d, 0x7401e4c1, 0x68d9f964, 0x5a82799a, 0x496af3e2, 0x36185aee, 0x2120fb83, 0x0b27eb5c, 
  238. };
  239. /* require at least 3 guard bits in x[] to ensure no overflow */
  240. static __inline void idct9(int *x)
  241. {
  242. int a1, a2, a3, a4, a5, a6, a7, a8, a9;
  243. int a10, a11, a12, a13, a14, a15, a16, a17, a18;
  244. int a19, a20, a21, a22, a23, a24, a25, a26, a27;
  245. int m1, m3, m5, m6, m7, m8, m9, m10, m11, m12;
  246. int x0, x1, x2, x3, x4, x5, x6, x7, x8;
  247. x0 = x[0]; x1 = x[1]; x2 = x[2]; x3 = x[3]; x4 = x[4];
  248. x5 = x[5]; x6 = x[6]; x7 = x[7]; x8 = x[8];
  249. a1 = x0 - x6;
  250. a2 = x1 - x5;
  251. a3 = x1 + x5;
  252. a4 = x2 - x4;
  253. a5 = x2 + x4;
  254. a6 = x2 + x8;
  255. a7 = x1 + x7;
  256. a8 = a6 - a5; /* ie x[8] - x[4] */
  257. a9 = a3 - a7; /* ie x[5] - x[7] */
  258. a10 = a2 - x7; /* ie x[1] - x[5] - x[7] */
  259. a11 = a4 - x8; /* ie x[2] - x[4] - x[8] */
  260. /* do the << 1 as constant shifts where mX is actually used (free, no stall or extra inst.) */
  261. m1 =  MULSHIFT32(c9_0, x3);
  262. m3 =  MULSHIFT32(c9_0, a10);
  263. m5 =  MULSHIFT32(c9_1, a5);
  264. m6 =  MULSHIFT32(c9_2, a6);
  265. m7 =  MULSHIFT32(c9_1, a8);
  266. m8 =  MULSHIFT32(c9_2, a5);
  267. m9 =  MULSHIFT32(c9_3, a9);
  268. m10 = MULSHIFT32(c9_4, a7);
  269. m11 = MULSHIFT32(c9_3, a3);
  270. m12 = MULSHIFT32(c9_4, a9);
  271. a12 = x[0] +  (x[6] >> 1);
  272. a13 = a12  +  (  m1 << 1);
  273. a14 = a12  -  (  m1 << 1);
  274. a15 = a1   +  ( a11 >> 1);
  275. a16 = ( m5 << 1) + (m6 << 1);
  276. a17 = ( m7 << 1) - (m8 << 1);
  277. a18 = a16 + a17;
  278. a19 = ( m9 << 1) + (m10 << 1);
  279. a20 = (m11 << 1) - (m12 << 1);
  280. a21 = a20 - a19;
  281. a22 = a13 + a16;
  282. a23 = a14 + a16;
  283. a24 = a14 + a17;
  284. a25 = a13 + a17;
  285. a26 = a14 - a18;
  286. a27 = a13 - a18;
  287. x0 = a22 + a19; x[0] = x0;
  288. x1 = a15 + (m3 << 1); x[1] = x1;
  289. x2 = a24 + a20; x[2] = x2;
  290. x3 = a26 - a21; x[3] = x3;
  291. x4 = a1 - a11; x[4] = x4;
  292. x5 = a27 + a21; x[5] = x5;
  293. x6 = a25 - a20; x[6] = x6;
  294. x7 = a15 - (m3 << 1); x[7] = x7;
  295. x8 = a23 - a19; x[8] = x8;
  296. }
  297. /* let c(j) = cos(M_PI/36 * ((j)+0.5)), s(j) = sin(M_PI/36 * ((j)+0.5))
  298.  * then fastWin[2*j+0] = c(j)*(s(j) + c(j)), j = [0, 8]
  299.  *      fastWin[2*j+1] = c(j)*(s(j) - c(j))
  300.  * format = Q30
  301.  */
  302. static const int fastWin36[18] = {
  303. 0x42aace8b, 0xc2e92724, 0x47311c28, 0xc95f619a, 0x4a868feb, 0xd0859d8c,
  304. 0x4c913b51, 0xd8243ea0, 0x4d413ccc, 0xe0000000, 0x4c913b51, 0xe7dbc161,
  305. 0x4a868feb, 0xef7a6275, 0x47311c28, 0xf6a09e67, 0x42aace8b, 0xfd16d8dd,
  306. };
  307. /**************************************************************************************
  308.  * Function:    IMDCT36
  309.  *
  310.  * Description: 36-point modified DCT, with windowing and overlap-add (50% overlap)
  311.  *
  312.  * Inputs:      vector of 18 coefficients (N/2 inputs produces N outputs, by symmetry)
  313.  *              overlap part of last IMDCT (9 samples - see output comments)
  314.  *              window type (0,1,2,3) of current and previous block
  315.  *              current block index (for deciding whether to do frequency inversion)
  316.  *              number of guard bits in input vector
  317.  *
  318.  * Outputs:     18 output samples, after windowing and overlap-add with last frame
  319.  *              second half of (unwindowed) 36-point IMDCT - save for next time
  320.  *                only save 9 xPrev samples, using symmetry (see WinPrevious())
  321.  *
  322.  * Notes:       this is Ken's hyper-fast algorithm, including symmetric sin window
  323.  *                optimization, if applicable
  324.  *              total number of multiplies, general case: 
  325.  *                2*10 (idct9) + 9 (last stage imdct) + 36 (for windowing) = 65
  326.  *              total number of multiplies, btCurr == 0 && btPrev == 0:
  327.  *                2*10 (idct9) + 9 (last stage imdct) + 18 (for windowing) = 47
  328.  *
  329.  *              blockType == 0 is by far the most common case, so it should be
  330.  *                possible to use the fast path most of the time
  331.  *              this is the fastest known algorithm for performing 
  332.  *                long IMDCT + windowing + overlap-add in MP3
  333.  *
  334.  * Return:      mOut (OR of abs(y) for all y calculated here)
  335.  *
  336.  * TODO:        optimize for ARM (reorder window coefs, ARM-style pointers in C, 
  337.  *                inline asm may or may not be helpful)
  338.  **************************************************************************************/
  339. static int IMDCT36(int *xCurr, int *xPrev, int *y, int btCurr, int btPrev, int blockIdx, int gb)
  340. {
  341. int i, es, xBuf[18], xPrevWin[18];
  342. int acc1, acc2, s, d, t, mOut;
  343. int xo, xe, c, *xp, yLo, yHi;
  344. const int *cp, *wp;
  345. acc1 = acc2 = 0;
  346. xCurr += 17;
  347. /* 7 gb is always adequate for antialias + accumulator loop + idct9 */
  348. if (gb < 7) {
  349. /* rarely triggered - 5% to 10% of the time on normal clips (with Q25 input) */
  350. es = 7 - gb;
  351. for (i = 8; i >= 0; i--) {
  352. acc1 = ((*xCurr--) >> es) - acc1;
  353. acc2 = acc1 - acc2;
  354. acc1 = ((*xCurr--) >> es) - acc1;
  355. xBuf[i+9] = acc2; /* odd */
  356. xBuf[i+0] = acc1; /* even */
  357. xPrev[i] >>= es;
  358. }
  359. } else {
  360. es = 0;
  361. /* max gain = 18, assume adequate guard bits */
  362. for (i = 8; i >= 0; i--) {
  363. acc1 = (*xCurr--) - acc1;
  364. acc2 = acc1 - acc2;
  365. acc1 = (*xCurr--) - acc1;
  366. xBuf[i+9] = acc2; /* odd */
  367. xBuf[i+0] = acc1; /* even */
  368. }
  369. }
  370. /* xEven[0] and xOdd[0] scaled by 0.5 */
  371. xBuf[9] >>= 1;
  372. xBuf[0] >>= 1;
  373. /* do 9-point IDCT on even and odd */
  374. idct9(xBuf+0); /* even */
  375. idct9(xBuf+9); /* odd */
  376. xp = xBuf + 8;
  377. cp = c18 + 8;
  378. mOut = 0;
  379. if (btPrev == 0 && btCurr == 0) {
  380. /* fast path - use symmetry of sin window to reduce windowing multiplies to 18 (N/2) */
  381. wp = fastWin36;
  382. for (i = 0; i < 9; i++) {
  383. /* do ARM-style pointer arithmetic (i still needed for y[] indexing - compiler spills if 2 y pointers) */
  384. c = *cp--; xo = *(xp + 9); xe = *xp--;
  385. /* gain 2 int bits here */
  386. xo = MULSHIFT32(c, xo); /* 2*c18*xOdd (mul by 2 implicit in scaling)  */
  387. xe >>= 2;
  388. s = -(*xPrev); /* sum from last block (always at least 2 guard bits) */
  389. d = -(xe - xo); /* gain 2 int bits, don't shift xo (effective << 1 to eat sign bit, << 1 for mul by 2) */
  390. (*xPrev++) = xe + xo; /* symmetry - xPrev[i] = xPrev[17-i] for long blocks */
  391. t = s - d;
  392. yLo = (d + (MULSHIFT32(t, *wp++) << 2));
  393. yHi = (s + (MULSHIFT32(t, *wp++) << 2));
  394. y[(i)*NBANDS]    =  yLo;
  395. y[(17-i)*NBANDS] =  yHi;
  396. mOut |= FASTABS(yLo);
  397. mOut |= FASTABS(yHi);
  398. }
  399. } else {
  400. /* slower method - either prev or curr is using window type != 0 so do full 36-point window 
  401.  * output xPrevWin has at least 3 guard bits (xPrev has 2, gain 1 in WinPrevious)
  402.  */
  403. WinPrevious(xPrev, xPrevWin, btPrev);
  404. wp = imdctWin[btCurr];
  405. for (i = 0; i < 9; i++) {
  406. c = *cp--; xo = *(xp + 9); xe = *xp--;
  407. /* gain 2 int bits here */
  408. xo = MULSHIFT32(c, xo); /* 2*c18*xOdd (mul by 2 implicit in scaling)  */
  409. xe >>= 2;
  410. d = xe - xo;
  411. (*xPrev++) = xe + xo; /* symmetry - xPrev[i] = xPrev[17-i] for long blocks */
  412. yLo = (xPrevWin[i]    + MULSHIFT32(d, wp[i])) << 2;
  413. yHi = (xPrevWin[17-i] + MULSHIFT32(d, wp[17-i])) << 2;
  414. y[(i)*NBANDS]    = yLo;
  415. y[(17-i)*NBANDS] = yHi;
  416. mOut |= FASTABS(yLo);
  417. mOut |= FASTABS(yHi);
  418. }
  419. }
  420. xPrev -= 9;
  421. mOut |= FreqInvertRescale(y, xPrev, blockIdx, es);
  422. return mOut;
  423. }
  424. static const int c3_0 = 0x6ed9eba1; /* format = Q31, cos(pi/6) */
  425. static const int c6[3] = { 0x7ba3751d, 0x5a82799a, 0x2120fb83 }; /* format = Q31, cos(((0:2) + 0.5) * (pi/6)) */
  426. /* 12-point inverse DCT, used in IMDCT12x3() 
  427.  * 4 input guard bits will ensure no overflow
  428.  */
  429. static __inline void imdct12 (int *x, int *out)
  430. {
  431. int a0, a1, a2;
  432. int x0, x1, x2, x3, x4, x5;
  433. x0 = *x; x+=3; x1 = *x; x+=3;
  434. x2 = *x; x+=3; x3 = *x; x+=3;
  435. x4 = *x; x+=3; x5 = *x; x+=3;
  436. x4 -= x5;
  437. x3 -= x4;
  438. x2 -= x3;
  439. x3 -= x5;
  440. x1 -= x2;
  441. x0 -= x1;
  442. x1 -= x3;
  443. x0 >>= 1;
  444. x1 >>= 1;
  445. a0 = MULSHIFT32(c3_0, x2) << 1;
  446. a1 = x0 + (x4 >> 1);
  447. a2 = x0 - x4;
  448. x0 = a1 + a0;
  449. x2 = a2;
  450. x4 = a1 - a0;
  451. a0 = MULSHIFT32(c3_0, x3) << 1;
  452. a1 = x1 + (x5 >> 1);
  453. a2 = x1 - x5;
  454. /* cos window odd samples, mul by 2, eat sign bit */
  455. x1 = MULSHIFT32(c6[0], a1 + a0) << 2;
  456. x3 = MULSHIFT32(c6[1], a2) << 2;
  457. x5 = MULSHIFT32(c6[2], a1 - a0) << 2;
  458. *out = x0 + x1; out++;
  459. *out = x2 + x3; out++;
  460. *out = x4 + x5; out++;
  461. *out = x4 - x5; out++;
  462. *out = x2 - x3; out++;
  463. *out = x0 - x1;
  464. }
  465. /**************************************************************************************
  466.  * Function:    IMDCT12x3
  467.  *
  468.  * Description: three 12-point modified DCT's for short blocks, with windowing,
  469.  *                short block concatenation, and overlap-add
  470.  *
  471.  * Inputs:      3 interleaved vectors of 6 samples each 
  472.  *                (block0[0], block1[0], block2[0], block0[1], block1[1]....)
  473.  *              overlap part of last IMDCT (9 samples - see output comments)
  474.  *              window type (0,1,2,3) of previous block
  475.  *              current block index (for deciding whether to do frequency inversion)
  476.  *              number of guard bits in input vector
  477.  *
  478.  * Outputs:     updated sample vector x, net gain of 1 integer bit
  479.  *              second half of (unwindowed) IMDCT's - save for next time
  480.  *                only save 9 xPrev samples, using symmetry (see WinPrevious())
  481.  *
  482.  * Return:      mOut (OR of abs(y) for all y calculated here)
  483.  *
  484.  * TODO:        optimize for ARM
  485.  **************************************************************************************/
  486. static int IMDCT12x3(int *xCurr, int *xPrev, int *y, int btPrev, int blockIdx, int gb)
  487. {
  488. int i, es, mOut, yLo, xBuf[18], xPrevWin[18]; /* need temp buffer for reordering short blocks */
  489. const int *wp;
  490. es = 0;
  491. /* 7 gb is always adequate for accumulator loop + idct12 + window + overlap */
  492. if (gb < 7) {
  493. es = 7 - gb;
  494. for (i = 0; i < 18; i+=2) {
  495. xCurr[i+0] >>= es;
  496. xCurr[i+1] >>= es;
  497. *xPrev++ >>= es;
  498. }
  499. xPrev -= 9;
  500. }
  501. /* requires 4 input guard bits for each imdct12 */
  502. imdct12(xCurr + 0, xBuf + 0);
  503. imdct12(xCurr + 1, xBuf + 6);
  504. imdct12(xCurr + 2, xBuf + 12);
  505. /* window previous from last time */
  506. WinPrevious(xPrev, xPrevWin, btPrev);
  507. /* could unroll this for speed, minimum loads (short blocks usually rare, so doesn't make much overall difference) 
  508.  * xPrevWin[i] << 2 still has 1 gb always, max gain of windowed xBuf stuff also < 1.0 and gain the sign bit
  509.  * so y calculations won't overflow
  510.  */
  511. wp = imdctWin[2];
  512. mOut = 0;
  513. for (i = 0; i < 3; i++) {
  514. yLo = (xPrevWin[ 0+i] << 2);
  515. mOut |= FASTABS(yLo); y[( 0+i)*NBANDS] = yLo;
  516. yLo = (xPrevWin[ 3+i] << 2);
  517. mOut |= FASTABS(yLo); y[( 3+i)*NBANDS] = yLo;
  518. yLo = (xPrevWin[ 6+i] << 2) + (MULSHIFT32(wp[0+i], xBuf[3+i]));
  519. mOut |= FASTABS(yLo); y[( 6+i)*NBANDS] = yLo;
  520. yLo = (xPrevWin[ 9+i] << 2) + (MULSHIFT32(wp[3+i], xBuf[5-i]));
  521. mOut |= FASTABS(yLo); y[( 9+i)*NBANDS] = yLo;
  522. yLo = (xPrevWin[12+i] << 2) + (MULSHIFT32(wp[6+i], xBuf[2-i]) + MULSHIFT32(wp[0+i], xBuf[(6+3)+i]));
  523. mOut |= FASTABS(yLo); y[(12+i)*NBANDS] = yLo;
  524. yLo = (xPrevWin[15+i] << 2) + (MULSHIFT32(wp[9+i], xBuf[0+i]) + MULSHIFT32(wp[3+i], xBuf[(6+5)-i]));
  525. mOut |= FASTABS(yLo); y[(15+i)*NBANDS] = yLo;
  526. }
  527. /* save previous (unwindowed) for overlap - only need samples 6-8, 12-17 */
  528. for (i = 6; i < 9; i++)
  529. *xPrev++ = xBuf[i] >> 2;
  530. for (i = 12; i < 18; i++)
  531. *xPrev++ = xBuf[i] >> 2;
  532. xPrev -= 9;
  533. mOut |= FreqInvertRescale(y, xPrev, blockIdx, es);
  534. return mOut;
  535. }
  536. /**************************************************************************************
  537.  * Function:    HybridTransform
  538.  *
  539.  * Description: IMDCT's, windowing, and overlap-add on long/short/mixed blocks
  540.  *
  541.  * Inputs:      vector of input coefficients, length = nBlocksTotal * 18)
  542.  *              vector of overlap samples from last time, length = nBlocksPrev * 9)
  543.  *              buffer for output samples, length = MAXNSAMP
  544.  *              SideInfoSub struct for this granule/channel
  545.  *              BlockCount struct with necessary info
  546.  *                number of non-zero input and overlap blocks
  547.  *                number of long blocks in input vector (rest assumed to be short blocks)
  548.  *                number of blocks which use long window (type) 0 in case of mixed block
  549.  *                  (bc->currWinSwitch, 0 for non-mixed blocks)
  550.  *
  551.  * Outputs:     transformed, windowed, and overlapped sample buffer
  552.  *              does frequency inversion on odd blocks
  553.  *              updated buffer of samples for overlap
  554.  *
  555.  * Return:      number of non-zero IMDCT blocks calculated in this call
  556.  *                (including overlap-add)
  557.  *
  558.  * TODO:        examine mixedBlock/winSwitch logic carefully (test he_mode.bit)
  559.  **************************************************************************************/
  560. static int HybridTransform(int *xCurr, int *xPrev, int y[BLOCK_SIZE][NBANDS], SideInfoSub *sis, BlockCount *bc)
  561. {
  562. int xPrevWin[18], currWinIdx, prevWinIdx;
  563. int i, j, nBlocksOut, nonZero, mOut;
  564. int fiBit, xp;
  565. ASSERT(bc->nBlocksLong  <= NBANDS);
  566. ASSERT(bc->nBlocksTotal <= NBANDS);
  567. ASSERT(bc->nBlocksPrev  <= NBANDS);
  568. mOut = 0;
  569. /* do long blocks, if any */
  570. for(i = 0; i < bc->nBlocksLong; i++) {
  571. /* currWinIdx picks the right window for long blocks (if mixed, long blocks use window type 0) */
  572. currWinIdx = sis->blockType;
  573. if (sis->mixedBlock && i < bc->currWinSwitch) 
  574. currWinIdx = 0;
  575. prevWinIdx = bc->prevType;
  576. if (i < bc->prevWinSwitch)
  577.  prevWinIdx = 0;
  578. /* do 36-point IMDCT, including windowing and overlap-add */
  579. mOut |= IMDCT36(xCurr, xPrev, &(y[0][i]), currWinIdx, prevWinIdx, i, bc->gbIn);
  580. xCurr += 18;
  581. xPrev += 9;
  582. }
  583. /* do short blocks (if any) */
  584. for (   ; i < bc->nBlocksTotal; i++) {
  585. ASSERT(sis->blockType == 2);
  586. prevWinIdx = bc->prevType;
  587. if (i < bc->prevWinSwitch)
  588.  prevWinIdx = 0;
  589. mOut |= IMDCT12x3(xCurr, xPrev, &(y[0][i]), prevWinIdx, i, bc->gbIn);
  590. xCurr += 18;
  591. xPrev += 9;
  592. }
  593. nBlocksOut = i;
  594. /* window and overlap prev if prev longer that current */
  595. for (   ; i < bc->nBlocksPrev; i++) {
  596. prevWinIdx = bc->prevType;
  597. if (i < bc->prevWinSwitch)
  598.  prevWinIdx = 0;
  599. WinPrevious(xPrev, xPrevWin, prevWinIdx);
  600. nonZero = 0;
  601. fiBit = i << 31;
  602. for (j = 0; j < 9; j++) {
  603. xp = xPrevWin[2*j+0] << 2; /* << 2 temp for scaling */
  604. nonZero |= xp;
  605. y[2*j+0][i] = xp;
  606. mOut |= FASTABS(xp);
  607. /* frequency inversion on odd blocks/odd samples (flip sign if i odd, j odd) */
  608. xp = xPrevWin[2*j+1] << 2;
  609. xp = (xp ^ (fiBit >> 31)) + (i & 0x01);
  610. nonZero |= xp;
  611. y[2*j+1][i] = xp;
  612. mOut |= FASTABS(xp);
  613. xPrev[j] = 0;
  614. }
  615. xPrev += 9;
  616. if (nonZero)
  617. nBlocksOut = i;
  618. }
  619. /* clear rest of blocks */
  620. for (   ; i < 32; i++) {
  621. for (j = 0; j < 18; j++) 
  622. y[j][i] = 0;
  623. }
  624. bc->gbOut = CLZ(mOut) - 1;
  625. return nBlocksOut;
  626. }
  627. /**************************************************************************************
  628.  * Function:    IMDCT
  629.  *
  630.  * Description: do alias reduction, inverse MDCT, overlap-add, and frequency inversion
  631.  *
  632.  * Inputs:      MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(),
  633.  *                UnpackScaleFactors(), and DecodeHuffman() (for this granule, channel)
  634.  *                includes PCM samples in overBuf (from last call to IMDCT) for OLA
  635.  *              index of current granule and channel
  636.  *
  637.  * Outputs:     PCM samples in outBuf, for input to subband transform
  638.  *              PCM samples in overBuf, for OLA next time
  639.  *              updated hi->nonZeroBound index for this channel
  640.  *
  641.  * Return:      0 on success,  -1 if null input pointers
  642.  **************************************************************************************/
  643. int IMDCT(MP3DecInfo *mp3DecInfo, int gr, int ch)
  644. {
  645. int nBfly, blockCutoff;
  646. FrameHeader *fh;
  647. SideInfo *si;
  648. HuffmanInfo *hi;
  649. IMDCTInfo *mi;
  650. BlockCount bc;
  651. /* validate pointers */
  652. if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || 
  653. !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->IMDCTInfoPS)
  654. return -1;
  655. /* si is an array of up to 4 structs, stored as gr0ch0, gr0ch1, gr1ch0, gr1ch1 */
  656. fh = (FrameHeader *)(mp3DecInfo->FrameHeaderPS);
  657. si = (SideInfo *)(mp3DecInfo->SideInfoPS);
  658. hi = (HuffmanInfo*)(mp3DecInfo->HuffmanInfoPS);
  659. mi = (IMDCTInfo *)(mp3DecInfo->IMDCTInfoPS);
  660. /* anti-aliasing done on whole long blocks only
  661.  * for mixed blocks, nBfly always 1, except 3 for 8 kHz MPEG 2.5 (see sfBandTab) 
  662.      *   nLongBlocks = number of blocks with (possibly) non-zero power 
  663.  *   nBfly = number of butterflies to do (nLongBlocks - 1, unless no long blocks)
  664.  */
  665. blockCutoff = fh->sfBand->l[(fh->ver == MPEG1 ? 8 : 6)] / 18; /* same as 3* num short sfb's in spec */
  666. if (si->sis[gr][ch].blockType != 2) {
  667. /* all long transforms */
  668. bc.nBlocksLong = MIN((hi->nonZeroBound[ch] + 7) / 18 + 1, 32);
  669. nBfly = bc.nBlocksLong - 1;
  670. } else if (si->sis[gr][ch].blockType == 2 && si->sis[gr][ch].mixedBlock) {
  671. /* mixed block - long transforms until cutoff, then short transforms */
  672. bc.nBlocksLong = blockCutoff;
  673. nBfly = bc.nBlocksLong - 1;
  674. } else {
  675. /* all short transforms */
  676. bc.nBlocksLong = 0;
  677. nBfly = 0;
  678. }
  679.  
  680. AntiAlias(hi->huffDecBuf[ch], nBfly);
  681. hi->nonZeroBound[ch] = MAX(hi->nonZeroBound[ch], (nBfly * 18) + 8);
  682. ASSERT(hi->nonZeroBound[ch] <= MAX_NSAMP);
  683. /* for readability, use a struct instead of passing a million parameters to HybridTransform() */
  684. bc.nBlocksTotal = (hi->nonZeroBound[ch] + 17) / 18;
  685. bc.nBlocksPrev = mi->numPrevIMDCT[ch];
  686. bc.prevType = mi->prevType[ch];
  687. bc.prevWinSwitch = mi->prevWinSwitch[ch];
  688. bc.currWinSwitch = (si->sis[gr][ch].mixedBlock ? blockCutoff : 0); /* where WINDOW switches (not nec. transform) */
  689. bc.gbIn = hi->gb[ch];
  690. mi->numPrevIMDCT[ch] = HybridTransform(hi->huffDecBuf[ch], mi->overBuf[ch], mi->outBuf[ch], &si->sis[gr][ch], &bc);
  691. mi->prevType[ch] = si->sis[gr][ch].blockType;
  692. mi->prevWinSwitch[ch] = bc.currWinSwitch; /* 0 means not a mixed block (either all short or all long) */
  693. mi->gb[ch] = bc.gbOut;
  694. ASSERT(mi->numPrevIMDCT[ch] <= NBANDS);
  695. /* output has gained 2 int bits */
  696. return 0;
  697. }