ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

synth_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.