73static void AntiAlias(
int *
x,
int nBfly)
75 int k, a0, b0, c0, c1;
79 for (k = nBfly; k > 0; k--) {
83 a0 =
x[-1]; c0 = *c; c++; b0 =
x[0]; c1 = *c; c++;
84 x[-1] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
85 x[0] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
87 a0 =
x[-2]; c0 = *c; c++; b0 =
x[1]; c1 = *c; c++;
88 x[-2] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
89 x[1] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
91 a0 =
x[-3]; c0 = *c; c++; b0 =
x[2]; c1 = *c; c++;
92 x[-3] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
93 x[2] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
95 a0 =
x[-4]; c0 = *c; c++; b0 =
x[3]; c1 = *c; c++;
96 x[-4] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
97 x[3] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
99 a0 =
x[-5]; c0 = *c; c++; b0 =
x[4]; c1 = *c; c++;
100 x[-5] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
101 x[4] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
103 a0 =
x[-6]; c0 = *c; c++; b0 =
x[5]; c1 = *c; c++;
104 x[-6] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
105 x[5] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
107 a0 =
x[-7]; c0 = *c; c++; b0 =
x[6]; c1 = *c; c++;
108 x[-7] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
109 x[6] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
111 a0 =
x[-8]; c0 = *c; c++; b0 =
x[7]; c1 = *c; c++;
112 x[-8] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1;
113 x[7] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1;
133static void WinPrevious(
int *xPrev,
int *xPrevWin,
int btPrev)
135 int i,
x, *xp, *xpwLo, *xpwHi, wLo, wHi;
136 const int *wpLo, *wpHi;
143 xPrevWin[ 0] = MULSHIFT32(wpLo[ 6], xPrev[2]) + MULSHIFT32(wpLo[0], xPrev[6]);
144 xPrevWin[ 1] = MULSHIFT32(wpLo[ 7], xPrev[1]) + MULSHIFT32(wpLo[1], xPrev[7]);
145 xPrevWin[ 2] = MULSHIFT32(wpLo[ 8], xPrev[0]) + MULSHIFT32(wpLo[2], xPrev[8]);
146 xPrevWin[ 3] = MULSHIFT32(wpLo[ 9], xPrev[0]) + MULSHIFT32(wpLo[3], xPrev[8]);
147 xPrevWin[ 4] = MULSHIFT32(wpLo[10], xPrev[1]) + MULSHIFT32(wpLo[4], xPrev[7]);
148 xPrevWin[ 5] = MULSHIFT32(wpLo[11], xPrev[2]) + MULSHIFT32(wpLo[5], xPrev[6]);
149 xPrevWin[ 6] = MULSHIFT32(wpLo[ 6], xPrev[5]);
150 xPrevWin[ 7] = MULSHIFT32(wpLo[ 7], xPrev[4]);
151 xPrevWin[ 8] = MULSHIFT32(wpLo[ 8], xPrev[3]);
152 xPrevWin[ 9] = MULSHIFT32(wpLo[ 9], xPrev[3]);
153 xPrevWin[10] = MULSHIFT32(wpLo[10], xPrev[4]);
154 xPrevWin[11] = MULSHIFT32(wpLo[11], xPrev[5]);
155 xPrevWin[12] = xPrevWin[13] = xPrevWin[14] = xPrevWin[15] = xPrevWin[16] = xPrevWin[17] = 0;
161 xpwHi = xPrevWin + 17;
162 for (i = 9; i > 0; i--) {
163 x = *xp++; wLo = *wpLo++; wHi = *wpHi--;
164 *xpwLo++ = MULSHIFT32(wLo,
x);
165 *xpwHi-- = MULSHIFT32(wHi,
x);
186static int FreqInvertRescale(
int *
y,
int *xPrev,
int blockIdx,
int es)
189 int y0, y1, y2, y3, y4, y5, y6, y7, y8;
193 if (blockIdx & 0x01) {
220 if (blockIdx & 0x01) {
222 for (i = 0; i < 18; i+=2) {
225 d = *xPrev;
CLIP_2N(d, 31 - es); *xPrev++ = d << es;
228 for (i = 0; i < 18; i+=2) {
231 d = *xPrev;
CLIP_2N(d, 31 - es); *xPrev++ = d << es;
248static const int c9_0 = 0x6ed9eba1;
249static const int c9_1 = 0x620dbe8b;
250static const int c9_2 = 0x163a1a7e;
251static const int c9_3 = 0x5246dd49;
252static const int c9_4 = 0x7e0e2e32;
257static const int c18[9] = {
258 0x7f834ed0, 0x7ba3751d, 0x7401e4c1, 0x68d9f964, 0x5a82799a, 0x496af3e2, 0x36185aee, 0x2120fb83, 0x0b27eb5c,
262static __inline
void idct9(
int *
x)
264 int a1, a2, a3, a4, a5, a6, a7, a8, a9;
265 int a10, a11, a12, a13, a14, a15, a16, a17, a18;
266 int a19, a20, a21, a22, a23, a24, a25, a26, a27;
267 int m1, m3, m5, m6, m7, m8, m9, m10, m11, m12;
268 int x0, x1, x2, x3, x4, x5, x6, x7, x8;
270 x0 =
x[0]; x1 =
x[1]; x2 =
x[2]; x3 =
x[3]; x4 =
x[4];
271 x5 =
x[5]; x6 =
x[6]; x7 =
x[7]; x8 =
x[8];
287 m1 = MULSHIFT32(c9_0, x3);
288 m3 = MULSHIFT32(c9_0, a10);
289 m5 = MULSHIFT32(c9_1, a5);
290 m6 = MULSHIFT32(c9_2, a6);
291 m7 = MULSHIFT32(c9_1, a8);
292 m8 = MULSHIFT32(c9_2, a5);
293 m9 = MULSHIFT32(c9_3, a9);
294 m10 = MULSHIFT32(c9_4, a7);
295 m11 = MULSHIFT32(c9_3, a3);
296 m12 = MULSHIFT32(c9_4, a9);
298 a12 =
x[0] + (
x[6] >> 1);
299 a13 = a12 + ( m1 << 1);
300 a14 = a12 - ( m1 << 1);
301 a15 = a1 + ( a11 >> 1);
302 a16 = ( m5 << 1) + (m6 << 1);
303 a17 = ( m7 << 1) - (m8 << 1);
305 a19 = ( m9 << 1) + (m10 << 1);
306 a20 = (m11 << 1) - (m12 << 1);
316 x0 = a22 + a19;
x[0] = x0;
317 x1 = a15 + (m3 << 1);
x[1] = x1;
318 x2 = a24 + a20;
x[2] = x2;
319 x3 = a26 - a21;
x[3] = x3;
320 x4 = a1 - a11;
x[4] = x4;
321 x5 = a27 + a21;
x[5] = x5;
322 x6 = a25 - a20;
x[6] = x6;
323 x7 = a15 - (m3 << 1);
x[7] = x7;
324 x8 = a23 - a19;
x[8] = x8;
333 0x42aace8b, 0xc2e92724, 0x47311c28, 0xc95f619a, 0x4a868feb, 0xd0859d8c,
334 0x4c913b51, 0xd8243ea0, 0x4d413ccc, 0xe0000000, 0x4c913b51, 0xe7dbc161,
335 0x4a868feb, 0xef7a6275, 0x47311c28, 0xf6a09e67, 0x42aace8b, 0xfd16d8dd,
371static int IMDCT36(
int *xCurr,
int *xPrev,
int *
y,
int btCurr,
int btPrev,
int blockIdx,
int gb)
373 int i, es, xBuf[18], xPrevWin[18];
374 int acc1, acc2, s, d, t, mOut;
375 int xo, xe, c, *xp, yLo, yHi;
385 for (i = 8; i >= 0; i--) {
386 acc1 = ((*xCurr--) >> es) - acc1;
388 acc1 = ((*xCurr--) >> es) - acc1;
396 for (i = 8; i >= 0; i--) {
397 acc1 = (*xCurr--) - acc1;
399 acc1 = (*xCurr--) - acc1;
415 if (btPrev == 0 && btCurr == 0) {
418 for (i = 0; i < 9; i++) {
420 c = *cp--; xo = *(xp + 9); xe = *xp--;
422 xo = MULSHIFT32(c, xo);
427 (*xPrev++) = xe + xo;
430 yLo = (d + (MULSHIFT32(t, *wp++) << 2));
431 yHi = (s + (MULSHIFT32(t, *wp++) << 2));
434 mOut |= FASTABS(yLo);
435 mOut |= FASTABS(yHi);
441 WinPrevious(xPrev, xPrevWin, btPrev);
444 for (i = 0; i < 9; i++) {
445 c = *cp--; xo = *(xp + 9); xe = *xp--;
447 xo = MULSHIFT32(c, xo);
451 (*xPrev++) = xe + xo;
453 yLo = (xPrevWin[i] + MULSHIFT32(d, wp[i])) << 2;
454 yHi = (xPrevWin[17-i] + MULSHIFT32(d, wp[17-i])) << 2;
457 mOut |= FASTABS(yLo);
458 mOut |= FASTABS(yHi);
463 mOut |= FreqInvertRescale(
y, xPrev, blockIdx, es);
468static int c3_0 = 0x6ed9eba1;
469static int c6[3] = { 0x7ba3751d, 0x5a82799a, 0x2120fb83 };
474static __inline
void imdct12 (
int *
x,
int *out)
477 int x0, x1, x2, x3, x4, x5;
479 x0 = *
x;
x+=3; x1 = *
x;
x+=3;
480 x2 = *
x;
x+=3; x3 = *
x;
x+=3;
481 x4 = *
x;
x+=3; x5 = *
x;
x+=3;
494 a0 = MULSHIFT32(c3_0, x2) << 1;
501 a0 = MULSHIFT32(c3_0, x3) << 1;
506 x1 = MULSHIFT32(c6[0], a1 + a0) << 2;
507 x3 = MULSHIFT32(c6[1], a2) << 2;
508 x5 = MULSHIFT32(c6[2], a1 - a0) << 2;
510 *out = x0 + x1; out++;
511 *out = x2 + x3; out++;
512 *out = x4 + x5; out++;
513 *out = x4 - x5; out++;
514 *out = x2 - x3; out++;
540static int IMDCT12x3(
int *xCurr,
int *xPrev,
int *
y,
int btPrev,
int blockIdx,
int gb)
542 int i, es, mOut, yLo, xBuf[18], xPrevWin[18];
549 for (i = 0; i < 18; i+=2) {
558 imdct12(xCurr + 0, xBuf + 0);
559 imdct12(xCurr + 1, xBuf + 6);
560 imdct12(xCurr + 2, xBuf + 12);
563 WinPrevious(xPrev, xPrevWin, btPrev);
571 for (i = 0; i < 3; i++) {
572 yLo = (xPrevWin[ 0+i] << 2);
573 mOut |= FASTABS(yLo);
y[( 0+i)*
NBANDS] = yLo;
574 yLo = (xPrevWin[ 3+i] << 2);
575 mOut |= FASTABS(yLo);
y[( 3+i)*
NBANDS] = yLo;
576 yLo = (xPrevWin[ 6+i] << 2) + (MULSHIFT32(wp[0+i], xBuf[3+i]));
577 mOut |= FASTABS(yLo);
y[( 6+i)*
NBANDS] = yLo;
578 yLo = (xPrevWin[ 9+i] << 2) + (MULSHIFT32(wp[3+i], xBuf[5-i]));
579 mOut |= FASTABS(yLo);
y[( 9+i)*
NBANDS] = yLo;
580 yLo = (xPrevWin[12+i] << 2) + (MULSHIFT32(wp[6+i], xBuf[2-i]) + MULSHIFT32(wp[0+i], xBuf[(6+3)+i]));
581 mOut |= FASTABS(yLo);
y[(12+i)*
NBANDS] = yLo;
582 yLo = (xPrevWin[15+i] << 2) + (MULSHIFT32(wp[9+i], xBuf[0+i]) + MULSHIFT32(wp[3+i], xBuf[(6+5)-i]));
583 mOut |= FASTABS(yLo);
y[(15+i)*
NBANDS] = yLo;
587 for (i = 6; i < 9; i++)
588 *xPrev++ = xBuf[i] >> 2;
589 for (i = 12; i < 18; i++)
590 *xPrev++ = xBuf[i] >> 2;
593 mOut |= FreqInvertRescale(
y, xPrev, blockIdx, es);
624 int xPrevWin[18], currWinIdx, prevWinIdx;
625 int i, j, nBlocksOut, nonZero, mOut;
642 if (i < bc->prevWinSwitch)
646 mOut |= IMDCT36(xCurr, xPrev, &(
y[0][i]), currWinIdx, prevWinIdx, i, bc->
gbIn);
656 if (i < bc->prevWinSwitch)
659 mOut |= IMDCT12x3(xCurr, xPrev, &(
y[0][i]), prevWinIdx, i, bc->
gbIn);
668 if (i < bc->prevWinSwitch)
670 WinPrevious(xPrev, xPrevWin, prevWinIdx);
674 for (j = 0; j < 9; j++) {
675 xp = xPrevWin[2*j+0] << 2;
681 xp = xPrevWin[2*j+1] << 2;
682 xp = (xp ^ (fiBit >> 31)) + (i & 0x01);
695 for ( ; i < 32; i++) {
696 for (j = 0; j < 18; j++)
700 bc->
gbOut = CLZ(mOut) - 1;
724 int nBfly, blockCutoff;
int nonZeroBound[MAX_NCHAN]
int huffDecBuf[MAX_NCHAN][MAX_NSAMP]
int overBuf[MAX_NCHAN][MAX_NSAMP/2]
int numPrevIMDCT[MAX_NCHAN]
int prevWinSwitch[MAX_NCHAN]
int outBuf[MAX_NCHAN][BLOCK_SIZE][NBANDS]
SideInfoSub sis[MAX_NGRAN][MAX_NCHAN]