1 /*
2  * Mpeg Layer-3 audio decoder
3  * --------------------------
4  * copyright (c) 1995,1996,1997 by Michael Hipp.
5  * All rights reserved. See also 'README'
6  */
7 
8 /* $Id: layer3.c,v 1.3 2003/08/12 00:02:55 snelg Exp $ */
9 
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13 
14 #include <stdlib.h>
15 #include "common.h"
16 #include "huffman.h"
17 #include "encoder.h"
18 #include "decode_i386.h"
19 
20 #ifdef WITH_DMALLOC
21 #include <dmalloc.h>
22 #endif
23 
24 #define MPEG1
25 
26 
27 unsigned char *maxGain;
28 unsigned char *minGain;
29 
30 static real ispow[8207];
31 static real aa_ca[8],aa_cs[8];
32 static real COS1[12][6];
33 static real win[4][36];
34 static real win1[4][36];
35 static real gainpow2[256+118+4];
36 static real COS9[9];
37 static real COS6_1,COS6_2;
38 static real tfcos36[9];
39 static real tfcos12[3];
40 
41 struct bandInfoStruct {
42   short longIdx[23];
43   short longDiff[22];
44   short shortIdx[14];
45   short shortDiff[13];
46 };
47 
48 int longLimit[9][23];
49 int shortLimit[9][14];
50 
51 const struct bandInfoStruct bandInfo[9] = {
52 
53 /* MPEG 1.0 */
54  { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576},
55    {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158},
56    {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3},
57    {4,4,4,4,6,8,10,12,14,18,22,30,56} } ,
58 
59  { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576},
60    {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192},
61    {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3},
62    {4,4,4,4,6,6,10,12,14,16,20,26,66} } ,
63 
64  { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} ,
65    {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} ,
66    {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} ,
67    {4,4,4,4,6,8,12,16,20,26,34,42,12} }  ,
68 
69 /* MPEG 2.0 */
70  { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
71    {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } ,
72    {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} ,
73    {4,4,4,6,6,8,10,14,18,26,32,42,18 } } ,
74                                              /* docs: 332. mpg123: 330 */
75  { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,332,394,464,540,576},
76    {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36 } ,
77    {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} ,
78    {4,4,4,6,8,10,12,14,18,24,32,44,12 } } ,
79 
80  { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
81    {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 },
82    {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3},
83    {4,4,4,6,8,10,12,14,18,24,30,40,18 } } ,
84 /* MPEG 2.5 */
85  { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
86    {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
87    {0,12,24,36,54,78,108,144,186,240,312,402,522,576},
88    {4,4,4,6,8,10,12,14,18,24,30,40,18} },
89  { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
90    {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
91    {0,12,24,36,54,78,108,144,186,240,312,402,522,576},
92    {4,4,4,6,8,10,12,14,18,24,30,40,18} },
93  { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
94    {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2},
95    {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576},
96    {8,8,8,12,16,20,24,28,36,2,2,2,26} } ,
97 };
98 
99 static int mapbuf0[9][152];
100 static int mapbuf1[9][156];
101 static int mapbuf2[9][44];
102 static int *map[9][3];
103 static int *mapend[9][3];
104 
105 static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
106 static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
107 
108 static real tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16];
109 static real pow1_1[2][16],pow2_1[2][16],pow1_2[2][16],pow2_2[2][16];
110 
get1bit(void)111 static unsigned int get1bit(void)
112 {
113   unsigned char rval;
114   rval = *wordpointer << bitindex;
115 
116   bitindex++;
117   wordpointer += (bitindex>>3);
118   bitindex &= 7;
119 
120   return rval>>7;
121 }
122 
123 
124 
125 
126 /*
127  * init tables for layer-3
128  */
init_layer3(int down_sample_sblimit)129 void init_layer3(int down_sample_sblimit)
130 {
131   int i,j,k;
132 
133   for(i=-256;i<118+4;i++)
134     gainpow2[i+256] = pow((double)2.0,-0.25 * (double) (i+210) );
135 
136   for(i=0;i<8207;i++)
137     ispow[i] = pow((double)i,(double)4.0/3.0);
138 
139   for (i=0;i<8;i++)
140   {
141     static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
142     double sq=sqrt(1.0+Ci[i]*Ci[i]);
143     aa_cs[i] = 1.0/sq;
144     aa_ca[i] = Ci[i]/sq;
145   }
146 
147   for(i=0;i<18;i++)
148   {
149     win[0][i]    = win[1][i]    = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 );
150     win[0][i+18] = win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
151   }
152   for(i=0;i<6;i++)
153   {
154     win[1][i+18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
155     win[3][i+12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 );
156     win[1][i+24] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 );
157     win[1][i+30] = win[3][i] = 0.0;
158     win[3][i+6 ] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) )  / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 );
159   }
160 
161   for(i=0;i<9;i++)
162     COS9[i] = cos( M_PI / 18.0 * (double) i);
163 
164   for(i=0;i<9;i++)
165     tfcos36[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 );
166   for(i=0;i<3;i++)
167     tfcos12[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 );
168 
169   COS6_1 = cos( M_PI / 6.0 * (double) 1);
170   COS6_2 = cos( M_PI / 6.0 * (double) 2);
171 
172   for(i=0;i<12;i++)
173   {
174     win[2][i]  = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 );
175     for(j=0;j<6;j++)
176       COS1[i][j] = cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) );
177   }
178 
179   for(j=0;j<4;j++) {
180     static int len[4] = { 36,36,12,36 };
181     for(i=0;i<len[j];i+=2)
182       win1[j][i] = + win[j][i];
183     for(i=1;i<len[j];i+=2)
184       win1[j][i] = - win[j][i];
185   }
186 
187   for(i=0;i<16;i++)
188   {
189     double t = tan( (double) i * M_PI / 12.0 );
190     tan1_1[i] = t / (1.0+t);
191     tan2_1[i] = 1.0 / (1.0 + t);
192     tan1_2[i] = M_SQRT2 * t / (1.0+t);
193     tan2_2[i] = M_SQRT2 / (1.0 + t);
194 
195     for(j=0;j<2;j++) {
196       double base = pow(2.0,-0.25*(j+1.0));
197       double p1=1.0,p2=1.0;
198       if(i > 0) {
199         if( i & 1 )
200           p1 = pow(base,(i+1.0)*0.5);
201         else
202           p2 = pow(base,i*0.5);
203       }
204       pow1_1[j][i] = p1;
205       pow2_1[j][i] = p2;
206       pow1_2[j][i] = M_SQRT2 * p1;
207       pow2_2[j][i] = M_SQRT2 * p2;
208     }
209   }
210 
211   for(j=0;j<9;j++)
212   {
213    struct bandInfoStruct *bi = (struct bandInfoStruct *)&bandInfo[j];
214    int *mp;
215    int cb,lwin;
216    short *bdf;
217 
218    mp = map[j][0] = mapbuf0[j];
219    bdf = bi->longDiff;
220    for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++) {
221      *mp++ = (*bdf) >> 1;
222      *mp++ = i;
223      *mp++ = 3;
224      *mp++ = cb;
225    }
226    bdf = bi->shortDiff+3;
227    for(cb=3;cb<13;cb++) {
228      int l = (*bdf++) >> 1;
229      for(lwin=0;lwin<3;lwin++) {
230        *mp++ = l;
231        *mp++ = i + lwin;
232        *mp++ = lwin;
233        *mp++ = cb;
234      }
235      i += 6*l;
236    }
237    mapend[j][0] = mp;
238 
239    mp = map[j][1] = mapbuf1[j];
240    bdf = bi->shortDiff+0;
241    for(i=0,cb=0;cb<13;cb++) {
242      int l = (*bdf++) >> 1;
243      for(lwin=0;lwin<3;lwin++) {
244        *mp++ = l;
245        *mp++ = i + lwin;
246        *mp++ = lwin;
247        *mp++ = cb;
248      }
249      i += 6*l;
250    }
251    mapend[j][1] = mp;
252 
253    mp = map[j][2] = mapbuf2[j];
254    bdf = bi->longDiff;
255    for(cb = 0; cb < 22 ; cb++) {
256      *mp++ = (*bdf++) >> 1;
257      *mp++ = cb;
258    }
259    mapend[j][2] = mp;
260 
261   }
262 
263   for(j=0;j<9;j++) {
264     for(i=0;i<23;i++) {
265       longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
266       if(longLimit[j][i] > (down_sample_sblimit) )
267         longLimit[j][i] = down_sample_sblimit;
268     }
269     for(i=0;i<14;i++) {
270       shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
271       if(shortLimit[j][i] > (down_sample_sblimit) )
272         shortLimit[j][i] = down_sample_sblimit;
273     }
274   }
275 
276   for(i=0;i<5;i++) {
277     for(j=0;j<6;j++) {
278       for(k=0;k<6;k++) {
279         int n = k + j * 6 + i * 36;
280         i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12);
281       }
282     }
283   }
284   for(i=0;i<4;i++) {
285     for(j=0;j<4;j++) {
286       for(k=0;k<4;k++) {
287         int n = k + j * 4 + i * 16;
288         i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12);
289       }
290     }
291   }
292   for(i=0;i<4;i++) {
293     for(j=0;j<3;j++) {
294       int n = j + i * 3;
295       i_slen2[n+244] = i|(j<<3) | (5<<12);
296       n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15);
297     }
298   }
299 
300   for(i=0;i<5;i++) {
301     for(j=0;j<5;j++) {
302       for(k=0;k<4;k++) {
303         int l;
304         for(l=0;l<4;l++) {
305           int n = l + k * 4 + j * 16 + i * 80;
306           n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12);
307         }
308       }
309     }
310   }
311   for(i=0;i<5;i++) {
312     for(j=0;j<5;j++) {
313       for(k=0;k<4;k++) {
314         int n = k + j * 4 + i * 20;
315         n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12);
316       }
317     }
318   }
319 }
320 
321 /*
322  * read additional side information
323  */
324 #ifdef MPEG1
III_get_side_info_1(struct III_sideinfo * si,int stereo,int ms_stereo,long sfreq,int single)325 static int III_get_side_info_1(struct III_sideinfo *si,int stereo,
326  int ms_stereo,long sfreq,int single)
327 {
328    int ch, gr;
329    int powdiff = (single == 3) ? 4 : 0;
330 
331    si->main_data_begin = getbits(9);
332    if (stereo == 1)
333      si->private_bits = getbits_fast(5);
334    else
335      si->private_bits = getbits_fast(3);
336 
337    for (ch=0; ch<stereo; ch++) {
338        si->ch[ch].gr[0].scfsi = -1;
339        si->ch[ch].gr[1].scfsi = getbits_fast(4);
340    }
341 
342    for (gr=0; gr<2; gr++)
343    {
344      for (ch=0; ch<stereo; ch++)
345      {
346        register struct gr_info_s *gr_infos = &(si->ch[ch].gr[gr]);
347 
348        gr_infos->part2_3_length = getbits(12);
349        gr_infos->big_values = getbits_fast(9);
350        if(gr_infos->big_values > 288) {
351 //          fprintf(stderr,"big_values too large! %i\n",gr_infos->big_values);
352           //gr_infos->big_values = 288;
353 		  return 0;
354        }
355        {
356 	 unsigned int qss = getbits_fast(8);
357      if ((unsigned char)qss > *maxGain) *maxGain = (unsigned char)qss;
358      if ((unsigned char)qss < *minGain) *minGain = (unsigned char)qss;
359 
360 	 gr_infos->pow2gain = gainpow2+256 - qss + powdiff;
361        }
362        if(ms_stereo)
363          gr_infos->pow2gain += 2;
364        gr_infos->scalefac_compress = getbits_fast(4);
365 /* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
366        if(get1bit())
367        {
368          int i;
369          gr_infos->block_type = getbits_fast(2);
370          gr_infos->mixed_block_flag = get1bit();
371          gr_infos->table_select[0] = getbits_fast(5);
372          gr_infos->table_select[1] = getbits_fast(5);
373 
374 
375          /*
376           * table_select[2] not needed, because there is no region2,
377           * but to satisfy some verifications tools we set it either.
378           */
379          gr_infos->table_select[2] = 0;
380          for(i=0;i<3;i++) {
381 	   unsigned int sbg = (getbits_fast(3)<<3);
382            gr_infos->full_gain[i] = gr_infos->pow2gain + sbg;
383 	 }
384 
385          if(gr_infos->block_type == 0) {
386 //           fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
387 		   return 0;
388 		   /* error seems to be very good recoverable, so don't exit */
389            /* exit(1); */
390          }
391          /* region_count/start parameters are implicit in this case. */
392          gr_infos->region1start = 36>>1;
393          gr_infos->region2start = 576>>1;
394        }
395        else
396        {
397          int i,r0c,r1c;
398          for (i=0; i<3; i++)
399            gr_infos->table_select[i] = getbits_fast(5);
400          r0c = getbits_fast(4);
401          r1c = getbits_fast(3);
402          gr_infos->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
403          gr_infos->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
404          gr_infos->block_type = 0;
405          gr_infos->mixed_block_flag = 0;
406        }
407        gr_infos->preflag = get1bit();
408        gr_infos->scalefac_scale = get1bit();
409        gr_infos->count1table_select = get1bit();
410      }
411    }
412    return 1;
413 }
414 #endif
415 
416 /*
417  * Side Info for MPEG 2.0 / LSF
418  */
III_get_side_info_2(struct III_sideinfo * si,int stereo,int ms_stereo,long sfreq,int single)419 static int III_get_side_info_2(struct III_sideinfo *si,int stereo,
420  int ms_stereo,long sfreq,int single)
421 {
422    int ch;
423    int powdiff = (single == 3) ? 4 : 0;
424 
425    si->main_data_begin = getbits(8);
426 
427    if (stereo == 1)
428      si->private_bits = get1bit();
429    else
430      si->private_bits = getbits_fast(2);
431 
432    for (ch=0; ch<stereo; ch++)
433    {
434        register struct gr_info_s *gr_infos = &(si->ch[ch].gr[0]);
435        unsigned int qss;
436 
437        gr_infos->part2_3_length = getbits(12);
438        gr_infos->big_values = getbits_fast(9);
439        if(gr_infos->big_values > 288) {
440 //         fprintf(stderr,"big_values too large! %i\n",gr_infos->big_values);
441          //gr_infos->big_values = 288;
442 		 return 0;
443        }
444        qss=getbits_fast(8);
445        if ((unsigned char)qss > *maxGain) *maxGain = (unsigned char)qss;
446        if ((unsigned char)qss < *minGain) *minGain = (unsigned char)qss;
447 
448        gr_infos->pow2gain = gainpow2+256 - qss + powdiff;
449 
450 
451        if(ms_stereo)
452          gr_infos->pow2gain += 2;
453        gr_infos->scalefac_compress = getbits(9);
454 /* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
455        if(get1bit())
456        {
457          int i;
458          gr_infos->block_type = getbits_fast(2);
459          gr_infos->mixed_block_flag = get1bit();
460          gr_infos->table_select[0] = getbits_fast(5);
461          gr_infos->table_select[1] = getbits_fast(5);
462          /*
463           * table_select[2] not needed, because there is no region2,
464           * but to satisfy some verifications tools we set it either.
465           */
466          gr_infos->table_select[2] = 0;
467          for(i=0;i<3;i++) {
468 	   unsigned int sbg = (getbits_fast(3)<<3);
469            gr_infos->full_gain[i] = gr_infos->pow2gain + sbg;
470 
471 	 }
472 
473          if(gr_infos->block_type == 0) {
474 //           fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
475 		   return 0;
476 		   /* error seems to be very good recoverable, so don't exit */
477            /* exit(1); */
478          }
479          /* region_count/start parameters are implicit in this case. */
480 /* check this again! */
481          if(gr_infos->block_type == 2)
482            gr_infos->region1start = 36>>1;
483          else if(sfreq == 8)
484 /* check this for 2.5 and sfreq=8 */
485            gr_infos->region1start = 108>>1;
486          else
487            gr_infos->region1start = 54>>1;
488          gr_infos->region2start = 576>>1;
489        }
490        else
491        {
492          int i,r0c,r1c;
493          for (i=0; i<3; i++)
494            gr_infos->table_select[i] = getbits_fast(5);
495          r0c = getbits_fast(4);
496          r1c = getbits_fast(3);
497          gr_infos->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
498          gr_infos->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
499          gr_infos->block_type = 0;
500          gr_infos->mixed_block_flag = 0;
501        }
502        gr_infos->scalefac_scale = get1bit();
503        gr_infos->count1table_select = get1bit();
504    }
505    return 1;
506 }
507 
508 /*
509  * read scalefactors
510  */
511 #ifdef MPEG1
III_get_scale_factors_1(int * scf,struct gr_info_s * gr_infos)512 static int III_get_scale_factors_1(int *scf,struct gr_info_s *gr_infos)
513 {
514    static const unsigned char slen[2][16] = {
515      {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
516      {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
517    };
518    int numbits;
519    int num0 = slen[0][gr_infos->scalefac_compress];
520    int num1 = slen[1][gr_infos->scalefac_compress];
521 
522     if (gr_infos->block_type == 2)
523     {
524       int i=18;
525       numbits = (num0 + num1) * 18;
526 
527       if (gr_infos->mixed_block_flag) {
528          for (i=8;i;i--)
529            *scf++ = getbits_fast(num0);
530          i = 9;
531          numbits -= num0; /* num0 * 17 + num1 * 18 */
532       }
533 
534       for (;i;i--)
535         *scf++ = getbits_fast(num0);
536       for (i = 18; i; i--)
537         *scf++ = getbits_fast(num1);
538       *scf++ = 0; *scf++ = 0; *scf++ = 0; /* short[13][0..2] = 0 */
539     }
540     else
541     {
542       int i;
543       int scfsi = gr_infos->scfsi;
544 
545       if(scfsi < 0) { /* scfsi < 0 => granule == 0 */
546          for(i=11;i;i--)
547            *scf++ = getbits_fast(num0);
548          for(i=10;i;i--)
549            *scf++ = getbits_fast(num1);
550          numbits = (num0 + num1) * 10 + num0;
551       }
552       else {
553         numbits = 0;
554         if(!(scfsi & 0x8)) {
555           for (i=6;i;i--)
556             *scf++ = getbits_fast(num0);
557           numbits += num0 * 6;
558         }
559         else {
560           scf += 6;
561         }
562 
563         if(!(scfsi & 0x4)) {
564           for (i=5;i;i--)
565             *scf++ = getbits_fast(num0);
566           numbits += num0 * 5;
567         }
568         else {
569           scf += 5;
570         }
571 
572         if(!(scfsi & 0x2)) {
573           for(i=5;i;i--)
574             *scf++ = getbits_fast(num1);
575           numbits += num1 * 5;
576         }
577         else {
578           scf += 5;
579         }
580 
581         if(!(scfsi & 0x1)) {
582           for (i=5;i;i--)
583             *scf++ = getbits_fast(num1);
584           numbits += num1 * 5;
585         }
586         else {
587           scf += 5;
588         }
589       }
590 
591       *scf++ = 0;  /* no l[21] in original sources */
592     }
593     return numbits;
594 }
595 #endif
596 
III_get_scale_factors_2(int * scf,struct gr_info_s * gr_infos,int i_stereo)597 static int III_get_scale_factors_2(int *scf,struct gr_info_s *gr_infos,int i_stereo)
598 {
599   unsigned char *pnt;
600   int i,j;
601   unsigned int slen;
602   int n = 0;
603   int numbits = 0;
604 
605   static const unsigned char stab[3][6][4] = {
606    { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} ,
607      { 7, 7, 7,0 } , { 6, 6, 6,3 } , {  8, 8,5,0} } ,
608    { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} ,
609      {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } ,
610    { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} ,
611      { 6,15,12,0 } , { 6,12, 9,6 } , {  6,18,9,0} } };
612 
613   if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */
614     slen = i_slen2[gr_infos->scalefac_compress>>1];
615   else
616     slen = n_slen2[gr_infos->scalefac_compress];
617 
618   gr_infos->preflag = (slen>>15) & 0x1;
619 
620   n = 0;
621   if( gr_infos->block_type == 2 ) {
622     n++;
623     if(gr_infos->mixed_block_flag)
624       n++;
625   }
626 
627   pnt = (unsigned char *)stab[n][(slen>>12)&0x7];
628 
629   for(i=0;i<4;i++) {
630     int num = slen & 0x7;
631     slen >>= 3;
632     if(num) {
633       for(j=0;j<(int)(pnt[i]);j++)
634         *scf++ = getbits_fast(num);
635       numbits += pnt[i] * num;
636     }
637     else {
638       for(j=0;j<(int)(pnt[i]);j++)
639         *scf++ = 0;
640     }
641   }
642 
643   n = (n << 1) + 1;
644   for(i=0;i<n;i++)
645     *scf++ = 0;
646 
647   return numbits;
648 }
649 
650 static const int pretab1 [22] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0}; /* char enough ? */
651 static const int pretab2 [22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
652 
653 /*
654  * don't forget to apply the same changes to III_dequantize_sample_ms() !!!
655  */
III_dequantize_sample(real xr[SBLIMIT][SSLIMIT],int * scf,struct gr_info_s * gr_infos,int sfreq,int part2bits)656 static int III_dequantize_sample(real xr[SBLIMIT][SSLIMIT],int *scf,
657    struct gr_info_s *gr_infos,int sfreq,int part2bits)
658 {
659   int shift = 1 + gr_infos->scalefac_scale;
660   real *xrpnt = (real *) xr;
661   int l[3],l3;
662   int part2remain = gr_infos->part2_3_length - part2bits;
663   int *me;
664 
665   {
666     int i;
667 
668     for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i>0;i--) {
669       *xrpnt++ = 0.0;
670       *xrpnt++ = 0.0;
671     }
672 
673     xrpnt = (real *) xr;
674   }
675 
676   {
677     int bv       = gr_infos->big_values;
678     int region1  = gr_infos->region1start;
679     int region2  = gr_infos->region2start;
680 
681     l3 = ((576>>1)-bv)>>1;
682 /*
683  * we may lose the 'odd' bit here !!
684  * check this later again
685  */
686     if(bv <= region1) {
687       l[0] = bv; l[1] = 0; l[2] = 0;
688     }
689     else {
690       l[0] = region1;
691       if(bv <= region2) {
692         l[1] = bv - l[0];  l[2] = 0;
693       }
694       else {
695         l[1] = region2 - l[0]; l[2] = bv - region2;
696       }
697     }
698   }
699 
700   if(gr_infos->block_type == 2) {
701     /*
702      * decoding with short or mixed mode BandIndex table
703      */
704     int i,max[4];
705     int step=0,lwin=0,cb=0;
706     register real v = 0.0;
707     register int *m,mc;
708 
709     if(gr_infos->mixed_block_flag) {
710       max[3] = -1;
711       max[0] = max[1] = max[2] = 2;
712       m = map[sfreq][0];
713       me = mapend[sfreq][0];
714     }
715     else {
716       max[0] = max[1] = max[2] = max[3] = -1;
717       /* max[3] not really needed in this case */
718       m = map[sfreq][1];
719       me = mapend[sfreq][1];
720     }
721 
722     mc = 0;
723     for(i=0;i<2;i++) {
724       int lp = l[i];
725       struct newhuff *h = (struct newhuff *)(ht+gr_infos->table_select[i]);
726       for(;lp;lp--,mc--) {
727         register int x,y;
728         if( (!mc) ) {
729           mc = *m++;
730           xrpnt = ((real *) xr) + (*m++);
731           lwin = *m++;
732           cb = *m++;
733           if(lwin == 3) {
734             v = gr_infos->pow2gain[(*scf++) << shift];
735             step = 1;
736           }
737           else {
738             v = gr_infos->full_gain[lwin][(*scf++) << shift];
739             step = 3;
740           }
741         }
742         {
743           register short *val = (short *)h->table;
744           while((y=*val++)<0) {
745             if (get1bit())
746               val -= y;
747             part2remain--;
748           }
749           x = y >> 4;
750           y &= 0xf;
751         }
752         if(x == 15) {
753           max[lwin] = cb;
754           part2remain -= h->linbits+1;
755           x += getbits((int)h->linbits);
756           if(get1bit())
757             *xrpnt = -ispow[x] * v;
758           else
759             *xrpnt =  ispow[x] * v;
760         }
761         else if(x) {
762           max[lwin] = cb;
763           if(get1bit())
764             *xrpnt = -ispow[x] * v;
765           else
766             *xrpnt =  ispow[x] * v;
767           part2remain--;
768         }
769         else
770           *xrpnt = 0.0;
771         xrpnt += step;
772         if(y == 15) {
773           max[lwin] = cb;
774           part2remain -= h->linbits+1;
775           y += getbits((int)h->linbits);
776           if(get1bit())
777             *xrpnt = -ispow[y] * v;
778           else
779             *xrpnt =  ispow[y] * v;
780         }
781         else if(y) {
782           max[lwin] = cb;
783           if(get1bit())
784             *xrpnt = -ispow[y] * v;
785           else
786             *xrpnt =  ispow[y] * v;
787           part2remain--;
788         }
789         else
790           *xrpnt = 0.0;
791         xrpnt += step;
792       }
793     }
794     for(;l3 && (part2remain > 0);l3--) {
795       struct newhuff *h = (struct newhuff *)(htc+gr_infos->count1table_select);
796       register short *val = (short *)h->table,a;
797 
798       while((a=*val++)<0) {
799         part2remain--;
800         if(part2remain < 0) {
801           part2remain++;
802           a = 0;
803           break;
804         }
805         if (get1bit())
806           val -= a;
807       }
808       for(i=0;i<4;i++) {
809         if(!(i & 1)) {
810           if(!mc) {
811             mc = *m++;
812             xrpnt = ((real *) xr) + (*m++);
813             lwin = *m++;
814             cb = *m++;
815             if(lwin == 3) {
816               v = gr_infos->pow2gain[(*scf++) << shift];
817               step = 1;
818             }
819             else {
820               v = gr_infos->full_gain[lwin][(*scf++) << shift];
821               step = 3;
822             }
823           }
824           mc--;
825         }
826         if( (a & (0x8>>i)) ) {
827           max[lwin] = cb;
828           part2remain--;
829           if(part2remain < 0) {
830             part2remain++;
831             break;
832           }
833           if(get1bit())
834             *xrpnt = -v;
835           else
836             *xrpnt = v;
837         }
838         else
839           *xrpnt = 0.0;
840         xrpnt += step;
841       }
842     }
843 
844     while( m < me ) {
845       if(!mc) {
846         mc = *m++;
847         xrpnt = ((real *) xr) + *m++;
848         if( (*m++) == 3)
849           step = 1;
850         else
851           step = 3;
852         m++; /* cb */
853       }
854       mc--;
855       *xrpnt = 0.0;
856       xrpnt += step;
857       *xrpnt = 0.0;
858       xrpnt += step;
859 /* we could add a little opt. here:
860  * if we finished a band for window 3 or a long band
861  * further bands could copied in a simple loop without a
862  * special 'map' decoding
863  */
864     }
865 
866     gr_infos->maxband[0] = max[0]+1;
867     gr_infos->maxband[1] = max[1]+1;
868     gr_infos->maxband[2] = max[2]+1;
869     gr_infos->maxbandl = max[3]+1;
870 
871     {
872       int rmax = max[0] > max[1] ? max[0] : max[1];
873       rmax = (rmax > max[2] ? rmax : max[2]) + 1;
874       gr_infos->maxb = rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3]+1];
875     }
876 
877   }
878   else {
879 	/*
880      * decoding with 'long' BandIndex table (block_type != 2)
881      */
882     int *pretab = (int *)(gr_infos->preflag ? pretab1 : pretab2);
883     int i,max = -1;
884     int cb = 0;
885     register int *m = map[sfreq][2];
886     register real v = 0.0;
887     register int mc = 0;
888 #if 0
889     me = mapend[sfreq][2];
890 #endif
891 
892 	/*
893      * long hash table values
894      */
895     for(i=0;i<3;i++) {
896       int lp = l[i];
897       struct newhuff *h = (struct newhuff *)(ht+gr_infos->table_select[i]);
898 
899       for(;lp;lp--,mc--) {
900         int x,y;
901 
902         if(!mc) {
903           mc = *m++;
904           v = gr_infos->pow2gain[((*scf++) + (*pretab++)) << shift];
905           cb = *m++;
906         }
907         {
908           register short *val = (short *)h->table;
909           while((y=*val++)<0) {
910             if (get1bit())
911               val -= y;
912             part2remain--;
913           }
914           x = y >> 4;
915           y &= 0xf;
916         }
917         if (x == 15) {
918           max = cb;
919           part2remain -= h->linbits+1;
920           x += getbits((int)h->linbits);
921           if(get1bit())
922             *xrpnt++ = -ispow[x] * v;
923           else
924             *xrpnt++ =  ispow[x] * v;
925         }
926         else if(x) {
927           max = cb;
928           if(get1bit())
929             *xrpnt++ = -ispow[x] * v;
930           else
931             *xrpnt++ =  ispow[x] * v;
932           part2remain--;
933         }
934         else
935           *xrpnt++ = 0.0;
936 
937         if (y == 15) {
938           max = cb;
939           part2remain -= h->linbits+1;
940           y += getbits((int)h->linbits);
941           if(get1bit())
942             *xrpnt++ = -ispow[y] * v;
943           else
944             *xrpnt++ =  ispow[y] * v;
945         }
946         else if(y) {
947           max = cb;
948           if(get1bit())
949             *xrpnt++ = -ispow[y] * v;
950           else
951             *xrpnt++ =  ispow[y] * v;
952           part2remain--;
953         }
954         else
955           *xrpnt++ = 0.0;
956       }
957     }
958 
959 	/*
960      * short (count1table) values
961      */
962     for(;l3 && (part2remain > 0);l3--) {
963       struct newhuff *h = (struct newhuff *)(htc+gr_infos->count1table_select);
964       register short *val = (short *)h->table,a;
965 
966       while((a=*val++)<0) {
967         part2remain--;
968         if(part2remain < 0) {
969           part2remain++;
970           a = 0;
971           break;
972         }
973         if (get1bit())
974           val -= a;
975       }
976       for(i=0;i<4;i++) {
977         if(!(i & 1)) {
978           if(!mc) {
979             mc = *m++;
980             cb = *m++;
981             v = gr_infos->pow2gain[((*scf++) + (*pretab++)) << shift];
982           }
983           mc--;
984         }
985         if ( (a & (0x8>>i)) ) {
986           max = cb;
987           part2remain--;
988           if(part2remain < 0) {
989             part2remain++;
990             break;
991           }
992           if(get1bit())
993             *xrpnt++ = -v;
994           else
995             *xrpnt++ = v;
996         }
997         else
998           *xrpnt++ = 0.0;
999       }
1000     }
1001 
1002 	/*
1003      * zero part
1004      */
1005     for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) {
1006       *xrpnt++ = 0.0;
1007       *xrpnt++ = 0.0;
1008     }
1009 
1010     gr_infos->maxbandl = max+1;
1011     gr_infos->maxb = longLimit[sfreq][gr_infos->maxbandl];
1012   }
1013 
1014   while( part2remain > 16 ) {
1015     getbits(16); /* Dismiss stuffing Bits */
1016     part2remain -= 16;
1017   }
1018   if(part2remain > 0)
1019     getbits(part2remain);
1020   else if(part2remain < 0) {
1021 //    fprintf(stderr,"mpg123: Can't rewind stream by %d bits!\n",-part2remain);
1022     return -1; /* -> error */
1023   }
1024   return 0;
1025 }
1026 
1027 
1028 /*
1029  * III_stereo: calculate real channel values for Joint-I-Stereo-mode
1030  */
III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int * scalefac,struct gr_info_s * gr_infos,int sfreq,int ms_stereo,int lsf)1031 static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,
1032    struct gr_info_s *gr_infos,int sfreq,int ms_stereo,int lsf)
1033 {
1034       real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf;
1035       struct bandInfoStruct *bi = (struct bandInfoStruct *)&bandInfo[sfreq];
1036       real *tabl1,*tabl2;
1037 
1038       if(lsf) {
1039         int p = gr_infos->scalefac_compress & 0x1;
1040 	    if(ms_stereo) {
1041           tabl1 = pow1_2[p]; tabl2 = pow2_2[p];
1042         }
1043         else {
1044           tabl1 = pow1_1[p]; tabl2 = pow2_1[p];
1045         }
1046       }
1047       else {
1048         if(ms_stereo) {
1049           tabl1 = tan1_2; tabl2 = tan2_2;
1050         }
1051         else {
1052           tabl1 = tan1_1; tabl2 = tan2_1;
1053         }
1054       }
1055 
1056       if (gr_infos->block_type == 2)
1057       {
1058          int lwin,do_l = 0;
1059          if( gr_infos->mixed_block_flag )
1060            do_l = 1;
1061 
1062          for (lwin=0;lwin<3;lwin++) /* process each window */
1063          {
1064              /* get first band with zero values */
1065            int is_p,sb,idx,sfb = gr_infos->maxband[lwin];  /* sfb is minimal 3 for mixed mode */
1066            if(sfb > 3)
1067              do_l = 0;
1068 
1069            for(;sfb<12;sfb++)
1070            {
1071              is_p = scalefac[sfb*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */
1072              if(is_p != 7) {
1073                real t1,t2;
1074                sb = bi->shortDiff[sfb];
1075                idx = bi->shortIdx[sfb] + lwin;
1076                t1 = tabl1[is_p]; t2 = tabl2[is_p];
1077                for (; sb > 0; sb--,idx+=3)
1078                {
1079                  real v = xr[0][idx];
1080                  xr[0][idx] = v * t1;
1081                  xr[1][idx] = v * t2;
1082                }
1083              }
1084            }
1085 
1086 #if 1
1087 /* in the original: copy 10 to 11 , here: copy 11 to 12
1088 maybe still wrong??? (copy 12 to 13?) */
1089            is_p = scalefac[11*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */
1090            sb = bi->shortDiff[12];
1091            idx = bi->shortIdx[12] + lwin;
1092 #else
1093            is_p = scalefac[10*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */
1094            sb = bi->shortDiff[11];
1095            idx = bi->shortIdx[11] + lwin;
1096 #endif
1097            if(is_p != 7)
1098            {
1099              real t1,t2;
1100              t1 = tabl1[is_p]; t2 = tabl2[is_p];
1101              for ( ; sb > 0; sb--,idx+=3 )
1102              {
1103                real v = xr[0][idx];
1104                xr[0][idx] = v * t1;
1105                xr[1][idx] = v * t2;
1106              }
1107            }
1108          } /* end for(lwin; .. ; . ) */
1109 
1110          if (do_l)
1111          {
1112 /* also check l-part, if ALL bands in the three windows are 'empty'
1113  * and mode = mixed_mode
1114  */
1115            int sfb = gr_infos->maxbandl;
1116            int idx = bi->longIdx[sfb];
1117 
1118            for ( ; sfb<8; sfb++ )
1119            {
1120              int sb = bi->longDiff[sfb];
1121              int is_p = scalefac[sfb]; /* scale: 0-15 */
1122              if(is_p != 7) {
1123                real t1,t2;
1124                t1 = tabl1[is_p]; t2 = tabl2[is_p];
1125                for ( ; sb > 0; sb--,idx++)
1126                {
1127                  real v = xr[0][idx];
1128                  xr[0][idx] = v * t1;
1129                  xr[1][idx] = v * t2;
1130                }
1131              }
1132              else
1133                idx += sb;
1134            }
1135          }
1136       }
1137       else /* ((gr_infos->block_type != 2)) */
1138       {
1139         int sfb = gr_infos->maxbandl;
1140         int is_p,idx = bi->longIdx[sfb];
1141         for ( ; sfb<21; sfb++)
1142         {
1143           int sb = bi->longDiff[sfb];
1144           is_p = scalefac[sfb]; /* scale: 0-15 */
1145           if(is_p != 7) {
1146             real t1,t2;
1147             t1 = tabl1[is_p]; t2 = tabl2[is_p];
1148             for ( ; sb > 0; sb--,idx++)
1149             {
1150                real v = xr[0][idx];
1151                xr[0][idx] = v * t1;
1152                xr[1][idx] = v * t2;
1153             }
1154           }
1155           else
1156             idx += sb;
1157         }
1158 
1159         is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */
1160         if(is_p != 7)
1161         {
1162           int sb;
1163           real t1 = tabl1[is_p],t2 = tabl2[is_p];
1164 
1165           for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ )
1166           {
1167             real v = xr[0][idx];
1168             xr[0][idx] = v * t1;
1169             xr[1][idx] = v * t2;
1170           }
1171         }
1172       } /* ... */
1173 }
1174 
III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s * gr_infos)1175 static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_infos)
1176 {
1177    int sblim;
1178 
1179    if(gr_infos->block_type == 2)
1180    {
1181       if(!gr_infos->mixed_block_flag)
1182         return;
1183       sblim = 1;
1184    }
1185    else {
1186      sblim = gr_infos->maxb-1;
1187    }
1188 
1189    /* 31 alias-reduction operations between each pair of sub-bands */
1190    /* with 8 butterflies between each pair                         */
1191 
1192    {
1193      int sb;
1194      real *xr1=(real *) xr[1];
1195 
1196      for(sb=sblim;sb;sb--,xr1+=10)
1197      {
1198        int ss;
1199        real *cs=aa_cs,*ca=aa_ca;
1200        real *xr2 = xr1;
1201 
1202        for(ss=7;ss>=0;ss--)
1203        {       /* upper and lower butterfly inputs */
1204          register real bu = *--xr2,bd = *xr1;
1205          *xr2   = (bu * (*cs)   ) - (bd * (*ca)   );
1206          *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) );
1207        }
1208      }
1209   }
1210 }
1211 
1212 /*
1213  DCT insipired by Jeff Tsay's DCT from the maplay package
1214  this is an optimized version with manual unroll.
1215 
1216  References:
1217  [1] S. Winograd: "On Computing the Discrete Fourier Transform",
1218      Mathematics of Computation, Volume 32, Number 141, January 1978,
1219      Pages 175-199
1220 */
1221 
dct36(real * inbuf,real * o1,real * o2,real * wintab,real * tsbuf)1222 static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf)
1223 {
1224   {
1225     register real *in = inbuf;
1226 
1227     in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14];
1228     in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11];
1229     in[11]+=in[10]; in[10]+=in[9];  in[9] +=in[8];
1230     in[8] +=in[7];  in[7] +=in[6];  in[6] +=in[5];
1231     in[5] +=in[4];  in[4] +=in[3];  in[3] +=in[2];
1232     in[2] +=in[1];  in[1] +=in[0];
1233 
1234     in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
1235     in[9] +=in[7];  in[7] +=in[5];  in[5] +=in[3];  in[3] +=in[1];
1236 
1237 
1238   {
1239 
1240 #define MACRO0(v) { \
1241     real tmp; \
1242     out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \
1243     out2[8-(v)] = tmp * w[26-(v)];  } \
1244     sum0 -= sum1; \
1245     ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \
1246     ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)];
1247 #define MACRO1(v) { \
1248 	real sum0,sum1; \
1249     sum0 = tmp1a + tmp2a; \
1250 	sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \
1251 	MACRO0(v); }
1252 #define MACRO2(v) { \
1253     real sum0,sum1; \
1254     sum0 = tmp2a - tmp1a; \
1255     sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \
1256 	MACRO0(v); }
1257 
1258     register const real *c = COS9;
1259     register real *out2 = o2;
1260 	register real *w = wintab;
1261 	register real *out1 = o1;
1262 	register real *ts = tsbuf;
1263 
1264     real ta33,ta66,tb33,tb66;
1265 
1266     ta33 = in[2*3+0] * c[3];
1267     ta66 = in[2*6+0] * c[6];
1268     tb33 = in[2*3+1] * c[3];
1269     tb66 = in[2*6+1] * c[6];
1270 
1271     {
1272       real tmp1a,tmp2a,tmp1b,tmp2b;
1273       tmp1a =             in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7];
1274       tmp1b =             in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7];
1275       tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8];
1276       tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8];
1277 
1278       MACRO1(0);
1279       MACRO2(8);
1280     }
1281 
1282     {
1283       real tmp1a,tmp2a,tmp1b,tmp2b;
1284       tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3];
1285       tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3];
1286       tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0];
1287       tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1];
1288 
1289       MACRO1(1);
1290       MACRO2(7);
1291     }
1292 
1293     {
1294       real tmp1a,tmp2a,tmp1b,tmp2b;
1295       tmp1a =             in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1];
1296       tmp1b =             in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1];
1297       tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4];
1298       tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4];
1299 
1300       MACRO1(2);
1301       MACRO2(6);
1302     }
1303 
1304     {
1305       real tmp1a,tmp2a,tmp1b,tmp2b;
1306       tmp1a =             in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5];
1307       tmp1b =             in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5];
1308       tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2];
1309       tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2];
1310 
1311       MACRO1(3);
1312       MACRO2(5);
1313     }
1314 
1315 	{
1316 		real sum0,sum1;
1317     	sum0 =  in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0];
1318     	sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4];
1319 		MACRO0(4);
1320 	}
1321   }
1322 
1323   }
1324 }
1325 
1326 /*
1327  * new DCT12
1328  */
dct12(real * in,real * rawout1,real * rawout2,register real * wi,register real * ts)1329 static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts)
1330 {
1331 #define DCT12_PART1 \
1332              in5 = in[5*3];  \
1333      in5 += (in4 = in[4*3]); \
1334      in4 += (in3 = in[3*3]); \
1335      in3 += (in2 = in[2*3]); \
1336      in2 += (in1 = in[1*3]); \
1337      in1 += (in0 = in[0*3]); \
1338                              \
1339      in5 += in3; in3 += in1; \
1340                              \
1341      in2 *= COS6_1; \
1342      in3 *= COS6_1; \
1343 
1344 #define DCT12_PART2 \
1345      in0 += in4 * COS6_2; \
1346                           \
1347      in4 = in0 + in2;     \
1348      in0 -= in2;          \
1349                           \
1350      in1 += in5 * COS6_2; \
1351                           \
1352      in5 = (in1 + in3) * tfcos12[0]; \
1353      in1 = (in1 - in3) * tfcos12[2]; \
1354                          \
1355      in3 = in4 + in5;    \
1356      in4 -= in5;         \
1357                          \
1358      in2 = in0 + in1;    \
1359      in0 -= in1;
1360 
1361 
1362    {
1363      real in0,in1,in2,in3,in4,in5;
1364      register real *out1 = rawout1;
1365      ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2];
1366      ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5];
1367 
1368      DCT12_PART1
1369 
1370      {
1371        real tmp0,tmp1 = (in0 - in4);
1372        {
1373          real tmp2 = (in1 - in5) * tfcos12[1];
1374          tmp0 = tmp1 + tmp2;
1375          tmp1 -= tmp2;
1376        }
1377        ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1];
1378        ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1];
1379        ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1];
1380        ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1];
1381      }
1382 
1383      DCT12_PART2
1384 
1385      ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0];
1386      ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0];
1387      ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2];
1388      ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2];
1389 
1390      ts[(6+0)*SBLIMIT]  = out1[6+0] + in0 * wi[0];
1391      ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0];
1392      ts[(6+2)*SBLIMIT]  = out1[6+2] + in4 * wi[2];
1393      ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2];
1394   }
1395 
1396   in++;
1397 
1398   {
1399      real in0,in1,in2,in3,in4,in5;
1400      register real *out2 = rawout2;
1401 
1402      DCT12_PART1
1403 
1404      {
1405        real tmp0,tmp1 = (in0 - in4);
1406        {
1407          real tmp2 = (in1 - in5) * tfcos12[1];
1408          tmp0 = tmp1 + tmp2;
1409          tmp1 -= tmp2;
1410        }
1411        out2[5-1] = tmp0 * wi[11-1];
1412        out2[0+1] = tmp0 * wi[6+1];
1413        ts[(12+1)*SBLIMIT] += tmp1 * wi[1];
1414        ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1];
1415      }
1416 
1417      DCT12_PART2
1418 
1419      out2[5-0] = in2 * wi[11-0];
1420      out2[0+0] = in2 * wi[6+0];
1421      out2[0+2] = in3 * wi[6+2];
1422      out2[5-2] = in3 * wi[11-2];
1423 
1424      ts[(12+0)*SBLIMIT] += in0 * wi[0];
1425      ts[(17-0)*SBLIMIT] += in0 * wi[5-0];
1426      ts[(12+2)*SBLIMIT] += in4 * wi[2];
1427      ts[(17-2)*SBLIMIT] += in4 * wi[5-2];
1428   }
1429 
1430   in++;
1431 
1432   {
1433      real in0,in1,in2,in3,in4,in5;
1434      register real *out2 = rawout2;
1435      out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0;
1436 
1437      DCT12_PART1
1438 
1439      {
1440        real tmp0,tmp1 = (in0 - in4);
1441        {
1442          real tmp2 = (in1 - in5) * tfcos12[1];
1443          tmp0 = tmp1 + tmp2;
1444          tmp1 -= tmp2;
1445        }
1446        out2[11-1] = tmp0 * wi[11-1];
1447        out2[6 +1] = tmp0 * wi[6+1];
1448        out2[0+1] += tmp1 * wi[1];
1449        out2[5-1] += tmp1 * wi[5-1];
1450      }
1451 
1452      DCT12_PART2
1453 
1454      out2[11-0] = in2 * wi[11-0];
1455      out2[6 +0] = in2 * wi[6+0];
1456      out2[6 +2] = in3 * wi[6+2];
1457      out2[11-2] = in3 * wi[11-2];
1458 
1459      out2[0+0] += in0 * wi[0];
1460      out2[5-0] += in0 * wi[5-0];
1461      out2[0+2] += in4 * wi[2];
1462      out2[5-2] += in4 * wi[5-2];
1463   }
1464 }
1465 
1466 /*
1467  * III_hybrid
1468  */
III_hybrid(PMPSTR mp,real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],int ch,struct gr_info_s * gr_infos)1469 static void III_hybrid( PMPSTR mp, real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],
1470    int ch,struct gr_info_s *gr_infos)
1471 {
1472    real *tspnt = (real *) tsOut;
1473    real (*block)[2][SBLIMIT*SSLIMIT] = mp->hybrid_block;
1474    int *blc = mp->hybrid_blc;
1475    real *rawout1,*rawout2;
1476    int bt;
1477    int sb = 0;
1478 
1479    {
1480      int b = blc[ch];
1481      rawout1=block[b][ch];
1482      b=-b+1;
1483      rawout2=block[b][ch];
1484      blc[ch] = b;
1485    }
1486 
1487 
1488    if(gr_infos->mixed_block_flag) {
1489      sb = 2;
1490      dct36(fsIn[0],rawout1,rawout2,win[0],tspnt);
1491      dct36(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1);
1492      rawout1 += 36; rawout2 += 36; tspnt += 2;
1493    }
1494 
1495    bt = gr_infos->block_type;
1496    if(bt == 2) {
1497      for (; sb<(int)gr_infos->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
1498        dct12(fsIn[sb],rawout1,rawout2,win[2],tspnt);
1499        dct12(fsIn[sb+1],rawout1+18,rawout2+18,win1[2],tspnt+1);
1500      }
1501    }
1502    else {
1503      for (; sb<(int)gr_infos->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
1504        dct36(fsIn[sb],rawout1,rawout2,win[bt],tspnt);
1505        dct36(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1);
1506      }
1507    }
1508 
1509    for(;sb<SBLIMIT;sb++,tspnt++) {
1510      int i;
1511      for(i=0;i<SSLIMIT;i++) {
1512        tspnt[i*SBLIMIT] = *rawout1++;
1513        *rawout2++ = 0.0;
1514      }
1515    }
1516 }
1517 
1518 /*
1519  * main layer3 handler
1520  */
1521 struct III_sideinfo sideinfo;
1522 
do_layer3_sideinfo(struct frame * fr)1523 int do_layer3_sideinfo(struct frame *fr)
1524 {
1525   int stereo = fr->stereo;
1526   int single = fr->single;
1527   int ms_stereo;
1528   int sfreq = fr->sampling_frequency;
1529   int granules;
1530   int ch,gr,databits;
1531 
1532   if(stereo == 1) { /* stream is mono */
1533     single = 0;
1534   }
1535 
1536   if(fr->mode == MPG_MD_JOINT_STEREO) {
1537     ms_stereo = fr->mode_ext & 0x2;
1538   }
1539   else
1540     ms_stereo = 0;
1541 
1542 
1543   if(fr->lsf) {
1544     granules = 1;
1545     if (!(III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single)))
1546 		return -32767;
1547   }
1548   else {
1549     granules = 2;
1550 #ifdef MPEG1
1551     if (!(III_get_side_info_1(&sideinfo,stereo,ms_stereo,sfreq,single)))
1552 		return -32767;
1553 #else
1554     fprintf(stderr,"Not supported\n");
1555 #endif
1556   }
1557 
1558   databits=0;
1559   for (gr=0 ; gr < granules ; ++gr) {
1560     for (ch=0; ch < stereo ; ++ch) {
1561       struct gr_info_s *gr_infos = &(sideinfo.ch[ch].gr[gr]);
1562       databits += gr_infos->part2_3_length;
1563     }
1564   }
1565   return databits-8*sideinfo.main_data_begin;
1566 }
1567 
1568 
1569 
do_layer3(PMPSTR mp,int * pcm_point)1570 int do_layer3( PMPSTR mp,int *pcm_point)
1571 {
1572   int gr, ch, ss,clip=0;
1573   int scalefacs[2][39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
1574   //  struct III_sideinfo sideinfo;
1575   struct frame *fr=&(mp->fr);
1576   int stereo = fr->stereo;
1577   int single = fr->single;
1578   int ms_stereo,i_stereo;
1579   int sfreq = fr->sampling_frequency;
1580   int stereo1,granules;
1581 
1582   if(set_pointer(mp, (int)sideinfo.main_data_begin) == MP3_ERR)
1583     return -32767;
1584 
1585   if(stereo == 1) { /* stream is mono */
1586     stereo1 = 1;
1587     single = 0;
1588   }
1589   else if(single >= 0) /* stream is stereo, but force to mono */
1590     stereo1 = 1;
1591   else
1592     stereo1 = 2;
1593 
1594   if(fr->mode == MPG_MD_JOINT_STEREO) {
1595     ms_stereo = fr->mode_ext & 0x2;
1596     i_stereo  = fr->mode_ext & 0x1;
1597   }
1598   else
1599     ms_stereo = i_stereo = 0;
1600 
1601 
1602   if(fr->lsf) {
1603     granules = 1;
1604   }
1605   else {
1606     granules = 2;
1607   }
1608 
1609 
1610   for (gr=0;gr<granules;gr++)
1611   {
1612     static real hybridIn[2][SBLIMIT][SSLIMIT];
1613     static real hybridOut[2][SSLIMIT][SBLIMIT];
1614 
1615     {
1616       struct gr_info_s *gr_infos = &(sideinfo.ch[0].gr[gr]);
1617       long part2bits;
1618 
1619       if(fr->lsf)
1620         part2bits = III_get_scale_factors_2(scalefacs[0],gr_infos,0);
1621       else {
1622 #ifdef MPEG1
1623         part2bits = III_get_scale_factors_1(scalefacs[0],gr_infos);
1624 #else
1625 	fprintf(stderr,"Not supported\n");
1626 #endif
1627       }
1628 
1629 
1630       if(III_dequantize_sample(hybridIn[0], scalefacs[0],gr_infos,sfreq,part2bits))
1631         return 0;
1632     }
1633     if(stereo == 2) {
1634       struct gr_info_s *gr_infos = &(sideinfo.ch[1].gr[gr]);
1635       long part2bits;
1636       if(fr->lsf)
1637         part2bits = III_get_scale_factors_2(scalefacs[1],gr_infos,i_stereo);
1638       else {
1639 #ifdef MPEG1
1640         part2bits = III_get_scale_factors_1(scalefacs[1],gr_infos);
1641 #else
1642 	fprintf(stderr,"Not supported\n");
1643 #endif
1644       }
1645 
1646       if(III_dequantize_sample(hybridIn[1],scalefacs[1],gr_infos,sfreq,part2bits))
1647           return 0;
1648 
1649       if(ms_stereo) {
1650         int i;
1651         for(i=0;i<SBLIMIT*SSLIMIT;i++) {
1652           real tmp0,tmp1;
1653           tmp0 = ((real *) hybridIn[0])[i];
1654           tmp1 = ((real *) hybridIn[1])[i];
1655           ((real *) hybridIn[1])[i] = tmp0 - tmp1;
1656           ((real *) hybridIn[0])[i] = tmp0 + tmp1;
1657         }
1658       }
1659 
1660       if(i_stereo)
1661         III_i_stereo(hybridIn,scalefacs[1],gr_infos,sfreq,ms_stereo,fr->lsf);
1662 
1663       if(ms_stereo || i_stereo || (single == 3) ) {
1664         if(gr_infos->maxb > sideinfo.ch[0].gr[gr].maxb)
1665           sideinfo.ch[0].gr[gr].maxb = gr_infos->maxb;
1666         else
1667           gr_infos->maxb = sideinfo.ch[0].gr[gr].maxb;
1668       }
1669 
1670       switch(single) {
1671         case 3:
1672           {
1673             register int i;
1674             register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
1675             for(i=0;i<(int)(SSLIMIT*gr_infos->maxb);i++,in0++)
1676               *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */
1677           }
1678           break;
1679         case 1:
1680           {
1681             register int i;
1682             register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
1683             for(i=0;i<(int)(SSLIMIT*gr_infos->maxb);i++)
1684               *in0++ = *in1++;
1685           }
1686           break;
1687       }
1688     }
1689 
1690 
1691 
1692     for(ch=0;ch<stereo1;ch++) {
1693       struct gr_info_s *gr_infos = &(sideinfo.ch[ch].gr[gr]);
1694       III_antialias(hybridIn[ch],gr_infos);
1695       III_hybrid(mp, hybridIn[ch], hybridOut[ch], ch,gr_infos);
1696     }
1697 
1698     for(ss=0;ss<SSLIMIT;ss++) {
1699       if(single >= 0) {
1700         clip += synth_1to1_mono(mp, hybridOut[0][ss],pcm_point);
1701       }
1702       else {
1703         int p1 = *pcm_point;
1704         clip += synth_1to1(mp, hybridOut[0][ss],0,&p1);
1705         clip += synth_1to1(mp, hybridOut[1][ss],1,pcm_point);
1706       }
1707     }
1708   }
1709 
1710   return 0;
1711 }
1712 
1713