Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendct64.c
Go to the documentation of this file.
00001 /* 00002 dct64.c: DCT64, the plain C version 00003 00004 copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1 00005 see COPYING and AUTHORS files in distribution or http://mpg123.org 00006 initially written by Michael Hipp 00007 */ 00008 00009 /* 00010 * Discrete Cosine Tansform (DCT) for subband synthesis 00011 * 00012 * -funroll-loops (for gcc) will remove the loops for better performance 00013 * using loops in the source-code enhances readabillity 00014 * 00015 * 00016 * TODO: write an optimized version for the down-sampling modes 00017 * (in these modes the bands 16-31 (2:1) or 8-31 (4:1) are zero 00018 */ 00019 00020 #include "mpg123lib_intern.h" 00021 00022 void dct64(real *out0,real *out1,real *samples) 00023 { 00024 real bufs[64]; 00025 00026 { 00027 register int i,j; 00028 register real *b1,*b2,*bs,*costab; 00029 00030 b1 = samples; 00031 bs = bufs; 00032 costab = pnts[0]+16; 00033 b2 = b1 + 32; 00034 00035 for(i=15;i>=0;i--) 00036 *bs++ = (*b1++ + *--b2); 00037 for(i=15;i>=0;i--) 00038 *bs++ = REAL_MUL((*--b2 - *b1++), *--costab); 00039 00040 b1 = bufs; 00041 costab = pnts[1]+8; 00042 b2 = b1 + 16; 00043 00044 { 00045 for(i=7;i>=0;i--) 00046 *bs++ = (*b1++ + *--b2); 00047 for(i=7;i>=0;i--) 00048 *bs++ = REAL_MUL((*--b2 - *b1++), *--costab); 00049 b2 += 32; 00050 costab += 8; 00051 for(i=7;i>=0;i--) 00052 *bs++ = (*b1++ + *--b2); 00053 for(i=7;i>=0;i--) 00054 *bs++ = REAL_MUL((*b1++ - *--b2), *--costab); 00055 b2 += 32; 00056 } 00057 00058 bs = bufs; 00059 costab = pnts[2]; 00060 b2 = b1 + 8; 00061 00062 for(j=2;j;j--) 00063 { 00064 for(i=3;i>=0;i--) 00065 *bs++ = (*b1++ + *--b2); 00066 for(i=3;i>=0;i--) 00067 *bs++ = REAL_MUL((*--b2 - *b1++), costab[i]); 00068 b2 += 16; 00069 for(i=3;i>=0;i--) 00070 *bs++ = (*b1++ + *--b2); 00071 for(i=3;i>=0;i--) 00072 *bs++ = REAL_MUL((*b1++ - *--b2), costab[i]); 00073 b2 += 16; 00074 } 00075 00076 b1 = bufs; 00077 costab = pnts[3]; 00078 b2 = b1 + 4; 00079 00080 for(j=4;j;j--) 00081 { 00082 *bs++ = (*b1++ + *--b2); 00083 *bs++ = (*b1++ + *--b2); 00084 *bs++ = REAL_MUL((*--b2 - *b1++), costab[1]); 00085 *bs++ = REAL_MUL((*--b2 - *b1++), costab[0]); 00086 b2 += 8; 00087 *bs++ = (*b1++ + *--b2); 00088 *bs++ = (*b1++ + *--b2); 00089 *bs++ = REAL_MUL((*b1++ - *--b2), costab[1]); 00090 *bs++ = REAL_MUL((*b1++ - *--b2), costab[0]); 00091 b2 += 8; 00092 } 00093 bs = bufs; 00094 costab = pnts[4]; 00095 00096 for(j=8;j;j--) 00097 { 00098 real v0,v1; 00099 v0=*b1++; v1 = *b1++; 00100 *bs++ = (v0 + v1); 00101 *bs++ = REAL_MUL((v0 - v1), (*costab)); 00102 v0=*b1++; v1 = *b1++; 00103 *bs++ = (v0 + v1); 00104 *bs++ = REAL_MUL((v1 - v0), (*costab)); 00105 } 00106 00107 } 00108 00109 00110 { 00111 register real *b1; 00112 register int i; 00113 00114 for(b1=bufs,i=8;i;i--,b1+=4) 00115 b1[2] += b1[3]; 00116 00117 for(b1=bufs,i=4;i;i--,b1+=8) 00118 { 00119 b1[4] += b1[6]; 00120 b1[6] += b1[5]; 00121 b1[5] += b1[7]; 00122 } 00123 00124 for(b1=bufs,i=2;i;i--,b1+=16) 00125 { 00126 b1[8] += b1[12]; 00127 b1[12] += b1[10]; 00128 b1[10] += b1[14]; 00129 b1[14] += b1[9]; 00130 b1[9] += b1[13]; 00131 b1[13] += b1[11]; 00132 b1[11] += b1[15]; 00133 } 00134 } 00135 00136 00137 out0[0x10*16] = REAL_SCALE_DCT64(bufs[0]); 00138 out0[0x10*15] = REAL_SCALE_DCT64(bufs[16+0] + bufs[16+8]); 00139 out0[0x10*14] = REAL_SCALE_DCT64(bufs[8]); 00140 out0[0x10*13] = REAL_SCALE_DCT64(bufs[16+8] + bufs[16+4]); 00141 out0[0x10*12] = REAL_SCALE_DCT64(bufs[4]); 00142 out0[0x10*11] = REAL_SCALE_DCT64(bufs[16+4] + bufs[16+12]); 00143 out0[0x10*10] = REAL_SCALE_DCT64(bufs[12]); 00144 out0[0x10* 9] = REAL_SCALE_DCT64(bufs[16+12] + bufs[16+2]); 00145 out0[0x10* 8] = REAL_SCALE_DCT64(bufs[2]); 00146 out0[0x10* 7] = REAL_SCALE_DCT64(bufs[16+2] + bufs[16+10]); 00147 out0[0x10* 6] = REAL_SCALE_DCT64(bufs[10]); 00148 out0[0x10* 5] = REAL_SCALE_DCT64(bufs[16+10] + bufs[16+6]); 00149 out0[0x10* 4] = REAL_SCALE_DCT64(bufs[6]); 00150 out0[0x10* 3] = REAL_SCALE_DCT64(bufs[16+6] + bufs[16+14]); 00151 out0[0x10* 2] = REAL_SCALE_DCT64(bufs[14]); 00152 out0[0x10* 1] = REAL_SCALE_DCT64(bufs[16+14] + bufs[16+1]); 00153 out0[0x10* 0] = REAL_SCALE_DCT64(bufs[1]); 00154 00155 out1[0x10* 0] = REAL_SCALE_DCT64(bufs[1]); 00156 out1[0x10* 1] = REAL_SCALE_DCT64(bufs[16+1] + bufs[16+9]); 00157 out1[0x10* 2] = REAL_SCALE_DCT64(bufs[9]); 00158 out1[0x10* 3] = REAL_SCALE_DCT64(bufs[16+9] + bufs[16+5]); 00159 out1[0x10* 4] = REAL_SCALE_DCT64(bufs[5]); 00160 out1[0x10* 5] = REAL_SCALE_DCT64(bufs[16+5] + bufs[16+13]); 00161 out1[0x10* 6] = REAL_SCALE_DCT64(bufs[13]); 00162 out1[0x10* 7] = REAL_SCALE_DCT64(bufs[16+13] + bufs[16+3]); 00163 out1[0x10* 8] = REAL_SCALE_DCT64(bufs[3]); 00164 out1[0x10* 9] = REAL_SCALE_DCT64(bufs[16+3] + bufs[16+11]); 00165 out1[0x10*10] = REAL_SCALE_DCT64(bufs[11]); 00166 out1[0x10*11] = REAL_SCALE_DCT64(bufs[16+11] + bufs[16+7]); 00167 out1[0x10*12] = REAL_SCALE_DCT64(bufs[7]); 00168 out1[0x10*13] = REAL_SCALE_DCT64(bufs[16+7] + bufs[16+15]); 00169 out1[0x10*14] = REAL_SCALE_DCT64(bufs[15]); 00170 out1[0x10*15] = REAL_SCALE_DCT64(bufs[16+15]); 00171 00172 } 00173 00174 Generated on Fri May 25 2012 04:32:36 for ReactOS by
1.7.6.1
|