mpeglayer3.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:48k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* MPEG/WAVE Sound library
  2.    (C) 1997 by Jung woo-jae */
  3. // Mpeglayer3.cc
  4. // It's for MPEG Layer 3
  5. // I've made array of superior functions for speed.
  6. // Extend TO_FOUR_THIRDS to negative.
  7. // Bug fix : maplay 1.2+ have wrong TO_FOUR_THIRDS ranges.
  8. // Force to mono!!
  9. // MPEG-2 is implemented
  10. // Speed up in fixstereo (maybe buggy) 
  11. #ifdef HAVE_CONFIG_H
  12. #include "config.h"
  13. #endif
  14. #include <math.h>
  15. #include <stdlib.h>
  16. #include <stdio.h>
  17. #include "MPEGaudio.h"
  18. #if defined(_WIN32) && defined(_MSC_VER)
  19. // disable warnings about double to float conversions
  20. #pragma warning(disable: 4244 4305)
  21. #endif
  22. inline void Mpegbitwindow::wrap(void)
  23. {
  24.   int p=bitindex>>3;
  25.   point&=(WINDOWSIZE-1);
  26.   if(p>=point)
  27.   {
  28.     for(register int i=4;i<point;i++)
  29.       buffer[WINDOWSIZE+i]=buffer[i];
  30.   }
  31.   *((int *)(buffer+WINDOWSIZE))=*((int *)buffer);
  32. }
  33. #define MUL3(a) (((a)<<1)+(a))
  34. #define REAL0 0
  35. #define ARRAYSIZE (SBLIMIT*SSLIMIT)
  36. #define REALSIZE (sizeof(REAL))
  37. #ifdef PI
  38. #undef PI
  39. #endif
  40. #define PI     3.141593
  41. #define PI_12  (PI/12.0)
  42. #define PI_18  (PI/18.0)
  43. #define PI_24  (PI/24.0)
  44. #define PI_36  (PI/36.0)
  45. #define PI_72  (PI/72.0)
  46. #ifdef NATIVE_ASSEMBLY
  47. inline void long_memset(void * s,unsigned int c,int count)
  48. {
  49. __asm__ __volatile__(
  50.   "cldnt"
  51.   "rep ; stoslnt"
  52.   : /* no output */
  53.   :"a" (c), "c" (count/4), "D" ((long) s)
  54.   :"cx","di","memory");
  55. }
  56. #endif
  57. #define FOURTHIRDSTABLENUMBER (1<<13)
  58. static REAL two_to_negative_half_pow[40];
  59. static REAL TO_FOUR_THIRDSTABLE[FOURTHIRDSTABLENUMBER*2];
  60. static REAL POW2[256];
  61. static REAL POW2_1[8][2][16];
  62. static REAL ca[8],cs[8];
  63. static REAL cos1_6=cos(PI/6.0*1.0);
  64. static REAL cos2_6=cos(PI/6.0*2.0);
  65. static REAL win[4][36];
  66. static REAL cos_18[9];
  67. static REAL hsec_36[9],hsec_12[3];
  68. typedef struct
  69. {
  70.   REAL l,r;
  71. }RATIOS;
  72. static RATIOS rat_1[16],rat_2[2][64];
  73. void MPEGaudio::layer3initialize(void)
  74. {
  75.   static bool initializedlayer3=false;
  76.   register int i;
  77.   int j,k,l;
  78. #if 0
  79. double td = 0.0;
  80. printf( "%fn", td );
  81.     //pow( 0.0, 1.333333 );
  82. printf( "An" );
  83.     pow( td, 1.333333 );
  84. printf( "Bn" );
  85. #endif
  86.   layer3framestart=0;
  87.   currentprevblock=0;
  88.   {
  89.     for(l=0;l<2;l++)
  90.       for(i=0;i<2;i++)
  91. for(j=0;j<SBLIMIT;j++)
  92.   for(k=0;k<SSLIMIT;k++)
  93.     prevblck[l][i][j][k]=0.0f;
  94.   }
  95.   bitwindow.initialize();
  96.   if(initializedlayer3)return;
  97.   // Calculate win
  98.   {
  99.     for(i=0;i<18;i++)
  100.       win[0][i]=win[1][i]=0.5*sin(PI_72*(double)(2*i+1))/cos(PI_72*(double)(2*i+19));
  101.     for(;i<36;i++)
  102.       win[0][i]=win[3][i]=0.5*sin(PI_72*(double)(2*i+1))/cos(PI_72*(double)(2*i+19));
  103.     for(i=0;i<6;i++)
  104.     {
  105.       win[1][i+18]=0.5/cos(PI_72*(double)(2*(i+18)+19));
  106.       win[3][i+12]=0.5/cos(PI_72*(double)(2*(i+12)+19));
  107.       win[1][i+24]=0.5*sin(PI_24*(double)(2*i+13))/cos(PI_72*(double)(2*(i+24)+19));
  108.       win[1][i+30]=win[3][i]=0.0;
  109.       win[3][i+6 ]=0.5*sin(PI_24*(double)(2*i+1))/cos(PI_72*(double)(2*(i+6)+19));
  110.     }
  111.     for(i=0;i<12;i++)
  112.       win[2][i]=0.5*sin(PI_24*(double)(2*i+1))/cos(PI_24*(double)(2*i+7));
  113.   }
  114.   for(i=0;i<9;i++)
  115.     cos_18[i]=cos(PI_18*double(i));
  116.   for(i=0;i<9;i++)
  117.     hsec_36[i]=0.5/cos(PI_36*double(i*2+1));
  118.   for(i=0;i<3;i++)
  119.     hsec_12[i]=0.5/cos(PI_12*double(i*2+1));
  120.   for(i=0;i<40;i++)
  121.     two_to_negative_half_pow[i]=(REAL)pow(2.0,-0.5*(double)i);
  122.   {
  123.     REAL *TO_FOUR_THIRDS=TO_FOUR_THIRDSTABLE+FOURTHIRDSTABLENUMBER;
  124. //KR
  125.     for( i = 0; i < FOURTHIRDSTABLENUMBER; i++ )
  126. {
  127.       TO_FOUR_THIRDS[-i]= -(TO_FOUR_THIRDS[i] = (REAL)pow((double)i,4.0/3.0));
  128. }
  129.   }
  130.   for(i=0;i<256;i++)POW2[i]=(REAL)pow(2.0,(0.25*(i-210.0)));
  131.   for(i=0;i<8;i++)
  132.     for(j=0;j<2;j++)
  133.       for(k=0;k<16;k++)POW2_1[i][j][k]=pow(2.0,(-2.0*i)-(0.5*(1.0+j)*k));
  134.   {
  135.     static REAL TAN12[16]=
  136.     { 0.0,        0.26794919, 0.57735027  , 1.0,
  137.       1.73205081, 3.73205081, 9.9999999e10,-3.73205081,
  138.       -1.73205081,-1.01,      -0.57735027,  -0.26794919,
  139.       0.0,        0.26794919, 0.57735027,   1.0};
  140.     for(i=0;i<16;i++)
  141.     {
  142.       rat_1[i].l=TAN12[i]/(1.0+TAN12[i]);
  143.       rat_1[i].r=1.0/(1.0+TAN12[i]);
  144.     }
  145.   }
  146. #define IO0 ((double)0.840896415256)
  147. #define IO1 ((double)0.707106781188)
  148.   rat_2[0][0].l=rat_2[0][0].r=
  149.   rat_2[1][0].l=rat_2[1][0].r=1.;
  150.   for(i=1;i<64;i++)
  151.     if((i%2)==1)
  152.     {
  153.       rat_2[0][i].l=pow(IO0,(i+1)/2);
  154.       rat_2[1][i].l=pow(IO1,(i+1)/2);
  155.       rat_2[0][i].r=
  156.       rat_2[1][i].r=1.;
  157.     }
  158.     else
  159.     {
  160.       rat_2[0][i].l=
  161.       rat_2[1][i].l=1.;
  162.       rat_2[0][i].r=pow(IO0,i/2);
  163.       rat_2[1][i].r=pow(IO1,i/2);
  164.     }
  165.   {
  166.     static REAL Ci[8]=
  167.     {-0.6f,-0.535f,-0.33f,-0.185f,-0.095f,-0.041f,-0.0142f,-0.0037f};
  168.     REAL sq;
  169.     for(int i=0;i<8;i++)
  170.     {
  171.       sq=sqrt(1.0f+Ci[i]*Ci[i]);
  172.       cs[i]=1.0f/sq;
  173.       ca[i]=Ci[i]*cs[i];
  174.     }
  175.   }
  176.   initializedlayer3=true;
  177. }
  178. bool MPEGaudio::layer3getsideinfo(void)
  179. {
  180.   sideinfo.main_data_begin=getbits(9);
  181.   if(!inputstereo)sideinfo.private_bits=getbits(5);
  182.   else sideinfo.private_bits=getbits(3);
  183.   
  184.     sideinfo.ch[LS].scfsi[0]=getbit();
  185.     sideinfo.ch[LS].scfsi[1]=getbit();
  186.     sideinfo.ch[LS].scfsi[2]=getbit();
  187.     sideinfo.ch[LS].scfsi[3]=getbit();
  188.   if(inputstereo)
  189.   {
  190.     sideinfo.ch[RS].scfsi[0]=getbit();
  191.     sideinfo.ch[RS].scfsi[1]=getbit();
  192.     sideinfo.ch[RS].scfsi[2]=getbit();
  193.     sideinfo.ch[RS].scfsi[3]=getbit();
  194.   }
  195.   for(int gr=0,ch;gr<2;gr++)
  196.     for(ch=0;;ch++)
  197.     {
  198.       layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]);
  199.       gi->part2_3_length       =getbits(12);
  200.       gi->big_values           =getbits(9);
  201.       gi->global_gain          =getbits(8);
  202.       gi->scalefac_compress    =getbits(4);
  203.       gi->window_switching_flag=getbit();
  204.       if(gi->window_switching_flag)
  205.       {
  206. gi->block_type      =getbits(2);
  207. gi->mixed_block_flag=getbit();
  208. gi->table_select[0] =getbits(5);
  209. gi->table_select[1] =getbits(5);
  210. gi->subblock_gain[0]=getbits(3);
  211. gi->subblock_gain[1]=getbits(3);
  212. gi->subblock_gain[2]=getbits(3);
  213. /* Set region_count parameters since they are implicit in this case. */
  214. if(gi->block_type==0)
  215. {
  216.   /* printf("Side info bad: block_type == 0 in split block.n");
  217.      exit(0); */
  218.   return false;
  219. }
  220. else if (gi->block_type==2 && gi->mixed_block_flag==0)
  221.      gi->region0_count=8; /* MI 9; */
  222. else gi->region0_count=7; /* MI 8; */
  223. gi->region1_count=20-(gi->region0_count);
  224.       }
  225.       else
  226.       {
  227. gi->table_select[0] =getbits(5);
  228. gi->table_select[1] =getbits(5);
  229. gi->table_select[2] =getbits(5);
  230. gi->region0_count   =getbits(4);
  231. gi->region1_count   =getbits(3);
  232. gi->block_type      =0;
  233. gi->mixed_block_flag = 0;
  234.       }
  235.       gi->preflag           =getbit();
  236.       gi->scalefac_scale    =getbit();
  237.       gi->count1table_select=getbit();
  238.       gi->generalflag=gi->window_switching_flag && (gi->block_type==2);
  239.       if(!inputstereo || ch)break;
  240.     }
  241.   return true;
  242. }
  243. bool MPEGaudio::layer3getsideinfo_2(void)
  244. {
  245.   sideinfo.main_data_begin=getbits(8);
  246.   if(!inputstereo)sideinfo.private_bits=getbit();
  247.   else sideinfo.private_bits=getbits(2);
  248.   
  249.   for(int ch=0;;ch++)
  250.   {
  251.     layer3grinfo *gi=&(sideinfo.ch[ch].gr[0]);
  252.     gi->part2_3_length       =getbits(12);
  253.     gi->big_values           =getbits(9);
  254.     gi->global_gain          =getbits(8);
  255.     gi->scalefac_compress    =getbits(9);
  256.     gi->window_switching_flag=getbit();
  257.     if(gi->window_switching_flag)
  258.     {
  259.       gi->block_type      =getbits(2);
  260.       gi->mixed_block_flag=getbit();
  261.       gi->table_select[0] =getbits(5);
  262.       gi->table_select[1] =getbits(5);
  263.       gi->subblock_gain[0]=getbits(3);
  264.       gi->subblock_gain[1]=getbits(3);
  265.       gi->subblock_gain[2]=getbits(3);
  266.       /* Set region_count parameters since they are implicit in this case. */
  267.       if(gi->block_type==0)
  268.       {
  269. /* printf("Side info bad: block_type == 0 in split block.n");
  270.    exit(0); */
  271. return false;
  272.       }
  273.       else if (gi->block_type==2 && gi->mixed_block_flag==0)
  274. gi->region0_count=8; /* MI 9; */
  275.       else gi->region0_count=7; /* MI 8; */
  276.       gi->region1_count=20-(gi->region0_count);
  277.     }
  278.     else
  279.     {
  280.       gi->table_select[0] =getbits(5);
  281.       gi->table_select[1] =getbits(5);
  282.       gi->table_select[2] =getbits(5);
  283.       gi->region0_count   =getbits(4);
  284.       gi->region1_count   =getbits(3);
  285.       gi->block_type      =0;
  286.       gi->mixed_block_flag = 0;
  287.     }
  288.     gi->scalefac_scale    =getbit();
  289.     gi->count1table_select=getbit();
  290.     
  291.     gi->generalflag=gi->window_switching_flag && (gi->block_type==2);
  292.     
  293.     if(!inputstereo || ch)break;
  294.   }
  295.   return true;
  296. }
  297. void MPEGaudio::layer3getscalefactors(int ch,int gr)
  298. {
  299.   static int slen[2][16]={{0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
  300.   {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}};
  301.   layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]);
  302.   register layer3scalefactor *sf=(&scalefactors[ch]);
  303.   int l0,l1;
  304.   {
  305.     int scale_comp=gi->scalefac_compress;
  306.     l0=slen[0][scale_comp];
  307.     l1=slen[1][scale_comp];
  308.   }  
  309.   if(gi->generalflag)
  310.   {
  311.     if(gi->mixed_block_flag)
  312.     {                                 /* MIXED */ /* NEW-ag 11/25 */
  313.       sf->l[0]=wgetbits9(l0);sf->l[1]=wgetbits9(l0);
  314.       sf->l[2]=wgetbits9(l0);sf->l[3]=wgetbits9(l0);
  315.       sf->l[4]=wgetbits9(l0);sf->l[5]=wgetbits9(l0);
  316.       sf->l[6]=wgetbits9(l0);sf->l[7]=wgetbits9(l0);
  317.       sf->s[0][ 3]=wgetbits9(l0);sf->s[1][ 3]=wgetbits9(l0);
  318.       sf->s[2][ 3]=wgetbits9(l0);
  319.       sf->s[0][ 4]=wgetbits9(l0);sf->s[1][ 4]=wgetbits9(l0);
  320.       sf->s[2][ 4]=wgetbits9(l0);
  321.       sf->s[0][ 5]=wgetbits9(l0);sf->s[1][ 5]=wgetbits9(l0);
  322.       sf->s[2][ 5]=wgetbits9(l0);
  323.       sf->s[0][ 6]=wgetbits9(l1);sf->s[1][ 6]=wgetbits9(l1);
  324.       sf->s[2][ 6]=wgetbits9(l1);
  325.       sf->s[0][ 7]=wgetbits9(l1);sf->s[1][ 7]=wgetbits9(l1);
  326.       sf->s[2][ 7]=wgetbits9(l1);
  327.       sf->s[0][ 8]=wgetbits9(l1);sf->s[1][ 8]=wgetbits9(l1);
  328.       sf->s[2][ 8]=wgetbits9(l1);
  329.       sf->s[0][ 9]=wgetbits9(l1);sf->s[1][ 9]=wgetbits9(l1);
  330.       sf->s[2][ 9]=wgetbits9(l1);
  331.       sf->s[0][10]=wgetbits9(l1);sf->s[1][10]=wgetbits9(l1);
  332.       sf->s[2][10]=wgetbits9(l1);
  333.       sf->s[0][11]=wgetbits9(l1);sf->s[1][11]=wgetbits9(l1);
  334.       sf->s[2][11]=wgetbits9(l1);
  335.       sf->s[0][12]=sf->s[1][12]=sf->s[2][12]=0;
  336.     }
  337.     else 
  338.     {  /* SHORT*/
  339.       sf->s[0][ 0]=wgetbits9(l0);sf->s[1][ 0]=wgetbits9(l0);
  340.       sf->s[2][ 0]=wgetbits9(l0);
  341.       sf->s[0][ 1]=wgetbits9(l0);sf->s[1][ 1]=wgetbits9(l0);
  342.       sf->s[2][ 1]=wgetbits9(l0);
  343.       sf->s[0][ 2]=wgetbits9(l0);sf->s[1][ 2]=wgetbits9(l0);
  344.       sf->s[2][ 2]=wgetbits9(l0);
  345.       sf->s[0][ 3]=wgetbits9(l0);sf->s[1][ 3]=wgetbits9(l0);
  346.       sf->s[2][ 3]=wgetbits9(l0);
  347.       sf->s[0][ 4]=wgetbits9(l0);sf->s[1][ 4]=wgetbits9(l0);
  348.       sf->s[2][ 4]=wgetbits9(l0);
  349.       sf->s[0][ 5]=wgetbits9(l0);sf->s[1][ 5]=wgetbits9(l0);
  350.       sf->s[2][ 5]=wgetbits9(l0);
  351.       sf->s[0][ 6]=wgetbits9(l1);sf->s[1][ 6]=wgetbits9(l1);
  352.       sf->s[2][ 6]=wgetbits9(l1);
  353.       sf->s[0][ 7]=wgetbits9(l1);sf->s[1][ 7]=wgetbits9(l1);
  354.       sf->s[2][ 7]=wgetbits9(l1);
  355.       sf->s[0][ 8]=wgetbits9(l1);sf->s[1][ 8]=wgetbits9(l1);
  356.       sf->s[2][ 8]=wgetbits9(l1);
  357.       sf->s[0][ 9]=wgetbits9(l1);sf->s[1][ 9]=wgetbits9(l1);
  358.       sf->s[2][ 9]=wgetbits9(l1);
  359.       sf->s[0][10]=wgetbits9(l1);sf->s[1][10]=wgetbits9(l1);
  360.       sf->s[2][10]=wgetbits9(l1);
  361.       sf->s[0][11]=wgetbits9(l1);sf->s[1][11]=wgetbits9(l1);
  362.       sf->s[2][11]=wgetbits9(l1);
  363.       sf->s[0][12]=sf->s[1][12]=sf->s[2][12]=0;
  364.     }
  365.   }
  366.   else
  367.   {   /* LONG types 0,1,3 */
  368.     if(gr==0)
  369.     {
  370.       sf->l[ 0]=wgetbits9(l0);sf->l[ 1]=wgetbits9(l0);
  371.       sf->l[ 2]=wgetbits9(l0);sf->l[ 3]=wgetbits9(l0);
  372.       sf->l[ 4]=wgetbits9(l0);sf->l[ 5]=wgetbits9(l0);
  373.       sf->l[ 6]=wgetbits9(l0);sf->l[ 7]=wgetbits9(l0);
  374.       sf->l[ 8]=wgetbits9(l0);sf->l[ 9]=wgetbits9(l0);
  375.       sf->l[10]=wgetbits9(l0);
  376.       sf->l[11]=wgetbits9(l1);sf->l[12]=wgetbits9(l1);
  377.       sf->l[13]=wgetbits9(l1);sf->l[14]=wgetbits9(l1);
  378.       sf->l[15]=wgetbits9(l1);
  379.       sf->l[16]=wgetbits9(l1);sf->l[17]=wgetbits9(l1);
  380.       sf->l[18]=wgetbits9(l1);sf->l[19]=wgetbits9(l1);
  381.       sf->l[20]=wgetbits9(l1);
  382.     }
  383.     else
  384.     {
  385.       if(sideinfo.ch[ch].scfsi[0]==0)
  386.       {
  387. sf->l[ 0]=wgetbits9(l0);sf->l[ 1]=wgetbits9(l0);
  388. sf->l[ 2]=wgetbits9(l0);sf->l[ 3]=wgetbits9(l0);
  389. sf->l[ 4]=wgetbits9(l0);sf->l[ 5]=wgetbits9(l0);
  390.       }
  391.       if(sideinfo.ch[ch].scfsi[1]==0)
  392.       {
  393. sf->l[ 6]=wgetbits9(l0);sf->l[ 7]=wgetbits9(l0);
  394. sf->l[ 8]=wgetbits9(l0);sf->l[ 9]=wgetbits9(l0);
  395. sf->l[10]=wgetbits9(l0);
  396.       }
  397.       if(sideinfo.ch[ch].scfsi[2]==0)
  398.       {
  399. sf->l[11]=wgetbits9(l1);sf->l[12]=wgetbits9(l1);
  400. sf->l[13]=wgetbits9(l1);sf->l[14]=wgetbits9(l1);
  401. sf->l[15]=wgetbits9(l1);
  402.       }
  403.       if(sideinfo.ch[ch].scfsi[3]==0)
  404.       {
  405. sf->l[16]=wgetbits9(l1);sf->l[17]=wgetbits9(l1);
  406. sf->l[18]=wgetbits9(l1);sf->l[19]=wgetbits9(l1);
  407. sf->l[20]=wgetbits9(l1);
  408.       }
  409.     }
  410.     sf->l[21]=sf->l[22]=0;
  411.   }
  412. }
  413. void MPEGaudio::layer3getscalefactors_2(int ch)
  414. {
  415.   static int sfbblockindex[6][3][4]=
  416.   {
  417.     {{ 6, 5, 5, 5},{ 9, 9, 9, 9},{ 6, 9, 9, 9}},
  418.     {{ 6, 5, 7, 3},{ 9, 9,12, 6},{ 6, 9,12, 6}},
  419.     {{11,10, 0, 0},{18,18, 0, 0},{15,18, 0, 0}},
  420.     {{ 7, 7, 7, 0},{12,12,12, 0},{ 6,15,12, 0}},
  421.     {{ 6, 6, 6, 3},{12, 9, 9, 6},{ 6,12, 9, 6}},
  422.     {{ 8, 8, 5, 0},{15,12, 9, 0},{ 6,18, 9, 0}}
  423.   };
  424.   int sb[54];
  425.   layer3grinfo *gi=&(sideinfo.ch[ch].gr[0]);
  426.   register layer3scalefactor *sf=(&scalefactors[ch]);
  427.   {
  428.     int blocktypenumber,sc;
  429.     int blocknumber;
  430.     int slen[4];
  431.     if(gi->block_type==2)blocktypenumber=1+gi->mixed_block_flag;
  432.     else blocktypenumber=0;
  433.     sc=gi->scalefac_compress;
  434.     if(!((extendedmode==1 || extendedmode==3) && (ch==1)))
  435.     {
  436.       if(sc<400)
  437.       {
  438. slen[0]=(sc>>4)/5;
  439. slen[1]=(sc>>4)%5;
  440. slen[2]=(sc%16)>>2;
  441. slen[3]=(sc%4);
  442. gi->preflag=0;
  443. blocknumber=0;
  444.       }
  445.       else if(sc<500)
  446.       {
  447. sc-=400;
  448. slen[0]=(sc>>2)/5;
  449. slen[1]=(sc>>2)%5;
  450. slen[2]=sc%4;
  451. slen[3]=0;
  452. gi->preflag=0;
  453. blocknumber=1;
  454.       }
  455.       else // if(sc<512)
  456.       {
  457. sc-=500;
  458. slen[0]=sc/3;
  459. slen[1]=sc%3;
  460. slen[2]=0;
  461. slen[3]=0;
  462. gi->preflag=1;
  463. blocknumber=2;
  464.       }
  465.     }
  466.     else
  467.     {
  468.       sc>>=1;
  469.       if(sc<180)
  470.       {
  471. slen[0]=sc/36;
  472. slen[1]=(sc%36)/6;
  473. slen[2]=(sc%36)%6;
  474. slen[3]=0;
  475. gi->preflag=0;
  476. blocknumber=3;
  477.       }
  478.       else if(sc<244)
  479.       {
  480. sc-=180;
  481. slen[0]=(sc%64)>>4;
  482. slen[1]=(sc%16)>>2;
  483. slen[2]=sc%4;
  484. slen[3]=0;
  485. gi->preflag=0;
  486. blocknumber=4;
  487.       }
  488.       else // if(sc<255)
  489.       {
  490. sc-=244;
  491. slen[0]=sc/3;
  492. slen[1]=sc%3;
  493. slen[2]=
  494. slen[3]=0;
  495. gi->preflag=0;
  496. blocknumber=5;
  497.       }
  498.     }
  499.     {
  500.       int i,j,k,*si;
  501.       si=sfbblockindex[blocknumber][blocktypenumber];
  502.       for(i=0;i<45;i++)sb[i]=0;
  503.       for(k=i=0;i<4;i++)
  504. for(j=0;j<si[i];j++,k++)
  505.   if(slen[i]==0)sb[k]=0;
  506.   else sb[k]=wgetbits(slen[i]);
  507.     }
  508.   }
  509.   {
  510.     int sfb,window;
  511.     int k=0;
  512.     if(gi->window_switching_flag && (gi->block_type==2))
  513.     {
  514.       if(gi->mixed_block_flag)
  515.       {
  516. for(sfb=0;sfb<8;sfb++)sf->l[sfb]=sb[k++];
  517. sfb=3;
  518.       }
  519.       else sfb=0;
  520.       for(;sfb<12;sfb++)
  521. for(window=0;window<3;window++)
  522.   sf->s[window][sfb]=sb[k++];
  523.       sf->s[0][12]=sf->s[1][12]=sf->s[2][12]=0;
  524.     }
  525.     else
  526.     {
  527.       for(sfb=0;sfb<21;sfb++)
  528. sf->l[sfb]=sb[k++];
  529.       sf->l[21]=sf->l[22]=0;
  530.     }
  531.   }
  532. }
  533. typedef unsigned int HUFFBITS;
  534. #define MXOFF   250
  535. /* do the huffman-decoding  */
  536. /* note! for counta,countb -the 4 bit value is returned in y, discard x */
  537. // Huffman decoder for tablename<32
  538. void MPEGaudio::huffmandecoder_1(const HUFFMANCODETABLE *h,int *x,int *y)
  539. {  
  540.   HUFFBITS level=(1<<(sizeof(HUFFBITS)*8-1));
  541.   int point=0;
  542.   /* Lookup in Huffman table. */
  543.   for(;;)
  544.   {
  545.     if(h->val[point][0]==0)
  546.     {   /*end of tree*/
  547.       int xx,yy;
  548.       xx=h->val[point][1]>>4;
  549.       yy=h->val[point][1]&0xf;
  550.       if(h->linbits)
  551.       {
  552. if((h->xlen)==(unsigned)xx)xx+=wgetbits(h->linbits);
  553. if(xx)if(wgetbit())xx=-xx;
  554. if((h->ylen)==(unsigned)yy)yy+=wgetbits(h->linbits);
  555. if(yy)if(wgetbit())yy=-yy;
  556.       }
  557.       else
  558.       {
  559. if(xx)if(wgetbit())xx=-xx;
  560. if(yy)if(wgetbit())yy=-yy;
  561.       }
  562.       *x=xx;*y=yy;
  563.       break;
  564.     } 
  565.     point+=h->val[point][wgetbit()];
  566.     
  567.     level>>=1;
  568.     if(!(level || ((unsigned)point<ht->treelen)))
  569.     {
  570.       register int xx,yy;
  571.       xx=(h->xlen<<1);// set x and y to a medium value as a simple concealment
  572.       yy=(h->ylen<<1);
  573.       // h->xlen and h->ylen can't be 1 under tablename 32
  574.       //      if(xx)
  575. if(wgetbit())xx=-xx;
  576.       //      if(yy)
  577. if(wgetbit())yy=-yy;
  578.       *x=xx;*y=yy;
  579.       break;
  580.     }
  581.   }
  582. }
  583. // Huffman decoder tablenumber>=32
  584. void MPEGaudio::huffmandecoder_2(const HUFFMANCODETABLE *h,
  585.        int *x,int *y,int *v,int *w)
  586. {  
  587.   HUFFBITS level=(1<<(sizeof(HUFFBITS)*8-1));
  588.   int point=0;
  589.   /* Lookup in Huffman table. */
  590.   for(;;)
  591.   {
  592.     if(h->val[point][0]==0)
  593.     {   /*end of tree*/
  594.       register int t=h->val[point][1];
  595.       if(t&8)*v=1-(wgetbit()<<1); else *v=0;
  596.       if(t&4)*w=1-(wgetbit()<<1); else *w=0;
  597.       if(t&2)*x=1-(wgetbit()<<1); else *x=0;
  598.       if(t&1)*y=1-(wgetbit()<<1); else *y=0;
  599.       break;
  600.     } 
  601.     point+=h->val[point][wgetbit()];
  602.     level>>=1;
  603.     if(!(level || ((unsigned)point<ht->treelen)))
  604.     {
  605.       *v=1-(wgetbit()<<1);
  606.       *w=1-(wgetbit()<<1);
  607.       *x=1-(wgetbit()<<1);
  608.       *y=1-(wgetbit()<<1);
  609.       break;
  610.     }
  611.   }
  612. }
  613. typedef struct
  614. {
  615.   int l[23];
  616.   int s[14];
  617. }SFBANDINDEX;
  618. static SFBANDINDEX sfBandIndextable[2][3]=
  619. {
  620.   // MPEG 1
  621.   {{{0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
  622.     {0,4,8,12,16,22,30,40,52,66,84,106,136,192}},
  623.    {{0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
  624.     {0,4,8,12,16,22,28,38,50,64,80,100,126,192}},
  625.    {{0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
  626.     {0,4,8,12,16,22,30,42,58,78,104,138,180,192}}},
  627.   // MPEG 2
  628.   {{{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  629.     {0,4,8,12,18,24,32,42,56,74,100,132,174,192}},
  630.    {{0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
  631.     {0,4,8,12,18,26,36,48,62,80,104,136,180,192}},
  632.    {{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  633.     {0,4,8,12,18,26,36,48,62,80,104,134,174,192}}}
  634. };
  635. void MPEGaudio::layer3huffmandecode(int ch,int gr,int out[SBLIMIT][SSLIMIT])
  636. {
  637.   layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]);
  638.   int part2_3_end=layer3part2start+(gi->part2_3_length);
  639.   int region1Start,region2Start;
  640.   int i,e=gi->big_values<<1;
  641.   /* Find region boundary for short block case. */
  642.   if(gi->generalflag)
  643.   {
  644.     /* Region2. */
  645.     region1Start=36; /* sfb[9/3]*3=36 */
  646.     region2Start=576;/* No Region2 for short block case. */
  647.   }
  648.   else
  649.   {          /* Find region boundary for long block case. */
  650.     region1Start=sfBandIndextable[version][frequency].l[gi->region0_count+1];
  651.     region2Start=sfBandIndextable[version][frequency].l[gi->region0_count+
  652.         gi->region1_count+2];
  653.   }
  654.   /* Read bigvalues area. */
  655.   for(i=0;i<e;)
  656.   {
  657.     const HUFFMANCODETABLE *h;
  658.     register int end;
  659.       
  660.     if     (i<region1Start)
  661.     {
  662.       h=&ht[gi->table_select[0]];
  663.       if(region1Start>e)end=e; else end=region1Start;
  664.     }
  665.     else if(i<region2Start)
  666.     {
  667.       h=&ht[gi->table_select[1]];
  668.       if(region2Start>e)end=e; else end=region2Start;
  669.     }
  670.     else
  671.     {
  672.       h=&ht[gi->table_select[2]];
  673.       end=e;
  674.     }
  675.     if(h->treelen)
  676.       while(i<end)
  677.       {
  678. huffmandecoder_1(h,&out[0][i],&out[0][i+1]);
  679. i+=2;
  680.       }
  681.     else
  682.       for(;i<end;i+=2)
  683. out[0][i]  =
  684. out[0][i+1]=0;
  685.   }
  686.   /* Read count1 area. */
  687.   const HUFFMANCODETABLE *h=&ht[gi->count1table_select+32];
  688.   while(bitwindow.gettotalbit()<part2_3_end)
  689.   {
  690.     huffmandecoder_2(h,&out[0][i+2],&out[0][i+3],
  691.      &out[0][i  ],&out[0][i+1]);
  692.     i+=4;
  693.     if(i>=ARRAYSIZE)
  694.     {
  695.       bitwindow.rewind(bitwindow.gettotalbit()-part2_3_end);
  696.       return;
  697.     }
  698.   }
  699.   
  700.   for(;i<ARRAYSIZE;i++)out[0][i]=0;
  701.   bitwindow.rewind(bitwindow.gettotalbit()-part2_3_end);
  702. }
  703. static int pretab[22]={0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
  704. REAL MPEGaudio::layer3twopow2(int scale,int preflag,
  705.      int pretab_offset,int l)
  706. {
  707.   int index=l;
  708.   
  709.   if(preflag)index+=pretab_offset;
  710.   return(two_to_negative_half_pow[index<<scale]);
  711. }
  712. REAL MPEGaudio::layer3twopow2_1(int a,int b,int c)
  713. {
  714.   return POW2_1[a][b][c];
  715. }
  716. void MPEGaudio::layer3dequantizesample(int ch,int gr,
  717.        int   in[SBLIMIT][SSLIMIT],
  718.        REAL out[SBLIMIT][SSLIMIT])
  719. {
  720.   layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]);
  721.   SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]);
  722.   REAL globalgain=POW2[gi->global_gain];
  723.   REAL *TO_FOUR_THIRDS=TO_FOUR_THIRDSTABLE+FOURTHIRDSTABLENUMBER;
  724.   /* choose correct scalefactor band per block type, initalize boundary */
  725.   /* and apply formula per block type */
  726.   
  727.   if(!gi->generalflag)
  728.   {                                          /* LONG blocks: 0,1,3 */
  729.     int next_cb_boundary;
  730.     int cb=-1,index=0;
  731.     REAL factor;
  732.     do
  733.     {
  734.       next_cb_boundary=sfBandIndex->l[(++cb)+1];
  735.       factor=globalgain*
  736.      layer3twopow2(gi->scalefac_scale,gi->preflag,
  737.    pretab[cb],scalefactors[ch].l[cb]);
  738.       for(;index<next_cb_boundary;)
  739.       {
  740. out[0][index]=factor*TO_FOUR_THIRDS[in[0][index]];index++;
  741. out[0][index]=factor*TO_FOUR_THIRDS[in[0][index]];index++;
  742.       }
  743.     }while(index<ARRAYSIZE);
  744.   }
  745.   else if(!gi->mixed_block_flag)
  746.   {
  747.     int cb=0,index=0;
  748.     int cb_width;
  749.     do
  750.     {
  751.       cb_width=(sfBandIndex->s[cb+1]-sfBandIndex->s[cb])>>1;
  752.       for(register int k=0;k<3;k++)
  753.       {
  754. register REAL factor;
  755. register int count=cb_width;
  756. factor=globalgain*
  757.        layer3twopow2_1(gi->subblock_gain[k],gi->scalefac_scale,
  758.        scalefactors[ch].s[k][cb]);
  759. do{
  760.   out[0][index]=factor*TO_FOUR_THIRDS[in[0][index]];index++;
  761.   out[0][index]=factor*TO_FOUR_THIRDS[in[0][index]];index++;
  762. }while(--count);
  763.       }
  764.       cb++;
  765.     }while(index<ARRAYSIZE);
  766.   }
  767.   else
  768.   {
  769.     int cb_begin=0,cb_width=0;
  770.     int cb=0;
  771.     int next_cb_boundary=sfBandIndex->l[1]; /* LONG blocks: 0,1,3 */
  772.     int index;
  773.     /* Compute overall (global) scaling. */
  774.     {
  775.       for(int sb=0;sb<SBLIMIT;sb++)
  776.       {
  777. int *i=in[sb];
  778. REAL *o=out[sb];
  779. o[ 0]=globalgain*TO_FOUR_THIRDS[i[ 0]];o[ 1]=globalgain*TO_FOUR_THIRDS[i[ 1]];
  780. o[ 2]=globalgain*TO_FOUR_THIRDS[i[ 2]];o[ 3]=globalgain*TO_FOUR_THIRDS[i[ 3]];
  781. o[ 4]=globalgain*TO_FOUR_THIRDS[i[ 4]];o[ 5]=globalgain*TO_FOUR_THIRDS[i[ 5]];
  782. o[ 6]=globalgain*TO_FOUR_THIRDS[i[ 6]];o[ 7]=globalgain*TO_FOUR_THIRDS[i[ 7]];
  783. o[ 8]=globalgain*TO_FOUR_THIRDS[i[ 8]];o[ 9]=globalgain*TO_FOUR_THIRDS[i[ 9]];
  784. o[10]=globalgain*TO_FOUR_THIRDS[i[10]];o[11]=globalgain*TO_FOUR_THIRDS[i[11]];
  785. o[12]=globalgain*TO_FOUR_THIRDS[i[12]];o[13]=globalgain*TO_FOUR_THIRDS[i[13]];
  786. o[14]=globalgain*TO_FOUR_THIRDS[i[14]];o[15]=globalgain*TO_FOUR_THIRDS[i[15]];
  787. o[16]=globalgain*TO_FOUR_THIRDS[i[16]];o[17]=globalgain*TO_FOUR_THIRDS[i[17]];
  788.       }
  789.     }
  790.     for(index=0;index<SSLIMIT*2;index++)
  791.     {
  792.       if(index==next_cb_boundary)
  793.       {
  794. if(index==sfBandIndex->l[8])
  795. {
  796.   next_cb_boundary=sfBandIndex->s[4];
  797.   next_cb_boundary=MUL3(next_cb_boundary);
  798.   cb=3;
  799.   cb_width=sfBandIndex->s[4]-sfBandIndex->s[3];
  800.   cb_begin=sfBandIndex->s[3];
  801.   cb_begin=MUL3(cb_begin);
  802. }
  803. else if(index<sfBandIndex->l[8])
  804.   next_cb_boundary=sfBandIndex->l[(++cb)+1];
  805. else 
  806. {
  807.   next_cb_boundary=sfBandIndex->s[(++cb)+1];
  808.   next_cb_boundary=MUL3(next_cb_boundary);
  809.   cb_begin=sfBandIndex->s[cb];
  810.   cb_width=sfBandIndex->s[cb+1]-cb_begin;
  811.   cb_begin=MUL3(cb_begin);
  812. }
  813.       }
  814.       /* LONG block types 0,1,3 & 1st 2 subbands of switched blocks */
  815.       out[0][index]*=layer3twopow2(gi->scalefac_scale,gi->preflag,
  816.    pretab[cb],scalefactors[ch].l[cb]);
  817.     }
  818.     for(;index<ARRAYSIZE;index++)
  819.     { 
  820.       if(index==next_cb_boundary)
  821.       {
  822. if(index==sfBandIndex->l[8])
  823. {
  824.   next_cb_boundary=sfBandIndex->s[4];
  825.   next_cb_boundary=MUL3(next_cb_boundary);
  826.   cb=3;
  827.   cb_width=sfBandIndex->s[4]-sfBandIndex->s[3];
  828.   cb_begin=sfBandIndex->s[3];
  829.   cb_begin=(cb_begin<<2)-cb_begin;
  830. }
  831. else if(index<sfBandIndex->l[8])
  832.   next_cb_boundary=sfBandIndex->l[(++cb)+1];
  833. else 
  834. {
  835.   next_cb_boundary=sfBandIndex->s[(++cb)+1];
  836.   next_cb_boundary=MUL3(next_cb_boundary);
  837.   cb_begin=sfBandIndex->s[cb];
  838.   cb_width=sfBandIndex->s[cb+1]-cb_begin;
  839.   cb_begin=MUL3(cb_begin);
  840. }
  841.       }
  842.       {
  843. int t_index=(index-cb_begin)/cb_width;
  844. out[0][index]*=layer3twopow2_1(gi->subblock_gain[t_index],
  845.        gi->scalefac_scale,
  846.        scalefactors[ch].s[t_index][cb]);
  847.       }
  848.     }
  849.   }
  850. }
  851. void MPEGaudio::layer3fixtostereo(int gr,REAL in[2][SBLIMIT][SSLIMIT])
  852. {
  853.   layer3grinfo *gi=&(sideinfo.ch[0].gr[gr]);
  854.   SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]);
  855.   
  856.   int ms_stereo=(mode==joint) && (extendedmode & 0x2);
  857.   int i_stereo =(mode==joint) && (extendedmode & 0x1);
  858.   if(!inputstereo)
  859.   { /* mono , bypass xr[0][][] to lr[0][][]*/
  860.     // memcpy(out[0][0],in[0][0],ARRAYSIZE*REALSIZE);
  861.     return;
  862.   } 
  863.     
  864.   if(i_stereo)
  865.   {
  866.     int i;
  867.     int    is_pos[ARRAYSIZE];
  868.     RATIOS is_ratio[ARRAYSIZE];
  869.     RATIOS *ratios;
  870.     if(version)ratios=rat_2[gi->scalefac_compress%2];
  871.     else ratios=rat_1;
  872.     /* initialization */
  873.     for(i=0;i<ARRAYSIZE;i+=2)is_pos[i]=is_pos[i+1]=7;
  874.     if(gi->generalflag)
  875.     {
  876.       if(gi->mixed_block_flag)           // Part I
  877.       {
  878. int max_sfb=0;
  879. for(int j=0;j<3;j++)
  880. {
  881.   int sfb,sfbcnt=2;
  882.   for(sfb=12;sfb>=3;sfb--)
  883.   {
  884.     int lines;
  885.     i=sfBandIndex->s[sfb];
  886.     lines=sfBandIndex->s[sfb+1]-i;
  887.     i=MUL3(i)+(j+1)*lines-1;
  888.     for(;lines>0;lines--,i--)
  889.       if(in[1][0][i]!=0.0f)
  890.       {
  891. sfbcnt=sfb;
  892. sfb=0;break;        // quit loop
  893.       }
  894.   }
  895.   sfb=sfbcnt+1;
  896.     
  897.   if(sfb>max_sfb)max_sfb=sfb;
  898.     
  899.   for(;sfb<12;sfb++)
  900.   {
  901.     int k,t;
  902.     t=sfBandIndex->s[sfb];
  903.     k=sfBandIndex->s[sfb+1]-t;
  904.     i=MUL3(t)+j*k;
  905.     t=scalefactors[1].s[j][sfb];
  906.     if(t!=7)
  907.     {
  908.       RATIOS r=ratios[t];
  909.       for(;k>0;k--,i++){
  910. is_pos[i]=t;is_ratio[i]=r;}
  911.     }
  912.     else
  913.       for(;k>0;k--,i++)is_pos[i]=t;
  914.   }
  915.   sfb=sfBandIndex->s[10];
  916.   sfb=MUL3(sfb)+j*(sfBandIndex->s[11]-sfb);
  917.   {
  918.     int k,t;
  919.     t=sfBandIndex->s[11];
  920.     k=sfBandIndex->s[12]-t;
  921.     i=MUL3(t)+j*k;
  922.     t=is_pos[sfb];
  923.     if(t!=7)
  924.     {
  925.       RATIOS r=is_ratio[sfb];
  926.       for(;k>0;k--,i++){
  927. is_pos[i]=t;is_ratio[i]=r;}
  928.     }
  929.     else
  930.       for(;k>0;k--,i++)is_pos[i]=t;
  931.   }
  932. }
  933. if(max_sfb<=3)
  934. {
  935.   {
  936.     REAL temp;
  937.     int k;
  938.     temp=in[1][0][0];in[1][0][0]=1.0;
  939.     for(k=3*SSLIMIT-1;in[1][0][k]==0.0;k--);
  940.     in[1][0][0]=temp;
  941.     for(i=0;sfBandIndex->l[i]<=k;i++);
  942.   }
  943.   {
  944.     int sfb=i;
  945.     i=sfBandIndex->l[i];
  946.     for(;sfb<8;sfb++)
  947.     {
  948.       int t=scalefactors[1].l[sfb];
  949.       int k=sfBandIndex->l[sfb+1]-sfBandIndex->l[sfb];
  950.       if(t!=7)
  951.       {
  952. RATIOS r=ratios[t];
  953. for(;k>0;k--,i++){
  954.   is_pos[i]=t;is_ratio[i]=r;}
  955.       }
  956.       else for(;k>0;k--,i++)is_pos[i]=t;
  957.     }
  958.   }
  959. }
  960.       }
  961.       else                                // Part II
  962.       {
  963. for(int j=0;j<3;j++)
  964. {
  965.   int sfb;
  966.       int sfbcnt=-1;
  967.   for(sfb=12;sfb>=0;sfb--)
  968.   {
  969.     int lines;
  970.     {
  971.       int t;
  972.       t=sfBandIndex->s[sfb];
  973.       lines=sfBandIndex->s[sfb+1]-t;
  974.       i=MUL3(t)+(j+1)*lines-1;
  975.     }
  976.   
  977.     for(;lines>0;lines--,i--)
  978.       if(in[1][0][i]!=0.0f)
  979.       {
  980. sfbcnt=sfb;
  981. sfb=0;break;       // quit loop
  982.       }
  983.   }
  984.   for(sfb=sfbcnt+1;sfb<12;sfb++)
  985.   {
  986.     int k,t;
  987.     t=sfBandIndex->s[sfb];
  988.     k=sfBandIndex->s[sfb+1]-t;
  989.     i=MUL3(t)+j*k;
  990.     t=scalefactors[1].s[j][sfb];
  991.     if(t!=7)
  992.     {
  993.       RATIOS r=ratios[t];
  994.       for(;k>0;k--,i++){
  995. is_pos[i]=t;is_ratio[i]=r;}
  996.     }
  997.     else for(;k>0;k--,i++)is_pos[i]=t;
  998.   }
  999.   {
  1000.     int t1=sfBandIndex->s[10],
  1001.         t2=sfBandIndex->s[11];
  1002.     int k,tt;
  1003.     tt=MUL3(t1)+j*(t2-t1);
  1004.     k =sfBandIndex->s[12]-t2;
  1005.     if(is_pos[tt]!=7)
  1006.     {
  1007.       RATIOS r=is_ratio[tt];
  1008.       int  t=is_pos[tt];
  1009.       i   =MUL3(t1)+j*k;
  1010.       for(;k>0;k--,i++){
  1011. is_pos[i]=t;is_ratio[i]=r;}
  1012.     }
  1013.     else
  1014.       for(;k>0;k--,i++)is_pos[i]=7;
  1015.   }
  1016. }
  1017.       }
  1018.     }
  1019.     else // ms-stereo (Part III)
  1020.     {
  1021.       {
  1022. REAL temp;
  1023. int k;
  1024. temp=in[1][0][0];in[1][0][0]=1.0;
  1025. for(k=ARRAYSIZE-1;in[1][0][k]==0.0;k--);
  1026. in[1][0][0]=temp;
  1027. for(i=0;sfBandIndex->l[i]<=k;i++);
  1028.       }
  1029.       {
  1030. int sfb;
  1031. sfb=i;
  1032. i=sfBandIndex->l[i];
  1033. for(;sfb<21;sfb++)
  1034.         {
  1035.   int k,t;
  1036.   k=sfBandIndex->l[sfb+1]-sfBandIndex->l[sfb];
  1037.   t=scalefactors[1].l[sfb];
  1038.   if(t!=7)
  1039.   {
  1040.     RATIOS r=ratios[t];
  1041.     for(;k>0;k--,i++){
  1042.       is_pos[i]=t;is_ratio[i]=r;}
  1043.   }
  1044.   else
  1045.     for(;k>0;k--,i++)is_pos[i]=t;
  1046. }
  1047.       }
  1048.       if (i <= sfBandIndex->l[21]) {
  1049. int k,t,tt;
  1050. tt=sfBandIndex->l[20];
  1051. k=576-sfBandIndex->l[21];
  1052. t=is_pos[tt];
  1053. if(t!=7)
  1054. {
  1055.   RATIOS r=is_ratio[tt];
  1056.   for(;k>0;k--,i++){
  1057.     is_pos[i]=t;is_ratio[i]=r;}
  1058. }
  1059. else
  1060.   for(;k>0;k--,i++)is_pos[i]=t;
  1061.       }
  1062.     }
  1063.     if(ms_stereo)
  1064.     {
  1065.       i=ARRAYSIZE-1;
  1066.       do{
  1067. if(is_pos[i]==7)
  1068. {
  1069.   register REAL t=in[LS][0][i];
  1070.   in[LS][0][i]=(t+in[RS][0][i])*0.7071068f;
  1071.   in[RS][0][i]=(t-in[RS][0][i])*0.7071068f;
  1072. }
  1073. else
  1074. {
  1075.   in[RS][0][i]=in[LS][0][i]*is_ratio[i].r;
  1076.   in[LS][0][i]*=is_ratio[i].l;
  1077. }
  1078.       }while(i--);
  1079.     }
  1080.     else
  1081.     {
  1082.       i=ARRAYSIZE-1;
  1083.       do{
  1084. if(is_pos[i]!=7)
  1085. {
  1086.   in[RS][0][i]=in[LS][0][i]*is_ratio[i].r;
  1087.   in[LS][0][i]*=is_ratio[i].l;
  1088. }
  1089.       }while(i--);
  1090.     }
  1091.   }
  1092.   else
  1093.   {
  1094.     if(ms_stereo)
  1095.     {
  1096.       int i=ARRAYSIZE-1;
  1097.       do{
  1098. register REAL t=in[LS][0][i];
  1099. in[LS][0][i]=(t+in[RS][0][i])*0.7071068f;
  1100. in[RS][0][i]=(t-in[RS][0][i])*0.7071068f;
  1101.       }while(i--);
  1102.     }
  1103.   }
  1104.   // channels==2
  1105. }
  1106. inline void layer3reorder_1(int version,int frequency,
  1107.     REAL  in[SBLIMIT][SSLIMIT],
  1108.     REAL out[SBLIMIT][SSLIMIT])
  1109. {
  1110.   SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]);
  1111.   int sfb,sfb_start,sfb_lines;
  1112.   
  1113.   /* NO REORDER FOR LOW 2 SUBBANDS */
  1114.   out[0][ 0]=in[0][ 0];out[0][ 1]=in[0][ 1];out[0][ 2]=in[0][ 2];
  1115.   out[0][ 3]=in[0][ 3];out[0][ 4]=in[0][ 4];out[0][ 5]=in[0][ 5];
  1116.   out[0][ 6]=in[0][ 6];out[0][ 7]=in[0][ 7];out[0][ 8]=in[0][ 8];
  1117.   out[0][ 9]=in[0][ 9];out[0][10]=in[0][10];out[0][11]=in[0][11];
  1118.   out[0][12]=in[0][12];out[0][13]=in[0][13];out[0][14]=in[0][14];
  1119.   out[0][15]=in[0][15];out[0][16]=in[0][16];out[0][17]=in[0][17];
  1120.   out[1][ 0]=in[1][ 0];out[1][ 1]=in[1][ 1];out[1][ 2]=in[1][ 2];
  1121.   out[1][ 3]=in[1][ 3];out[1][ 4]=in[1][ 4];out[1][ 5]=in[1][ 5];
  1122.   out[1][ 6]=in[1][ 6];out[1][ 7]=in[1][ 7];out[1][ 8]=in[1][ 8];
  1123.   out[1][ 9]=in[1][ 9];out[1][10]=in[1][10];out[1][11]=in[1][11];
  1124.   out[1][12]=in[1][12];out[1][13]=in[1][13];out[1][14]=in[1][14];
  1125.   out[1][15]=in[1][15];out[1][16]=in[1][16];out[1][17]=in[1][17];
  1126.   /* REORDERING FOR REST SWITCHED SHORT */
  1127.   for(sfb=3,sfb_start=sfBandIndex->s[3],
  1128. sfb_lines=sfBandIndex->s[4]-sfb_start;
  1129.       sfb<13;
  1130.       sfb++,sfb_start=sfBandIndex->s[sfb],
  1131. (sfb_lines=sfBandIndex->s[sfb+1]-sfb_start))
  1132.   {
  1133.     for(int freq=0;freq<sfb_lines;freq++)
  1134.     {
  1135.       int src_line=sfb_start+(sfb_start<<1)+freq;
  1136.       int des_line=src_line+(freq<<1);
  1137.       out[0][des_line  ]=in[0][src_line               ];
  1138.       out[0][des_line+1]=in[0][src_line+sfb_lines     ];
  1139.       out[0][des_line+2]=in[0][src_line+(sfb_lines<<1)];
  1140.     }
  1141.   }
  1142. }
  1143. inline void layer3reorder_2(int version,int frequency,REAL  in[SBLIMIT][SSLIMIT],
  1144.     REAL out[SBLIMIT][SSLIMIT])
  1145. {
  1146.   SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]);
  1147.   int sfb,sfb_start,sfb_lines;
  1148.   
  1149.   for(sfb=0,sfb_start=0,sfb_lines=sfBandIndex->s[1];
  1150.       sfb<13;
  1151.       sfb++,sfb_start=sfBandIndex->s[sfb],
  1152. (sfb_lines=sfBandIndex->s[sfb+1]-sfb_start))
  1153.   {
  1154.     for(int freq=0;freq<sfb_lines;freq++)
  1155.     {
  1156.       int src_line=sfb_start+(sfb_start<<1)+freq;
  1157.       int des_line=src_line+(freq<<1);
  1158.       out[0][des_line  ]=in[0][src_line               ];
  1159.       out[0][des_line+1]=in[0][src_line+sfb_lines     ];
  1160.       out[0][des_line+2]=in[0][src_line+(sfb_lines<<1)];
  1161.     }
  1162.   }
  1163. }
  1164. inline void layer3antialias_1(REAL  in[SBLIMIT][SSLIMIT])
  1165. {
  1166.   for(int ss=0;ss<8;ss++)
  1167.   {
  1168.     REAL bu,bd; /* upper and lower butterfly inputs */
  1169.     
  1170.     bu=in[0][17-ss];bd=in[1][ss];
  1171.     in[0][17-ss]=(bu*cs[ss])-(bd*ca[ss]);
  1172.     in[1][ss]   =(bd*cs[ss])+(bu*ca[ss]);
  1173.   }
  1174. }
  1175. inline
  1176. void layer3antialias_2(REAL  in[SBLIMIT][SSLIMIT],
  1177.        REAL out[SBLIMIT][SSLIMIT])
  1178. {
  1179.   out[0][0]=in[0][0];out[0][1]=in[0][1];
  1180.   out[0][2]=in[0][2];out[0][3]=in[0][3];
  1181.   out[0][4]=in[0][4];out[0][5]=in[0][5];
  1182.   out[0][6]=in[0][6];out[0][7]=in[0][7];
  1183.   for(int index=SSLIMIT;index<=(SBLIMIT-1)*SSLIMIT;index+=SSLIMIT)
  1184.   {
  1185.     for(int n=0;n<8;n++)
  1186.     {
  1187.       REAL bu,bd;
  1188.       bu=in[0][index-n-1];bd=in[0][index+n];
  1189.       out[0][index-n-1]=(bu*cs[n])-(bd*ca[n]);
  1190.       out[0][index+n  ]=(bd*cs[n])+(bu*ca[n]);
  1191.     }
  1192.     out[0][index-SSLIMIT+8]=in[0][index-SSLIMIT+8];
  1193.     out[0][index-SSLIMIT+9]=in[0][index-SSLIMIT+9];
  1194.   }
  1195.   out[31][ 8]=in[31][ 8];out[31][ 9]=in[31][ 9];
  1196.   out[31][10]=in[31][10];out[31][11]=in[31][11];
  1197.   out[31][12]=in[31][12];out[31][13]=in[31][13];
  1198.   out[31][14]=in[31][14];out[31][15]=in[31][15];
  1199.   out[31][16]=in[31][16];out[31][17]=in[31][17];
  1200. }
  1201. void MPEGaudio::layer3reorderandantialias(int ch,int gr,
  1202.   REAL  in[SBLIMIT][SSLIMIT],
  1203.   REAL out[SBLIMIT][SSLIMIT])
  1204. {
  1205.   register layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]);
  1206.   if(gi->generalflag)
  1207.   {
  1208.     if(gi->mixed_block_flag)
  1209.     {
  1210.       fprintf(stderr,"Notchecked!");
  1211.       layer3reorder_1  (version,frequency,in,out);    // Not checked...
  1212.       layer3antialias_1(out);
  1213.     }
  1214.     else
  1215.       layer3reorder_2(version,frequency,in,out);
  1216.   }
  1217.   else
  1218.     layer3antialias_2(in,out);
  1219. }
  1220. static void dct36(REAL *inbuf,REAL *prevblk1,REAL *prevblk2,REAL *wi,REAL *out)
  1221. {
  1222. #define MACRO0(v) {                                 
  1223.     REAL tmp;                                       
  1224.     out2[9+(v)]=(tmp=sum0+sum1)*wi[27+(v)];         
  1225.     out2[8-(v)]=tmp * wi[26-(v)];  }                
  1226.     sum0-=sum1;                                     
  1227.     ts[SBLIMIT*(8-(v))]=out1[8-(v)]+sum0*wi[8-(v)]; 
  1228.     ts[SBLIMIT*(9+(v))]=out1[9+(v)]+sum0*wi[9+(v)]; 
  1229. #define MACRO1(v) { 
  1230.     REAL sum0,sum1; 
  1231.     sum0=tmp1a+tmp2a; 
  1232.     sum1=(tmp1b+tmp2b)*hsec_36[(v)]; 
  1233.     MACRO0(v); }
  1234. #define MACRO2(v) {                    
  1235.     REAL sum0,sum1;                    
  1236.     sum0=tmp2a-tmp1a;                  
  1237.     sum1=(tmp2b-tmp1b) * hsec_36[(v)]; 
  1238.     MACRO0(v); }
  1239.   {
  1240.     register REAL *in = inbuf;
  1241.    
  1242.     in[17]+=in[16];in[16]+=in[15];in[15]+=in[14];in[14]+=in[13]; 
  1243.     in[13]+=in[12];in[12]+=in[11];in[11]+=in[10];in[10]+=in[ 9];
  1244.     in[ 9]+=in[ 8];in[ 8]+=in[ 7];in[ 7]+=in[ 6];in[ 6]+=in[ 5];
  1245.     in[ 5]+=in[ 4];in[ 4]+=in[ 3];in[ 3]+=in[ 2];in[ 2]+=in[ 1];
  1246.     in[ 1]+=in[ 0];
  1247.     in[17]+=in[15];in[15]+=in[13];in[13]+=in[11];in[11]+=in[ 9];
  1248.     in[ 9]+=in[ 7];in[7] +=in[ 5];in[ 5]+=in[ 3];in[ 3]+=in[ 1];
  1249.     {
  1250.       register REAL *c = cos_18;
  1251.       register REAL *out2 = prevblk2;
  1252.       register REAL *out1 = prevblk1;
  1253.       register REAL *ts = out;
  1254.       
  1255.       REAL ta33,ta66,tb33,tb66;
  1256.       ta33=in[2*3+0]*c[3];
  1257.       ta66=in[2*6+0]*c[6];
  1258.       tb33=in[2*3+1]*c[3];
  1259.       tb66=in[2*6+1]*c[6];
  1260.       { 
  1261. REAL tmp1a,tmp2a,tmp1b,tmp2b;
  1262. tmp1a=          in[2*1+0]*c[1]+ta33          +in[2*5+0]*c[5]+in[2*7+0]*c[7];
  1263. tmp1b=          in[2*1+1]*c[1]+tb33          +in[2*5+1]*c[5]+in[2*7+1]*c[7];
  1264. tmp2a=in[2*0+0]+in[2*2+0]*c[2]+in[2*4+0]*c[4]+ta66          +in[2*8+0]*c[8];
  1265. tmp2b=in[2*0+1]+in[2*2+1]*c[2]+in[2*4+1]*c[4]+tb66          +in[2*8+1]*c[8];
  1266. MACRO1(0);
  1267. MACRO2(8);
  1268.       }
  1269.       {
  1270. REAL tmp1a,tmp2a,tmp1b,tmp2b;
  1271. tmp1a=(in[2*1+0]-in[2*5+0]-in[2*7+0])*c[3];
  1272. tmp1b=(in[2*1+1]-in[2*5+1]-in[2*7+1])*c[3];
  1273. tmp2a=(in[2*2+0]-in[2*4+0]-in[2*8+0])*c[6]-in[2*6+0]+in[2*0+0];
  1274. tmp2b=(in[2*2+1]-in[2*4+1]-in[2*8+1])*c[6]-in[2*6+1]+in[2*0+1];
  1275. MACRO1(1);
  1276. MACRO2(7);
  1277.       }
  1278.       {
  1279. REAL tmp1a,tmp2a,tmp1b,tmp2b;
  1280. tmp1a=          in[2*1+0]*c[5]-ta33          -in[2*5+0]*c[7]+in[2*7+0]*c[1];
  1281. tmp1b=          in[2*1+1]*c[5]-tb33          -in[2*5+1]*c[7]+in[2*7+1]*c[1];
  1282. tmp2a=in[2*0+0]-in[2*2+0]*c[8]-in[2*4+0]*c[2]+ta66          +in[2*8+0]*c[4];
  1283. tmp2b=in[2*0+1]-in[2*2+1]*c[8]-in[2*4+1]*c[2]+tb66          +in[2*8+1]*c[4];
  1284. MACRO1(2);
  1285. MACRO2(6);
  1286.       }
  1287.       {
  1288. REAL tmp1a,tmp2a,tmp1b,tmp2b;
  1289. tmp1a=          in[2*1+0]*c[7]-ta33          +in[2*5+0]*c[1]-in[2*7+0]*c[5];
  1290. tmp1b=          in[2*1+1]*c[7]-tb33          +in[2*5+1]*c[1]-in[2*7+1]*c[5];
  1291. tmp2a=in[2*0+0]-in[2*2+0]*c[4]+in[2*4+0]*c[8]+ta66          -in[2*8+0]*c[2];
  1292. tmp2b=in[2*0+1]-in[2*2+1]*c[4]+in[2*4+1]*c[8]+tb66          -in[2*8+1]*c[2];
  1293. MACRO1(3);
  1294. MACRO2(5);
  1295.       }
  1296.       {
  1297.         REAL sum0,sum1;
  1298.      sum0= in[2*0+0]-in[2*2+0]+in[2*4+0]-in[2*6+0]+in[2*8+0];
  1299.      sum1=(in[2*0+1]-in[2*2+1]+in[2*4+1]-in[2*6+1]+in[2*8+1])*hsec_36[4];
  1300. MACRO0(4);
  1301.       }
  1302.     }
  1303.   }
  1304. }
  1305. static void dct12(REAL *in,REAL *prevblk1,REAL *prevblk2,register REAL *wi,register REAL *out)
  1306. {
  1307. #define DCT12_PART1   
  1308.         in5=in[5*3];  
  1309.   in5+=(in4=in[4*3]); 
  1310.   in4+=(in3=in[3*3]); 
  1311.   in3+=(in2=in[2*3]); 
  1312.   in2+=(in1=in[1*3]); 
  1313.   in1+=(in0=in[0*3]); 
  1314.                       
  1315.   in5+=in3;in3+=in1;  
  1316.                       
  1317.   in2*=cos1_6;        
  1318.   in3*=cos1_6;
  1319. #define DCT12_PART2         
  1320.   in0+=in4*cos2_6;          
  1321.                             
  1322.   in4=in0+in2;              
  1323.   in0-=in2;                 
  1324.                             
  1325.   in1+=in5*cos2_6;          
  1326.                             
  1327.   in5=(in1+in3)*hsec_12[0]; 
  1328.   in1=(in1-in3)*hsec_12[2]; 
  1329.                             
  1330.   in3=in4+in5;              
  1331.   in4-=in5;                 
  1332.                             
  1333.   in2=in0+in1;              
  1334.   in0-=in1;
  1335.   {
  1336.     REAL in0,in1,in2,in3,in4,in5;
  1337.     register REAL *pb1=prevblk1;
  1338.     out[SBLIMIT*0]=pb1[0];out[SBLIMIT*1]=pb1[1];out[SBLIMIT*2]=pb1[2];
  1339.     out[SBLIMIT*3]=pb1[3];out[SBLIMIT*4]=pb1[4];out[SBLIMIT*5]=pb1[5];
  1340.  
  1341.     DCT12_PART1;
  1342.     
  1343.     {
  1344.       REAL tmp0,tmp1=(in0-in4);
  1345.       {
  1346. register REAL tmp2=(in1-in5)*hsec_12[1];
  1347. tmp0=tmp1+tmp2;
  1348. tmp1-=tmp2;
  1349.       }
  1350.       out[(17-1)*SBLIMIT]=pb1[17-1]+tmp0*wi[11-1];
  1351.       out[(12+1)*SBLIMIT]=pb1[12+1]+tmp0*wi[ 6+1];
  1352.       out[(6 +1)*SBLIMIT]=pb1[6 +1]+tmp1*wi[ 1  ];
  1353.       out[(11-1)*SBLIMIT]=pb1[11-1]+tmp1*wi[ 5-1];
  1354.     }
  1355.     DCT12_PART2;
  1356.     out[(17-0)*SBLIMIT]=pb1[17-0]+in2*wi[11-0];
  1357.     out[(12+0)*SBLIMIT]=pb1[12+0]+in2*wi[ 6+0];
  1358.     out[(12+2)*SBLIMIT]=pb1[12+2]+in3*wi[ 6+2];
  1359.     out[(17-2)*SBLIMIT]=pb1[17-2]+in3*wi[11-2];
  1360.     out[( 6+0)*SBLIMIT]=pb1[ 6+0]+in0*wi[0];
  1361.     out[(11-0)*SBLIMIT]=pb1[11-0]+in0*wi[5-0];
  1362.     out[( 6+2)*SBLIMIT]=pb1[ 6+2]+in4*wi[2];
  1363.     out[(11-2)*SBLIMIT]=pb1[11-2]+in4*wi[5-2];
  1364.   }
  1365.   in++;
  1366.   {
  1367.     REAL in0,in1,in2,in3,in4,in5;
  1368.     register REAL *pb2 = prevblk2;
  1369.  
  1370.     DCT12_PART1;
  1371.     {
  1372.       REAL tmp0,tmp1=(in0-in4);
  1373.       {
  1374. REAL tmp2=(in1-in5)*hsec_12[1];
  1375. tmp0=tmp1+tmp2;
  1376. tmp1-=tmp2;
  1377.       }
  1378.       pb2[5-1]=tmp0*wi[11-1];
  1379.       pb2[0+1]=tmp0*wi[6+1];
  1380.       out[(12+1)*SBLIMIT]+=tmp1*wi[1];
  1381.       out[(17-1)*SBLIMIT]+=tmp1*wi[5-1];
  1382.     }
  1383.     DCT12_PART2;
  1384.     pb2[5-0]=in2*wi[11-0];
  1385.     pb2[0+0]=in2*wi[6+0];
  1386.     pb2[0+2]=in3*wi[6+2];
  1387.     pb2[5-2]=in3*wi[11-2];
  1388.     out[(12+0)*SBLIMIT]+=in0*wi[0];
  1389.     out[(17-0)*SBLIMIT]+=in0*wi[5-0];
  1390.     out[(12+2)*SBLIMIT]+=in4*wi[2];
  1391.     out[(17-2)*SBLIMIT]+=in4*wi[5-2];
  1392.   }
  1393.   in++; 
  1394.   {
  1395.     REAL in0,in1,in2,in3,in4,in5;
  1396.     register REAL *pb2 = prevblk2;
  1397.     pb2[12]=pb2[13]=pb2[14]=pb2[15]=pb2[16]=pb2[17]=0.0;
  1398.     DCT12_PART1;
  1399.     {
  1400.       REAL tmp0,tmp1=(in0-in4);
  1401.       {
  1402. REAL tmp2=(in1-in5)*hsec_12[1];
  1403. tmp0=tmp1+tmp2;
  1404. tmp1-=tmp2;
  1405.       }
  1406.       pb2[11-1]=tmp0*wi[11-1];
  1407.       pb2[ 6+1]=tmp0*wi[6+1];
  1408.       pb2[ 0+1]+=tmp1*wi[1];
  1409.       pb2[ 5-1]+=tmp1*wi[5-1];
  1410.     }
  1411.     DCT12_PART2;
  1412.     pb2[11-0]=in2*wi[11-0];
  1413.     pb2[ 6+0]=in2*wi[ 6+0];
  1414.     pb2[ 6+2]=in3*wi[ 6+2];
  1415.     pb2[11-2]=in3*wi[11-2];
  1416.     pb2[ 0+0]+=in0*wi[0  ];
  1417.     pb2[ 5-0]+=in0*wi[5-0];
  1418.     pb2[ 0+2]+=in4*wi[2  ];
  1419.     pb2[ 5-2]+=in4*wi[5-2];
  1420.   }
  1421. }
  1422. void MPEGaudio::layer3hybrid(int ch,int gr,REAL in[SBLIMIT][SSLIMIT],
  1423.                    REAL out[SSLIMIT][SBLIMIT])
  1424. {
  1425.   layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]);
  1426.   int bt1,bt2;
  1427.   REAL *prev1,*prev2;
  1428.   prev1=prevblck[ch][currentprevblock][0];
  1429.   prev2=prevblck[ch][currentprevblock^1][0];
  1430.   bt1 = gi->mixed_block_flag ? 0 : gi->block_type;
  1431.   bt2 = gi->block_type;
  1432.   {
  1433.     REAL *ci=(REAL *)in,
  1434.          *co=(REAL *)out;
  1435.     int  i;
  1436.     if(downfrequency)i=(SBLIMIT/2)-2;
  1437.     else i=SBLIMIT-2;
  1438.     if(bt2==2)
  1439.     {
  1440.       if(!bt1)
  1441.       {
  1442.   dct36(ci,prev1,prev2,win[0],co);
  1443. ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
  1444.   dct36(ci,prev1,prev2,win[0],co);
  1445.       }
  1446.       else
  1447.       {
  1448. dct12(ci,prev1,prev2,win[2],co);
  1449. ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
  1450. dct12(ci,prev1,prev2,win[2],co);
  1451.       }
  1452.       do{
  1453. ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
  1454. dct12(ci,prev1,prev2,win[2],co);
  1455.       }while(--i);
  1456.     }
  1457.     else
  1458.     {
  1459.       dct36(ci,prev1,prev2,win[bt1],co);
  1460.       ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
  1461.       dct36(ci,prev1,prev2,win[bt1],co);
  1462.       do
  1463.       {
  1464. ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
  1465. dct36(ci,prev1,prev2,win[bt2],co);
  1466.       }while(--i);
  1467.     }
  1468.   }
  1469. }
  1470. #define NEG(a)  (a)=-(a)
  1471. void MPEGaudio::extractlayer3(void)
  1472. {
  1473.   if(version)
  1474.   {
  1475.     extractlayer3_2();
  1476.     return;
  1477.   }
  1478.   {
  1479.     int main_data_end,flush_main;
  1480.     int bytes_to_discard;
  1481.     layer3getsideinfo();
  1482.  
  1483.     if(issync())
  1484.     {
  1485.       for(register int i=layer3slots;i>0;i--)  // read main data.
  1486. bitwindow.putbyte(getbyte());
  1487.     }
  1488.     else
  1489.     {
  1490.       for(register int i=layer3slots;i>0;i--)  // read main data.
  1491. bitwindow.putbyte(getbits8());
  1492.     }
  1493.     main_data_end=bitwindow.gettotalbit()>>3;// of previous frame
  1494.     if (main_data_end < 0) // Fix from Michael Vogt
  1495.     {
  1496.       return;
  1497.     }
  1498.     if((flush_main=(bitwindow.gettotalbit() & 0x7)))
  1499.     {
  1500.       bitwindow.forward(8-flush_main);
  1501.       main_data_end++;
  1502.     }
  1503.     bytes_to_discard=layer3framestart-(main_data_end+sideinfo.main_data_begin);
  1504.     if(main_data_end>WINDOWSIZE)
  1505.     {
  1506.       layer3framestart-=WINDOWSIZE;
  1507.       bitwindow.rewind(WINDOWSIZE*8);
  1508.     }
  1509.   
  1510.     layer3framestart+=layer3slots;
  1511.   
  1512.     bitwindow.wrap();
  1513.     if(bytes_to_discard<0)return;
  1514.     bitwindow.forward(bytes_to_discard<<3);
  1515.   }
  1516.   for(int gr=0;gr<2;gr++)
  1517.   {
  1518.     union
  1519.     {
  1520.       int  is      [SBLIMIT][SSLIMIT];
  1521.       REAL hin  [2][SBLIMIT][SSLIMIT];
  1522.     }b1;
  1523.     union
  1524.     {
  1525.       REAL ro   [2][SBLIMIT][SSLIMIT];
  1526.       REAL lr   [2][SBLIMIT][SSLIMIT];
  1527.       REAL hout [2][SSLIMIT][SBLIMIT];
  1528.     }b2;
  1529.       layer3part2start=bitwindow.gettotalbit();
  1530.       layer3getscalefactors (LS,gr);
  1531.       layer3huffmandecode   (LS,gr      ,b1.is);
  1532.       layer3dequantizesample(LS,gr,b1.is,b2.ro[LS]);
  1533.     if(inputstereo)
  1534.     {
  1535.       layer3part2start=bitwindow.gettotalbit();
  1536.       layer3getscalefactors (RS,gr);
  1537.       layer3huffmandecode   (RS,gr      ,b1.is);
  1538.       layer3dequantizesample(RS,gr,b1.is,b2.ro[RS]);
  1539.     }
  1540.     layer3fixtostereo(gr,b2.ro);   // b2.ro -> b2.lr
  1541.     
  1542.     currentprevblock^=1;
  1543.       layer3reorderandantialias(LS,gr,b2.lr[LS],b1.hin[LS]);
  1544.       layer3hybrid (LS,gr,b1.hin[LS],b2.hout[LS]);
  1545.     if(outputstereo)
  1546.     {
  1547.       layer3reorderandantialias(RS,gr,b2.lr[RS],b1.hin[RS]);
  1548.       layer3hybrid (RS,gr,b1.hin[RS],b2.hout[RS]);
  1549.       register int i=2*SSLIMIT*SBLIMIT-1;
  1550.       do{
  1551. NEG(b2.hout[0][0][i   ]);NEG(b2.hout[0][0][i- 2]);
  1552. NEG(b2.hout[0][0][i- 4]);NEG(b2.hout[0][0][i- 6]);
  1553. NEG(b2.hout[0][0][i- 8]);NEG(b2.hout[0][0][i-10]);
  1554. NEG(b2.hout[0][0][i-12]);NEG(b2.hout[0][0][i-14]);
  1555. NEG(b2.hout[0][0][i-16]);NEG(b2.hout[0][0][i-18]);
  1556. NEG(b2.hout[0][0][i-20]);NEG(b2.hout[0][0][i-22]);
  1557. NEG(b2.hout[0][0][i-24]);NEG(b2.hout[0][0][i-26]);
  1558. NEG(b2.hout[0][0][i-28]);NEG(b2.hout[0][0][i-30]);
  1559.       }while((i-=2*SBLIMIT)>0);
  1560.     }
  1561.     else
  1562.     {
  1563.       register int i=SSLIMIT*SBLIMIT-1;
  1564.       do{
  1565. NEG(b2.hout[0][0][i   ]);NEG(b2.hout[0][0][i- 2]);
  1566. NEG(b2.hout[0][0][i- 4]);NEG(b2.hout[0][0][i- 6]);
  1567. NEG(b2.hout[0][0][i- 8]);NEG(b2.hout[0][0][i-10]);
  1568. NEG(b2.hout[0][0][i-12]);NEG(b2.hout[0][0][i-14]);
  1569. NEG(b2.hout[0][0][i-16]);NEG(b2.hout[0][0][i-18]);
  1570. NEG(b2.hout[0][0][i-20]);NEG(b2.hout[0][0][i-22]);
  1571. NEG(b2.hout[0][0][i-24]);NEG(b2.hout[0][0][i-26]);
  1572. NEG(b2.hout[0][0][i-28]);NEG(b2.hout[0][0][i-30]);
  1573.       }while((i-=2*SBLIMIT)>0);
  1574.     }
  1575.     for(int ss=0;ss<SSLIMIT;ss++)
  1576.       subbandsynthesis(b2.hout[LS][ss],b2.hout[RS][ss]);
  1577.   }
  1578. }
  1579. void MPEGaudio::extractlayer3_2(void)
  1580. {
  1581.   {
  1582.     int main_data_end,flush_main;
  1583.     int bytes_to_discard;
  1584.     layer3getsideinfo_2();
  1585.  
  1586.     if(issync())
  1587.     {
  1588.       for(register int i=layer3slots;i>0;i--)  // read main data.
  1589. bitwindow.putbyte(getbyte());
  1590.     }
  1591.     else
  1592.     {
  1593.       for(register int i=layer3slots;i>0;i--)  // read main data.
  1594. bitwindow.putbyte(getbits8());
  1595.     }
  1596.     bitwindow.wrap();
  1597.     main_data_end=bitwindow.gettotalbit()>>3;// of previous frame
  1598.     if((flush_main=(bitwindow.gettotalbit() & 0x7)))
  1599.     {
  1600.       bitwindow.forward(8-flush_main);
  1601.       main_data_end++;
  1602.     }
  1603.     bytes_to_discard=layer3framestart-main_data_end-sideinfo.main_data_begin;
  1604.     if(main_data_end>WINDOWSIZE)
  1605.     {
  1606.       layer3framestart-=WINDOWSIZE;
  1607.       bitwindow.rewind(WINDOWSIZE*8);
  1608.     }
  1609.   
  1610.     layer3framestart+=layer3slots;
  1611.   
  1612.     if(bytes_to_discard<0) return;
  1613.     bitwindow.forward(bytes_to_discard<<3);
  1614.   }
  1615.   //  for(int gr=0;gr<2;gr++)
  1616.   {
  1617.     union
  1618.     {
  1619.       int  is      [SBLIMIT][SSLIMIT];
  1620.       REAL hin  [2][SBLIMIT][SSLIMIT];
  1621.     }b1;
  1622.     union
  1623.     {
  1624.       REAL ro   [2][SBLIMIT][SSLIMIT];
  1625.       REAL lr   [2][SBLIMIT][SSLIMIT];
  1626.       REAL hout [2][SSLIMIT][SBLIMIT];
  1627.     }b2;
  1628.       layer3part2start=bitwindow.gettotalbit();
  1629.       layer3getscalefactors_2(LS);
  1630.       layer3huffmandecode    (LS,0      ,b1.is);
  1631.       layer3dequantizesample (LS,0,b1.is,b2.ro[LS]);
  1632.     if(inputstereo)
  1633.     {
  1634.       layer3part2start=bitwindow.gettotalbit();
  1635.       layer3getscalefactors_2(RS);
  1636.       layer3huffmandecode    (RS,0      ,b1.is);
  1637.       layer3dequantizesample (RS,0,b1.is,b2.ro[RS]);
  1638.     }
  1639.     layer3fixtostereo(0,b2.ro);          // b2.ro -> b2.lr
  1640.     
  1641.     currentprevblock^=1;
  1642.       layer3reorderandantialias(LS,0,b2.lr[LS],b1.hin[LS]);
  1643.       layer3hybrid (LS,0,b1.hin[LS],b2.hout[LS]);
  1644.     if(outputstereo)
  1645.     {
  1646.       layer3reorderandantialias(RS,0,b2.lr[RS],b1.hin[RS]);
  1647.       layer3hybrid (RS,0,b1.hin[RS],b2.hout[RS]);
  1648.       register int i=2*SSLIMIT*SBLIMIT-1;
  1649.       do{
  1650. NEG(b2.hout[0][0][i-16]);NEG(b2.hout[0][0][i-18]);
  1651. NEG(b2.hout[0][0][i-20]);NEG(b2.hout[0][0][i-22]);
  1652. NEG(b2.hout[0][0][i-24]);NEG(b2.hout[0][0][i-26]);
  1653. NEG(b2.hout[0][0][i-28]);NEG(b2.hout[0][0][i-30]);
  1654.       }while((i-=2*SBLIMIT)>0);
  1655.     }
  1656.     else
  1657.     {
  1658.       register int i=SSLIMIT*SBLIMIT-1;
  1659.       do{
  1660. NEG(b2.hout[0][0][i-16]);NEG(b2.hout[0][0][i-18]);
  1661. NEG(b2.hout[0][0][i-20]);NEG(b2.hout[0][0][i-22]);
  1662. NEG(b2.hout[0][0][i-24]);NEG(b2.hout[0][0][i-26]);
  1663. NEG(b2.hout[0][0][i-28]);NEG(b2.hout[0][0][i-30]);
  1664.       }while((i-=2*SBLIMIT)>0);
  1665.     }
  1666.     for(int ss=0;ss<SSLIMIT;ss++)
  1667.       subbandsynthesis(b2.hout[LS][ss],b2.hout[RS][ss]);
  1668.   }
  1669. }