~ubuntu-branches/ubuntu/lucid/mpg123/lucid

« back to all changes in this revision

Viewing changes to src/decode_i486.c

Tags: upstream-0.60
ImportĀ upstreamĀ versionĀ 0.60

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
        decode_i486.c: i486 decode
 
3
 
 
4
        copyright 1998-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
 
5
        see COPYING and AUTHORS files in distribution or http://mpg123.de
 
6
        initially written by Fabrice Bellard
 
7
*/
 
8
 
 
9
/* 
 
10
 * Subband Synthesis for MPEG Audio. 
 
11
 *
 
12
 * Version optimized for 80486 by using integer arithmetic,
 
13
 * multiplications by shift and add, and by increasing locality in
 
14
 * order to fit the 8KB L1 cache. This code should be compiled with gcc
 
15
 * 2.7.2 or higher.
 
16
 *
 
17
 * Note: this version does not guaranty a good accuracy. The filter
 
18
 * coefficients are quantified on 14 bits.
 
19
 *
 
20
 * (c) 1998 Fabrice Bellard 
 
21
 */
 
22
 
 
23
#include <stdlib.h>
 
24
 
 
25
#include "config.h"
 
26
#include "mpg123.h"
 
27
 
 
28
#define FIR_SIZE 16
 
29
 
 
30
#define FIR16_1(pos,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15) \
 
31
{\
 
32
  int sum;\
 
33
  sum=(c0)*b0[0]+(c1)*b0[1]+(c2)*b0[2]+(c3)*b0[3]+\
 
34
  (c4)*b0[4]+(c5)*b0[5]+(c6)*b0[6]+(c7)*b0[7]+\
 
35
  (c8)*b0[8]+(c9)*b0[9]+(c10)*b0[10]+(c11)*b0[11]+\
 
36
  (c12)*b0[12]+(c13)*b0[13]+(c14)*b0[14]+(c15)*b0[15];\
 
37
  sum=(sum+(1 << 13))>>14;\
 
38
  if (sum<-32768) sum=-32768;\
 
39
  else if (sum>32767) sum=32767;\
 
40
  samples[2*(pos)]=sum;\
 
41
  b0+=FIR_BUFFER_SIZE;\
 
42
}
 
43
 
 
44
#define FIR16_2(pos1,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,\
 
45
              pos2,d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15) \
 
46
{\
 
47
  int sum1,sum2,v;\
 
48
\
 
49
  v=b0[0];\
 
50
  sum1=(c0)*v;\
 
51
  sum2=(d0)*v;\
 
52
  v=b0[1];\
 
53
  sum1+=(c1)*v;\
 
54
  sum2+=(d1)*v;\
 
55
  v=b0[2];\
 
56
  sum1+=(c2)*v;\
 
57
  sum2+=(d2)*v;\
 
58
  v=b0[3];\
 
59
  sum1+=(c3)*v;\
 
60
  sum2+=(d3)*v;\
 
61
  v=b0[4];\
 
62
  sum1+=(c4)*v;\
 
63
  sum2+=(d4)*v;\
 
64
  v=b0[5];\
 
65
  sum1+=(c5)*v;\
 
66
  sum2+=(d5)*v;\
 
67
  v=b0[6];\
 
68
  sum1+=(c6)*v;\
 
69
  sum2+=(d6)*v;\
 
70
  v=b0[7];\
 
71
  sum1+=(c7)*v;\
 
72
  sum2+=(d7)*v;\
 
73
  v=b0[8];\
 
74
  sum1+=(c8)*v;\
 
75
  sum2+=(d8)*v;\
 
76
  v=b0[9];\
 
77
  sum1+=(c9)*v;\
 
78
  sum2+=(d9)*v;\
 
79
  v=b0[10];\
 
80
  sum1+=(c10)*v;\
 
81
  sum2+=(d10)*v;\
 
82
  v=b0[11];\
 
83
  sum1+=(c11)*v;\
 
84
  sum2+=(d11)*v;\
 
85
  v=b0[12];\
 
86
  sum1+=(c12)*v;\
 
87
  sum2+=(d12)*v;\
 
88
  v=b0[13];\
 
89
  sum1+=(c13)*v;\
 
90
  sum2+=(d13)*v;\
 
91
  v=b0[14];\
 
92
  sum1+=(c14)*v;\
 
93
  sum2+=(d14)*v;\
 
94
  v=b0[15];\
 
95
  sum1+=(c15)*v;\
 
96
  sum2+=(d15)*v;\
 
97
\
 
98
  sum1=(sum1+(1<<13))>>14;\
 
99
  sum2=(sum2+(1<<13))>>14;\
 
100
\
 
101
  if (sum1<-32768) sum1=-32768;\
 
102
  else if (sum1>32767) sum1=32767;\
 
103
  samples[(pos1)*2]=sum1;\
 
104
\
 
105
  if (sum2<-32768) sum2=-32768;\
 
106
  else if (sum2>32767) sum2=32767;\
 
107
  samples[(pos2)*2]=sum2;\
 
108
  b0+=FIR_BUFFER_SIZE;\
 
109
}
 
