Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygensynth_i486.c
Go to the documentation of this file.
00001 /* 00002 decode_i486.c: i486 decode 00003 00004 copyright 1998-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 Fabrice Bellard 00007 00008 One has to see if the modification for non-static memory kills this optimization (cache locality?). 00009 */ 00010 00011 /* 00012 * Subband Synthesis for MPEG Audio. 00013 * 00014 * Version optimized for 80486 by using integer arithmetic, 00015 * multiplications by shift and add, and by increasing locality in 00016 * order to fit the 8KB L1 cache. This code should be compiled with gcc 00017 * 2.7.2 or higher. 00018 * 00019 * Note: this version does not guaranty a good accuracy. The filter 00020 * coefficients are quantified on 14 bits. 00021 * 00022 * (c) 1998 Fabrice Bellard 00023 */ 00024 00025 #include "mpg123lib_intern.h" 00026 00027 #define FIR16_1(pos,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15) \ 00028 {\ 00029 int sum;\ 00030 sum=(c0)*b0[0]+(c1)*b0[1]+(c2)*b0[2]+(c3)*b0[3]+\ 00031 (c4)*b0[4]+(c5)*b0[5]+(c6)*b0[6]+(c7)*b0[7]+\ 00032 (c8)*b0[8]+(c9)*b0[9]+(c10)*b0[10]+(c11)*b0[11]+\ 00033 (c12)*b0[12]+(c13)*b0[13]+(c14)*b0[14]+(c15)*b0[15];\ 00034 sum=(sum+(1 << 13))>>14;\ 00035 if (sum<-32768) sum=-32768;\ 00036 else if (sum>32767) sum=32767;\ 00037 samples[2*(pos)]=sum;\ 00038 b0+=FIR_BUFFER_SIZE;\ 00039 } 00040 00041 #define FIR16_2(pos1,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,\ 00042 pos2,d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15) \ 00043 {\ 00044 int sum1,sum2,v;\ 00045 \ 00046 v=b0[0];\ 00047 sum1=(c0)*v;\ 00048 sum2=(d0)*v;\ 00049 v=b0[1];\ 00050 sum1+=(c1)*v;\ 00051 sum2+=(d1)*v;\ 00052 v=b0[2];\ 00053 sum1+=(c2)*v;\ 00054 sum2+=(d2)*v;\ 00055 v=b0[3];\ 00056 sum1+=(c3)*v;\ 00057 sum2+=(d3)*v;\ 00058 v=b0[4];\ 00059 sum1+=(c4)*v;\ 00060 sum2+=(d4)*v;\ 00061 v=b0[5];\ 00062 sum1+=(c5)*v;\ 00063 sum2+=(d5)*v;\ 00064 v=b0[6];\ 00065 sum1+=(c6)*v;\ 00066 sum2+=(d6)*v;\ 00067 v=b0[7];\ 00068 sum1+=(c7)*v;\ 00069 sum2+=(d7)*v;\ 00070 v=b0[8];\ 00071 sum1+=(c8)*v;\ 00072 sum2+=(d8)*v;\ 00073 v=b0[9];\ 00074 sum1+=(c9)*v;\ 00075 sum2+=(d9)*v;\ 00076 v=b0[10];\ 00077 sum1+=(c10)*v;\ 00078 sum2+=(d10)*v;\ 00079 v=b0[11];\ 00080 sum1+=(c11)*v;\ 00081 sum2+=(d11)*v;\ 00082 v=b0[12];\ 00083 sum1+=(c12)*v;\ 00084 sum2+=(d12)*v;\ 00085 v=b0[13];\ 00086 sum1+=(c13)*v;\ 00087 sum2+=(d13)*v;\ 00088 v=b0[14];\ 00089 sum1+=(c14)*v;\ 00090 sum2+=(d14)*v;\ 00091 v=b0[15];\ 00092 sum1+=(c15)*v;\ 00093 sum2+=(d15)*v;\ 00094 \ 00095 sum1=(sum1+(1<<13))>>14;\ 00096 sum2=(sum2+(1<<13))>>14;\ 00097 \ 00098 if (sum1<-32768) sum1=-32768;\ 00099 else if (sum1>32767) sum1=32767;\ 00100 samples[(pos1)*2]=sum1;\ 00101 \ 00102 if (sum2<-32768) sum2=-32768;\ 00103 else if (sum2>32767) sum2=32767;\ 00104 samples[(pos2)*2]=sum2;\ 00105 b0+=FIR_BUFFER_SIZE;\ 00106 } 00107 00108 int absynth_1to1_i486(real *bandPtr, int channel, mpg123_handle *fr, int nb_blocks) 00109 { 00110 short *samples = (short *) (fr->buffer.data+fr->buffer.fill); 00111 int *b0,**buf; 00112 int clip = 0; 00113 int block,b,bo_start; 00114 00115 /* samples address */ 00116 samples+=channel; 00117 00118 bo_start=fr->i486bo[channel]; 00119 buf = fr->int_buffs[channel]; 00120 00121 b=bo_start; 00122 for(block=0;block<nb_blocks;block++) { 00123 00124 /* FIR offset */ 00125 b++; 00126 if (b >= FIR_BUFFER_SIZE) { 00127 int *p,*q; 00128 int c,i,j; 00129 00130 /* we shift the buffers */ 00131 for(c=0;c<2;c++) { 00132 p=&buf[c][0]+1; 00133 q=p+(FIR_BUFFER_SIZE-FIR_SIZE); 00134 for(i=0;i<17;i++) { 00135 for(j=0;j<FIR_SIZE-1;j++) p[j]=q[j]; 00136 p+=FIR_BUFFER_SIZE; 00137 q+=FIR_BUFFER_SIZE; 00138 } 00139 } 00140 /* we update 'bo' accordingly */ 00141 b=fr->i486bo[channel]=FIR_SIZE; 00142 } 00143 00144 if(b & 1) { 00145 dct64_i486(buf[1]+b,buf[0]+b,bandPtr); 00146 } else { 00147 dct64_i486(buf[0]+b,buf[1]+b,bandPtr); 00148 } 00149 bandPtr+=32; 00150 } 00151 fr->i486bo[channel]=b; 00152 00153 /* filter bank: part 1 */ 00154 b=bo_start; 00155 for(block=0;block<nb_blocks;block++) { 00156 b++; 00157 if (b >= FIR_BUFFER_SIZE) b=FIR_SIZE; 00158 if(b & 1) { 00159 b0 = buf[0] + b - (FIR_SIZE-1); 00160 } else { 00161 b0 = buf[1] + b - (FIR_SIZE-1); 00162 } 00163 00164 FIR16_1(0,-7,53,-114,509,-1288,1643,-9372,18759,9372,1643,1288,509,114,53,7,0); 00165 FIR16_2(1,-6,52,-100,515,-1197,1783,-8910,18748,9834,1489,1379,500,129,54,7,0, 00166 31,0,-7,54,-129,500,-1379,1489,-9834,18748,8910,1783,1197,515,100,52,6); 00167 FIR16_2(2,-6,50,-86,520,-1106,1910,-8447,18714,10294,1322,1469,488,145,55,8,0, 00168 30,0,-8,55,-145,488,-1469,1322,-10294,18714,8447,1910,1106,520,86,50,6); 00169 FIR16_2(3,-5,49,-73,521,-1015,2023,-7986,18657,10751,1140,1559,473,161,56,9,0, 00170 29,0,-9,56,-161,473,-1559,1140,-10751,18657,7986,2023,1015,521,73,49,5); 00171 samples+=64; 00172 } 00173 samples-=64*nb_blocks; 00174 00175 /* filter bank: part 2 */ 00176 00177 b=bo_start; 00178 for(block=0;block<nb_blocks;block++) { 00179 b++; 00180 if (b >= FIR_BUFFER_SIZE) b=FIR_SIZE; 00181 if(b & 1) { 00182 b0 = buf[0] + b - (FIR_SIZE-1) + 4*FIR_BUFFER_SIZE; 00183 } else { 00184 b0 = buf[1] + b - (FIR_SIZE-1) + 4*FIR_BUFFER_SIZE; 00185 } 00186 00187 FIR16_2(4,-4,47,-61,521,-926,2123,-7528,18578,11205,944,1647,455,177,56,10,0, 00188 28,0,-10,56,-177,455,-1647,944,-11205,18578,7528,2123,926,521,61,47,4); 00189 FIR16_2(5,-4,45,-49,518,-837,2210,-7072,18477,11654,733,1733,434,194,57,11,0, 00190 27,0,-11,57,-194,434,-1733,733,-11654,18477,7072,2210,837,518,49,45,4); 00191 FIR16_2(6,-4,44,-38,514,-751,2284,-6620,18353,12097,509,1817,411,212,57,12,0, 00192 26,0,-12,57,-212,411,-1817,509,-12097,18353,6620,2284,751,514,38,44,4); 00193 FIR16_2(7,-3,42,-27,508,-665,2347,-6173,18208,12534,270,1899,383,229,56,13,0, 00194 25,0,-13,56,-229,383,-1899,270,-12534,18208,6173,2347,665,508,27,42,3); 00195 00196 samples+=64; 00197 } 00198 samples-=64*nb_blocks; 00199 00200 /* filter bank: part 3 */ 00201 00202 b=bo_start; 00203 for(block=0;block<nb_blocks;block++) { 00204 b++; 00205 if (b >= FIR_BUFFER_SIZE) b=FIR_SIZE; 00206 if(b & 1) { 00207 b0 = buf[0] + b - (FIR_SIZE-1) + 8*FIR_BUFFER_SIZE; 00208 } else { 00209 b0 = buf[1] + b - (FIR_SIZE-1) + 8*FIR_BUFFER_SIZE; 00210 } 00211 00212 FIR16_2(8,-3,40,-18,500,-582,2398,-5732,18042,12963,17,1977,353,247,56,14,0, 00213 24,0,-14,56,-247,353,-1977,17,-12963,18042,5732,2398,582,500,18,40,3); 00214 FIR16_2(9,-2,38,-9,490,-501,2437,-5297,17855,13383,-249,2052,320,266,55,15,0, 00215 23,0,-15,55,-266,320,-2052,-249,-13383,17855,5297,2437,501,490,9,38,2); 00216 FIR16_2(10,-2,36,0,479,-423,2465,-4869,17647,13794,-530,2122,282,284,53,17,0, 00217 22,0,-17,53,-284,282,-2122,-530,-13794,17647,4869,2465,423,479,0,36,2); 00218 FIR16_2(11,-2,34,7,467,-347,2483,-4449,17419,14194,-825,2188,242,302,52,18,0, 00219 21,0,-18,52,-302,242,-2188,-825,-14194,17419,4449,2483,347,467,-7,34,2); 00220 00221 samples+=64; 00222 } 00223 samples-=64*nb_blocks; 00224 00225 /* filter bank: part 4 */ 00226 00227 b=bo_start; 00228 for(block=0;block<nb_blocks;block++) { 00229 b++; 00230 if (b >= FIR_BUFFER_SIZE) b=FIR_SIZE; 00231 if(b & 1) { 00232 b0 = buf[0] + b - (FIR_SIZE-1) + 12*FIR_BUFFER_SIZE; 00233 } else { 00234 b0 = buf[1] + b - (FIR_SIZE-1) + 12*FIR_BUFFER_SIZE; 00235 } 00236 00237 FIR16_2(12,-2,33,14,454,-273,2491,-4038,17173,14583,-1133,2249,198,320,50,19,0, 00238 20,0,-19,50,-320,198,-2249,-1133,-14583,17173,4038,2491,273,454,-14,33,2); 00239 FIR16_2(13,-1,31,20,439,-203,2489,-3637,16907,14959,-1454,2304,151,339,47,21,-1, 00240 19,-1,-21,47,-339,151,-2304,-1454,-14959,16907,3637,2489,203,439,-20,31,1); 00241 FIR16_2(14,-1,29,26,424,-136,2479,-3245,16623,15322,-1788,2354,100,357,44,22,-1, 00242 18,-1,-22,44,-357,100,-2354,-1788,-15322,16623,3245,2479,136,424,-26,29,1); 00243 FIR16_2(15,-1,27,31,408,-72,2459,-2863,16322,15671,-2135,2396,46,374,40,24,-1, 00244 17,-1,-24,40,-374,46,-2396,-2135,-15671,16322,2863,2459,72,408,-31,27,1); 00245 FIR16_1(16,-1,0,36,0,-11,0,-2493,0,16004,0,2431,0,391,0,26,0); 00246 00247 samples+=64; 00248 } 00249 00250 return clip; 00251 } 00252 Generated on Sun May 27 2012 04:34:10 for ReactOS by
1.7.6.1
|