Mercurial > audlegacy-plugins
diff src/Input/mpg123/dct64.c @ 0:13389e613d67 trunk
[svn] - initial import of audacious-plugins tree (lots to do)
author | nenolod |
---|---|
date | Mon, 18 Sep 2006 01:11:49 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Input/mpg123/dct64.c Mon Sep 18 01:11:49 2006 -0700 @@ -0,0 +1,163 @@ + +/* + * Discrete Cosine Tansform (DCT) for subband synthesis + * + * -funroll-loops (for gcc) will remove the loops for better performance + * using loops in the source-code enhances readabillity + */ + +/* + * TODO: write an optimized version for the down-sampling modes + * (in these modes the bands 16-31 (2:1) or 8-31 (4:1) are zero + */ + +#include "mpg123.h" + +void +mpgdec_dct64(mpgdec_real * out0, mpgdec_real * out1, mpgdec_real * samples) +{ + mpgdec_real bufs[64]; + + { + register int i, j; + register mpgdec_real *b1, *b2, *bs, *costab; + + b1 = samples; + bs = bufs; + costab = mpgdec_pnts[0] + 16; + b2 = b1 + 32; + + for (i = 15; i >= 0; i--) + *bs++ = (*b1++ + *--b2); + for (i = 15; i >= 0; i--) + *bs++ = (*--b2 - *b1++) * *--costab; + + b1 = bufs; + costab = mpgdec_pnts[1] + 8; + b2 = b1 + 16; + + { + for (i = 7; i >= 0; i--) + *bs++ = (*b1++ + *--b2); + for (i = 7; i >= 0; i--) + *bs++ = (*--b2 - *b1++) * *--costab; + b2 += 32; + costab += 8; + for (i = 7; i >= 0; i--) + *bs++ = (*b1++ + *--b2); + for (i = 7; i >= 0; i--) + *bs++ = (*b1++ - *--b2) * *--costab; + b2 += 32; + } + + bs = bufs; + costab = mpgdec_pnts[2]; + b2 = b1 + 8; + + for (j = 2; j; j--) { + for (i = 3; i >= 0; i--) + *bs++ = (*b1++ + *--b2); + for (i = 3; i >= 0; i--) + *bs++ = (*--b2 - *b1++) * costab[i]; + b2 += 16; + for (i = 3; i >= 0; i--) + *bs++ = (*b1++ + *--b2); + for (i = 3; i >= 0; i--) + *bs++ = (*b1++ - *--b2) * costab[i]; + b2 += 16; + } + + b1 = bufs; + costab = mpgdec_pnts[3]; + b2 = b1 + 4; + + for (j = 4; j; j--) { + *bs++ = (*b1++ + *--b2); + *bs++ = (*b1++ + *--b2); + *bs++ = (*--b2 - *b1++) * costab[1]; + *bs++ = (*--b2 - *b1++) * costab[0]; + b2 += 8; + *bs++ = (*b1++ + *--b2); + *bs++ = (*b1++ + *--b2); + *bs++ = (*b1++ - *--b2) * costab[1]; + *bs++ = (*b1++ - *--b2) * costab[0]; + b2 += 8; + } + bs = bufs; + costab = mpgdec_pnts[4]; + + for (j = 8; j; j--) { + mpgdec_real v0, v1; + + v0 = *b1++; + v1 = *b1++; + *bs++ = (v0 + v1); + *bs++ = (v0 - v1) * (*costab); + v0 = *b1++; + v1 = *b1++; + *bs++ = (v0 + v1); + *bs++ = (v1 - v0) * (*costab); + } + + } + + { + register mpgdec_real *b1; + register int i; + + for (b1 = bufs, i = 8; i; i--, b1 += 4) + b1[2] += b1[3]; + + for (b1 = bufs, i = 4; i; i--, b1 += 8) { + b1[4] += b1[6]; + b1[6] += b1[5]; + b1[5] += b1[7]; + } + + for (b1 = bufs, i = 2; i; i--, b1 += 16) { + b1[8] += b1[12]; + b1[12] += b1[10]; + b1[10] += b1[14]; + b1[14] += b1[9]; + b1[9] += b1[13]; + b1[13] += b1[11]; + b1[11] += b1[15]; + } + } + + out0[0x10 * 16] = bufs[0]; + out0[0x10 * 15] = bufs[16 + 0] + bufs[16 + 8]; + out0[0x10 * 14] = bufs[8]; + out0[0x10 * 13] = bufs[16 + 8] + bufs[16 + 4]; + out0[0x10 * 12] = bufs[4]; + out0[0x10 * 11] = bufs[16 + 4] + bufs[16 + 12]; + out0[0x10 * 10] = bufs[12]; + out0[0x10 * 9] = bufs[16 + 12] + bufs[16 + 2]; + out0[0x10 * 8] = bufs[2]; + out0[0x10 * 7] = bufs[16 + 2] + bufs[16 + 10]; + out0[0x10 * 6] = bufs[10]; + out0[0x10 * 5] = bufs[16 + 10] + bufs[16 + 6]; + out0[0x10 * 4] = bufs[6]; + out0[0x10 * 3] = bufs[16 + 6] + bufs[16 + 14]; + out0[0x10 * 2] = bufs[14]; + out0[0x10 * 1] = bufs[16 + 14] + bufs[16 + 1]; + out0[0x10 * 0] = bufs[1]; + + out1[0x10 * 0] = bufs[1]; + out1[0x10 * 1] = bufs[16 + 1] + bufs[16 + 9]; + out1[0x10 * 2] = bufs[9]; + out1[0x10 * 3] = bufs[16 + 9] + bufs[16 + 5]; + out1[0x10 * 4] = bufs[5]; + out1[0x10 * 5] = bufs[16 + 5] + bufs[16 + 13]; + out1[0x10 * 6] = bufs[13]; + out1[0x10 * 7] = bufs[16 + 13] + bufs[16 + 3]; + out1[0x10 * 8] = bufs[3]; + out1[0x10 * 9] = bufs[16 + 3] + bufs[16 + 11]; + out1[0x10 * 10] = bufs[11]; + out1[0x10 * 11] = bufs[16 + 11] + bufs[16 + 7]; + out1[0x10 * 12] = bufs[7]; + out1[0x10 * 13] = bufs[16 + 7] + bufs[16 + 15]; + out1[0x10 * 14] = bufs[15]; + out1[0x10 * 15] = bufs[16 + 15]; + +}