110
 
 
111
int synth_1to1_486(real *bandPtr,int channel,unsigned char *out,int nb_blocks)
 
112
{
 
113
  static int buffs[2][2][17*FIR_BUFFER_SIZE];
 
114
  static int bo[2] = { FIR_SIZE-1, FIR_SIZE-1 };
 
115
  short *samples = (short *) out;
 
116
  int *b0,(*buf)[17*FIR_BUFFER_SIZE];
 
117
  int clip = 0; 
 
118
  int block,b,bo_start;
 
119
 
 
120
  /* samples address */
 
121
  samples+=channel;
 
122
 
 
123
  bo_start=bo[channel];
 
124
  buf = buffs[channel];
 
125
 
 
126
  b=bo_start;
 
127
  for(block=0;block<nb_blocks;block++) {
 
128
 
 
129
    /* FIR offset */
 
130
    b++;
 
131
    if (b >= FIR_BUFFER_SIZE) {
 
132
      int *p,*q;
 
133
      int c,i,j;
 
134
      
 
135
      /* we shift the buffers */
 
136
      for(c=0;c<2;c++) {
 
137
        p=&buf[c][0]+1;
 
138
        q=p+(FIR_BUFFER_SIZE-FIR_SIZE);
 
139
        for(i=0;i<17;i++) {
 
140
          for(j=0;j<FIR_SIZE-1;j++) p[j]=q[j];
 
141
          p+=FIR_BUFFER_SIZE;
 
142
          q+=FIR_BUFFER_SIZE;
 
143
        }
 
144
      }
 
145
      /* we update 'bo' accordingly */
 
146
      b=bo[channel]=FIR_SIZE;
 
147
    }
 
148
    
 
149
    if(b & 1) {
 
150
      dct64_486(buf[1]+b,buf[0]+b,bandPtr);
 
151
    } else {
 
152
      dct64_486(buf[0]+b,buf[1]+b,bandPtr);
 
153
    }
 
154
    bandPtr+=32;
 
155
  }
 
156
  bo[channel]=b;
 
157
 
 
158
  /* filter bank: part 1 */
 
159
  b=bo_start;
 
160
  for(block=0;block<nb_blocks;block++) {
 
161
    b++;
 
162
    if (b >= FIR_BUFFER_SIZE) b=FIR_SIZE;
 
163
    if(b & 1) {
 
164
      b0 = buf[0] + b - (FIR_SIZE-1);
 
165
    } else {
 
166
      b0 = buf[1] + b - (FIR_SIZE-1);
 
167
    }
 
168
 
 
169
 FIR16_1(0,-7,53,-114,509,-1288,1643,-9372,18759,9372,1643,1288,509,114,53,7,0);
 
170
 FIR16_2(1,-6,52,-100,515,-1197,1783,-8910,18748,9834,1489,1379,500,129,54,7,0,
 
171
 31,0,-7,54,-129,500,-1379,1489,-9834,18748,8910,1783,1197,515,100,52,6);
 
172
 FIR16_2(2,-6,50,-86,520,-1106,1910,-8447,18714,10294,1322,1469,488,145,55,8,0,
 
173
 30,0,-8,55,-145,488,-1469,1322,-10294,18714,8447,1910,1106,520,86,50,6);
 
174
 FIR16_2(3,-5,49,-73,521,-1015,2023,-7986,18657,10751,1140,1559,473,161,56,9,0,
 
175
 29,0,-9,56,-161,473,-1559,1140,-10751,18657,7986,2023,1015,521,73,49,5);              
 
176
    samples+=64;
 
177
  }
 
178
  samples-=64*nb_blocks;
 
179
  
 
180
  /* filter bank: part 2 */
 
181
 
 
182
  b=bo_start;
 
183
  for(block=0;block<nb_blocks;block++) {
 
184
    b++;
 
185
    if (b >= FIR_BUFFER_SIZE) b=FIR_SIZE;
 
186
    if(b & 1) {
 
187
      b0 = buf[0] + b - (FIR_SIZE-1) + 4*FIR_BUFFER_SIZE;
 
188
    } else {
 
189
      b0 = buf[1] + b - (FIR_SIZE-1) + 4*FIR_BUFFER_SIZE;
 
190
    }
 
191
 
 
192
 FIR16_2(4,-4,47,-61,521,-926,2123,-7528,18578,11205,944,1647,455,177,56,10,0,
 
193
 28,0,-10,56,-177,455,-1647,944,-11205,18578,7528,2123,926,521,61,47,4);
 
194
 FIR16_2(5,-4,45,-49,518,-837,2210,-7072,18477,11654,733,1733,434,194,57,11,0,
 
195
 27,0,-11,57,-194,434,-1733,733,-11654,18477,7072,2210,837,518,49,45,4);
 
196
 FIR16_2(6,-4,44,-38,514,-751,2284,-6620,18353,12097,509,1817,411,212,57,12,0,
 
197
 26,0,-12,57,-212,411,-1817,509,-12097,18353,6620,2284,751,514,38,44,4);
 
198
 FIR16_2(7,-3,42,-27,508,-665,2347,-6173,18208,12534,270,1899,383,229,56,13,0,
 
199
 25,0,-13,56,-229,383,-1899,270,-12534,18208,6173,2347,665,508,27,42,3);             
 
200
 
 
201
    samples+=64;
 
202
  }
 
203
  samples-=64*nb_blocks;
 
204
 
 
205
  /* filter bank: part 3 */
 
206
 
 
207
  b=bo_start;
 
208
  for(block=0;block<nb_blocks;block++) {
 
209
    b++;
 
210
    if (b >= FIR_BUFFER_SIZE) b=FIR_SIZE;
 
211
    if(b & 1) {
 
212
      b0 = buf[0] + b - (FIR_SIZE-1) + 8*FIR_BUFFER_SIZE;
 
213
    } else {
 
214
      b0 = buf[1] + b - (FIR_SIZE-1) + 8*FIR_BUFFER_SIZE;
 
215
    }
 
216
 
 
217
 FIR16_2(8,-3,40,-18,500,-582,2398,-5732,18042,12963,17,1977,353,247,56,14,0,
 
218
 24,0,-14,56,-247,353,-1977,17,-12963,18042,5732,2398,582,500,18,40,3);
 
219
 FIR16_2(9,-2,38,-9,490,-501,2437,-5297,17855,13383,-249,2052,320,266,55,15,0,
 
220
 23,0,-15,55,-266,320,-2052,-249,-13383,17855,5297,2437,501,490,9,38,2);
 
221
 FIR16_2(10,-2,36,0,479,-423,2465,-4869,17647,13794,-530,2122,282,284,53,17,0,
 
222
 22,0,-17,53,-284,282,-2122,-530,-13794,17647,4869,2465,423,479,0,36,2);
 
223
 FIR16_2(11,-2,34,7,467,-347,2483,-4449,17419,14194,-825,2188,242,302,52,18,0,
 
224
 21,0,-18,52,-302,242,-2188,-825,-14194,17419,4449,2483,347,467,-7,34,2);          
 
225
 
 
226
    samples+=64;
 
227
  }
 
228
  samples-=64*nb_blocks;
 
229
 
 
230
  /* filter bank: part 4 */
 
231
 
 
232
  b=bo_start;
 
233
  for(block=0;block<nb_blocks;block++) {
 
234
    b++;
 
235
    if (b >= FIR_BUFFER_SIZE) b=FIR_SIZE;
 
236
    if(b & 1) {
 
237
      b0 = buf[0] + b - (FIR_SIZE-1) + 12*FIR_BUFFER_SIZE;
 
238
    } else {
 
239
      b0 = buf[1] + b - (FIR_SIZE-1) + 12*FIR_BUFFER_SIZE;
 
240
    }
 
241
 
 
242
 FIR16_2(12,-2,33,14,454,-273,2491,-4038,17173,14583,-1133,2249,198,320,50,19,0,
 
243
 20,0,-19,50,-320,198,-2249,-1133,-14583,17173,4038,2491,273,454,-14,33,2);
 
244
 FIR16_2(13,-1,31,20,439,-203,2489,-3637,16907,14959,-1454,2304,151,339,47,21,-1,
 
245
 19,-1,-21,47,-339,151,-2304,-1454,-14959,16907,3637,2489,203,439,-20,31,1);
 
246
 FIR16_2(14,-1,29,26,424,-136,2479,-3245,16623,15322,-1788,2354,100,357,44,22,-1,
 
247
 18,-1,-22,44,-357,100,-2354,-1788,-15322,16623,3245,2479,136,424,-26,29,1);
 
248
 FIR16_2(15,-1,27,31,408,-72,2459,-2863,16322,15671,-2135,2396,46,374,40,24,-1,
 
249
 17,-1,-24,40,-374,46,-2396,-2135,-15671,16322,2863,2459,72,408,-31,27,1);
 
250
 FIR16_1(16,-1,0,36,0,-11,0,-2493,0,16004,0,2431,0,391,0,26,0);      
 
251
 
 
252
    samples+=64;
 
253
  }
 
254
 
 
255
  return clip;
 
256
}
 
257