----------
X-Sun-Data-Type: text
X-Sun-Data-Description: text
X-Sun-Data-Name: text
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 21


Here are a few more patches that improve thr performance of lame 3.03 while
giving identical results with the original. They are only tested with
GPSYCHO, but the original work was done with lame 2.1 so they probably work
with the ISO model as well.

loop.diff:  
Some code is simplified, some redundant calculations removed.
bigv_tab_select is merged with bigv_bitcount in order to be able to avoid 
some redundant calls to count_bits. Finally, mixed_block_flag is assumed to be
zero at all times.

subs.diff:
Exploit the fact that the angle of only the first 6 points of the 1024 point
fft is used to avoid several calls to atan2.

mdct.diff:
Reduced table sizes by changing the table addressing scheme, plus small cleanup.

encode.diff:
Removed read_ana_window() and a small cleanup.
----------
X-Sun-Data-Type: default
X-Sun-Data-Name: loop.diff
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 1215

*** loop.c.1	Wed May 19 21:32:54 1999
--- loop.c	Thu May 20 18:04:59 1999
***************
*** 1027,1043 ****
      cod_info->quantizerStepSize -= 1.0;;
      do
      {
-         do
-         {
              cod_info->quantizerStepSize += 1.0;
              quantize( xrs, ix, cod_info );
-         }
-         while ( ix_max(ix, 0, 576) > 8191 + 14 ); /* within table range? */
  
          calc_runlen( ix, cod_info );  /*rzero,count1,big_values*/
          bits = c1bits = count1_bitcount( ix, cod_info );  /*count1_table selection*/
          subdivide( cod_info );  /* bigvalues sfb division */
-         bigv_tab_select( ix, cod_info );  /* codebook selection*/
          bits += bvbits = bigv_bitcount( ix, cod_info );  /* bit count */
      }
      while ( bits > max_bits );
--- 1027,1038 ----
***************
*** 1045,1052 ****
      return bits;
  }
  
  
- 
  /***************************************************************************/ 
  /*        calc_scfsi                                                       */ 
  /***************************************************************************/ 
--- 1040,1048 ----
      return bits;
  }
  
+ /* Calculated in calc_xmin*/
+ static int en[2][2][21];
  
  /***************************************************************************/ 
  /*        calc_scfsi                                                       */ 
  /***************************************************************************/ 
***************
*** 1077,1084 ****
      scfsi_set = 0;
  
      /* the total energy of the granule */    
!     for ( temp = 0.0, i = 0; i < 576; i++ )
!         temp += xr[i] * xr[i];
      if ( temp == 0.0 )
          en_tot[gr][ch] = 0.0;
      else
--- 1073,1080 ----
      scfsi_set = 0;
  
      /* the total energy of the granule */    
!     for ( temp = 0.0, i = 0; i < 21; i++ )
!       temp += en[gr][ch][i];
      if ( temp == 0.0 )
          en_tot[gr][ch] = 0.0;
      else
***************
*** 1091,1101 ****
           cod_info->block_type != 2 )
          for ( sfb = 0; sfb < 21; sfb++ )
          {
!             start = scalefac_band_long[ sfb ];
!             end   = scalefac_band_long[ sfb+1 ];
  
-             for ( temp = 0.0, i = start; i < end; i++ )
-                 temp += xr[i] * xr[i];
              if ( temp == 0.0 )
                  en[gr][ch][sfb] = 0.0;
              else
--- 1087,1094 ----
           cod_info->block_type != 2 )
          for ( sfb = 0; sfb < 21; sfb++ )
          {
! 	    temp=en[gr][ch][sfb];
  
              if ( temp == 0.0 )
                  en[gr][ch][sfb] = 0.0;
              else
***************
*** 1110,1131 ****
      {
          int gr2, tp;
  
-         for ( gr2 = 0; gr2 < 2; gr2++ )
-         {
-             /* The spectral values are not all zero */
-             if ( xrmax[ch][gr2] != 0.0 )
-                 condition++;
              /* None of the granules contains short blocks */
!             if ( (cod_info->window_switching_flag == 0) ||
!                  (cod_info->block_type != 2) )
!                 condition++;
!         }
!         if ( abs(en_tot[0] - en_tot[1]) < en_tot_krit )
!             condition++;
!         for ( tp = 0, sfb = 0; sfb < 21; sfb++ ) 
!             tp += abs( en[ch][0][sfb] - en[ch][1][sfb] );
!         if ( tp < en_dif_krit ) 
!             condition++;
  
          if ( condition == 6 )
          {
--- 1103,1122 ----
      {
          int gr2, tp;
  
              /* None of the granules contains short blocks */
! 	if ( (cod_info->window_switching_flag == 0) || (cod_info->block_type != 2) )
! 	{
! 	    if ( xrmax[ch][0] != 0.0 && xrmax[ch][1] != 0.0)
! 	    {
! 		if ( abs(en_tot[0] - en_tot[1]) < en_tot_krit )
! 		{  
! 		    for ( tp = 0, sfb = 0; sfb < 21; sfb++ ) 
! 			tp += abs( en[ch][0][sfb] - en[ch][1][sfb] );
! 		    if ( tp < en_dif_krit ) 
! 			condition=6;
! 		}
! 	    }
! 	}
  
          if ( condition == 6 )
          {
***************
*** 1185,1198 ****
  
  	if ( (gi->window_switching_flag == 1) && (gi->block_type == 2) )
  	{
- 	    if ( gi->mixed_block_flag )
- 	    {
- 		bits += (8 * slen1) + (9 * slen1) + (18 * slen2);
- 	    }
- 	    else
- 	    {
  		bits += (18 * slen1) + (18 * slen2);
- 	    }
  	}
  	else
  	{
--- 1176,1182 ----
***************
*** 1236,1247 ****
  
      static int slen1[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 };
      static int slen2[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 };
-     static int pow2[5]   = { 1, 2, 4, 8, 16 };
  
      if ( cod_info->window_switching_flag != 0 && cod_info->block_type == 2 )
      {
-         if ( cod_info->mixed_block_flag == 0 ) 
-         {
              /* a = 18; b = 18;  */
              for ( i = 0; i < 3; i++ )
              {
--- 1220,1228 ----
***************
*** 1252,1274 ****
                      if ( scalefac->s[gr][ch][sfb][i] > max_slen2 )
                          max_slen2 = scalefac->s[gr][ch][sfb][i];
              }
-         }
-         else
-         {/* mixed_block_flag = 1 */
-             /* a = 17; b = 18;  */
-             for ( sfb = 0; sfb < 8; sfb++ )
-                 if ( scalefac->l[gr][ch][sfb] > max_slen1 )
-                     max_slen1 = scalefac->l[gr][ch][sfb];
-             for ( i = 0; i < 3; i++ )
-             {
-                 for ( sfb = 3; sfb < 6; sfb++ )
-                     if ( scalefac->s[gr][ch][sfb][i] > max_slen1 )
-                         max_slen1 = scalefac->s[gr][ch][sfb][i];
-                 for ( sfb = 6; sfb < 12; sfb++ )
-                     if ( scalefac->s[gr][ch][sfb][i] > max_slen2 )
-                         max_slen2 = scalefac->s[gr][ch][sfb][i];
-             }
-         }
      }
      else
      { /* block_type == 1,2,or 3 */
--- 1233,1238 ----
***************
*** 1283,1289 ****
  
      for ( k = 0; k < 16; k++ )
      {
!         if ( (max_slen1 < pow2[slen1[k]]) && (max_slen2 < pow2[slen2[k]]) )
          { 
              ep = 0;
              break;
--- 1247,1253 ----
  
      for ( k = 0; k < 16; k++ )
      {
!         if ( (max_slen1 < (1<<slen1[k])) && (max_slen2 < (1<<slen2[k])) )
          { 
              ep = 0;
              break;
***************
*** 1329,1336 ****
  
      if ( cod_info->window_switching_flag != 0 && cod_info->block_type == 2 )
      {
-         if ( cod_info->mixed_block_flag == 0 ) 
-         {
  	    row_in_table = 1;
  	    partition_table = &nr_of_sfb_block[table_number][row_in_table][0];
  	    for ( sfb = 0, partition = 0; partition < 4; partition++ )
--- 1293,1298 ----
***************
*** 1341,1366 ****
  			if ( scalefac->s[gr][ch][sfb][window] > max_sfac[partition] )
  			    max_sfac[partition] = scalefac->s[gr][ch][sfb][window];
  	    }
-         }
-         else
-         {/* mixed_block_flag = 1 */
- 	    row_in_table = 2;
- 	    partition_table = &nr_of_sfb_block[table_number][row_in_table][0];
- 	    partition = 0;
- 	    nr_sfb = partition_table[ partition ];
- 	    for ( i = 0; i < nr_sfb; i++, sfb++ )
- 		if ( scalefac->l[gr][ch][sfb] > max_sfac[partition] )
- 		    max_sfac[partition] = scalefac->l[gr][ch][sfb];
- 	    
- 	    for ( sfb = 0, partition = 1; partition < 4; partition++ )
- 	    {
- 		nr_sfb = partition_table[ partition ] / 3;
- 		for ( i = 0; i < nr_sfb; i++, sfb++ )
- 		    for ( window = 0; window < 3; window++ )
- 			if ( scalefac->s[gr][ch][sfb][window] > max_sfac[partition] )
- 			    max_sfac[partition] = scalefac->s[gr][ch][sfb][window];
- 	    }
-         }
      }
      else
      {
--- 1303,1308 ----
***************
*** 1667,1673 ****
  	   int gr, int ch )
  {
      int start, end, sfb, l, b;
!     double en, bw;
  
      D192_3 *xr_s;
  
--- 1609,1615 ----
  	   int gr, int ch )
  {
      int start, end, sfb, l, b;
!     double en0, bw;
  
      D192_3 *xr_s;
  
***************
*** 1680,1688 ****
  	bw = end - start;
          for ( b = 0; b < 3; b++ )
          {
!             for ( en = 0.0, l = start; l < end; l++ )
!                 en += (*xr_s)[l][b] * (*xr_s)[l][b];
!             l3_xmin->s[gr][ch][sfb][b] = ratio->s[gr][ch][sfb][b] * en / bw;
          }
      }
  
--- 1622,1630 ----
  	bw = end - start;
          for ( b = 0; b < 3; b++ )
          {
!             for ( en0 = 0.0, l = start; l < end; l++ )
!                 en0 += (*xr_s)[l][b] * (*xr_s)[l][b];
!             l3_xmin->s[gr][ch][sfb][b] = ratio->s[gr][ch][sfb][b] * en0 / bw;
          }
      }
  
***************
*** 1692,1700 ****
          end   = scalefac_band_long[ sfb+1 ];
  	bw = end - start;
  
!         for ( en = 0.0, l = start; l < end; l++ )
!             en += xr[gr][ch][l] * xr[gr][ch][l];
!         l3_xmin->l[gr][ch][sfb] = ratio->l[gr][ch][sfb] * en / bw;
      }
  }
  
--- 1634,1644 ----
          end   = scalefac_band_long[ sfb+1 ];
  	bw = end - start;
  
!         for ( en0 = 0.0, l = start; l < end; l++ )
!             en0 += xr[gr][ch][l] * xr[gr][ch][l];
!         l3_xmin->l[gr][ch][sfb] = ratio->l[gr][ch][sfb] * en0 / bw;
! 	/* Stored for calc_scfsi */
! 	en[gr][ch][sfb]=en0;
      }
  }
  
***************
*** 1715,1728 ****
  
      for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ )
          if ( scalefac->l[gr][ch][sfb] == 0 )
!             temp = 0;
  
      for ( sfb = cod_info->sfb_smax; sfb < 12; sfb++ )
          for ( i = 0; i < 3; i++ )
              if ( scalefac->s[gr][ch][sfb][i] == 0 )
!                 temp = 0;
  
!     return temp;
  }
  
  
--- 1659,1672 ----
  
      for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ )
          if ( scalefac->l[gr][ch][sfb] == 0 )
! 	    return 0;
  
      for ( sfb = cod_info->sfb_smax; sfb < 12; sfb++ )
          for ( i = 0; i < 3; i++ )
              if ( scalefac->s[gr][ch][sfb][i] == 0 )
! 		return 0;
  
!     return 1;
  }
  
  
***************
*** 1773,1789 ****
  
  	if (over == 4 )
  	{
  	    cod_info->preflag = 1;
! 	    ifqstep = ( cod_info->scalefac_scale == 0 ) ? sqrt(2.)
! 		: pow( 2.0, (0.5 * (1.0 + (double) cod_info->scalefac_scale)) );
! 
  	    for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ )
  	    {
! 		l3_xmin->l[gr][ch][sfb] *= pow( ifqstep, 2.0 * (double) pretab[sfb] );
  		start = scalefac_band_long[ sfb ];
  		end   = scalefac_band_long[ sfb+1 ];
  		for( i = start; i < end; i++ )
! 		    xr[i] *= pow( ifqstep, (double) pretab[sfb] );
  	    }
  	}
      }
--- 1717,1733 ----
  
  	if (over == 4 )
  	{
+ 	    double t;
  	    cod_info->preflag = 1;
! 	    ifqstep = ( cod_info->scalefac_scale == 0 ) ? sqrt(2.) : 2.0;
  	    for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ )
  	    {
! 		t=pow( ifqstep, (double) pretab[sfb] );
! 		l3_xmin->l[gr][ch][sfb] *= t*t;
  		start = scalefac_band_long[ sfb ];
  		end   = scalefac_band_long[ sfb+1 ];
  		for( i = start; i < end; i++ )
! 		    xr[i]*=t;
  	    }
  	}
      }
***************
*** 1820,1826 ****
      if ( cod_info->scalefac_scale == 0 )
  	ifqstep = sqrt( 2.0 );
      else
! 	ifqstep = pow( 2.0, 0.5 * (1.0 + (double) cod_info->scalefac_scale) );
  
      if ( gr == 1 )
      {
--- 1764,1770 ----
      if ( cod_info->scalefac_scale == 0 )
  	ifqstep = sqrt( 2.0 );
      else
! 	ifqstep = 2.0;
  
      if ( gr == 1 )
      {
***************
*** 1838,1844 ****
  		if ( gr0->scalefac_scale == 0 )
  		    ifqstep = sqrt( 2.0 );
  		else
! 		    ifqstep = pow( 2.0, 0.5 * (1.0 + (double) gr0->scalefac_scale) );
  
  		if ( iteration == 1 )
  		{
--- 1782,1788 ----
  		if ( gr0->scalefac_scale == 0 )
  		    ifqstep = sqrt( 2.0 );
  		else
! 		    ifqstep = 2.0;
  
  		if ( iteration == 1 )
  		{
***************
*** 1964,1980 ****
  
  	if (over == 4 )
  	{
  	    cod_info->preflag = 1;
! 	    ifqstep = ( cod_info->scalefac_scale == 0 ) ? sqrt(2.)
! 		: pow( 2.0, (0.5 * (1.0 + (double) cod_info->scalefac_scale)) );
  
  	    for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ )
  	    {
! 		l3_xmin->l[gr][ch][sfb] *= pow( ifqstep, 2.0 * (double) pretab[sfb] );
  		start = scalefac_band_long[ sfb ];
  		end   = scalefac_band_long[ sfb+1 ];
  		for( i = start; i < end; i++ )
! 		    xr[i] *= pow( ifqstep, (double) pretab[sfb] );
  	    }
  	}
      }
--- 1908,1925 ----
  
  	if (over == 4 )
  	{
+ 	    double t;
  	    cod_info->preflag = 1;
! 	    ifqstep = ( cod_info->scalefac_scale == 0 ) ? sqrt(2.) : 2.0;
  
  	    for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ )
  	    {
! 		t=pow( ifqstep, (double) pretab[sfb] );
! 		l3_xmin->l[gr][ch][sfb] *= t*t;
  		start = scalefac_band_long[ sfb ];
  		end   = scalefac_band_long[ sfb+1 ];
  		for( i = start; i < end; i++ )
! 		    xr[i]*=t;
  	    }
  	}
      }
***************
*** 2012,2018 ****
      if ( cod_info->scalefac_scale == 0 )
  	ifqstep = sqrt( 2.0 );
      else
! 	ifqstep = pow( 2.0, 0.5 * (1.0 + (double) cod_info->scalefac_scale) );
  
      if ( gr == 1 )
      {
--- 1957,1963 ----
      if ( cod_info->scalefac_scale == 0 )
  	ifqstep = sqrt( 2.0 );
      else
! 	ifqstep = 2.0;
  
      if ( gr == 1 )
      {
***************
*** 2030,2036 ****
  		if ( gr0->scalefac_scale == 0 )
  		    ifqstep = sqrt( 2.0 );
  		else
! 		    ifqstep = pow( 2.0, 0.5 * (1.0 + (double) gr0->scalefac_scale) );
  
  		if ( iteration == 1 )
  		{
--- 1975,1981 ----
  		if ( gr0->scalefac_scale == 0 )
  		    ifqstep = sqrt( 2.0 );
  		else
! 		    ifqstep = 2.0;
  
  		if ( iteration == 1 )
  		{
***************
*** 2141,2149 ****
  	lutab[i]=nint(pow((double)i/10.0,0.75)-0.0946);
        for (i=1;i<LUTABSIZE;i++) 
  	if ((lutab[i]-lutab[i-1])==1) {  /* we have a change over this interval */
- 	  lutab[i]=-1;
  	  lutab[i-1]=-1;
- 	  i++;
  	}
      }
  
--- 2086,2092 ----
***************
*** 2160,2182 ****
      istep = 1.0/step;
  
      if ( cod_info->window_switching_flag != 0 && cod_info->block_type == 2 )
- 	if ( cod_info->mixed_block_flag == 0 )
  	{
! 	    l_end = 0;
! 	    s_start = 0;
! 	}
! 	else
  	{
! 	    l_end = 18 * 2;
! 	    s_start = 6 * 2;
  	}
      else
      {
! 	l_end = 576;
! 	s_start = 192;
!     }
! 
!     for (i=0;i<l_end;i++) {
        temp=istep*fabs(xr[i]); /* step always positive -> temp always postive */
        if (temp<0.499996)
  	ix[i]=0;
--- 2103,2146 ----
      istep = 1.0/step;
  
      if ( cod_info->window_switching_flag != 0 && cod_info->block_type == 2 )
  	{
! 	for ( b = 0; b < 3; b++ )
  	{
! 	    step = pow( 2.0, (quantizerStepSize + 8.0 * (double) cod_info->subblock_gain[b]) * 0.25 );
! #ifdef LOOP
!  for (i=0;i<192;i++)
!             {
!                 dbl = fabs((*xr_s)[i][b])/step;
! 
!                 ln = (long)dbl;
!                 if(ln<10000)
!                 {
!                     idx=int2idx[ln];
!                     if(dbl<idx2dbl[idx+1]) (*ix_s)[i][b] = idx;
!                     else                   (*ix_s)[i][b] = idx+1;
!                 }
!                 else
!                 {
!                     dbl = sqrt(sqrt(dbl)*dbl);
!                     if(dbl<0.0946) (*ix_s)[i][b] = (int)(dbl - 0.5946);
!                     else           (*ix_s)[i][b] = (int)(dbl + 0.4154);
!                 }
! 
!             }
! #else
! 	    istep = 1.0/step;
! 	    for ( i = 0; i < 192; i++ )
!             {
!                 temp = fabs((*xr_s)[i][b]) * istep;
! 		if (temp>=1000.0 || ((*ix_s)[i][b]=lutab[(int)(temp*10.0)])==-1) 	
! 		    (*ix_s)[i][b] = (int)( sqrt(sqrt(temp)*temp) + 0.4054);
!             }
! #endif
  	}
+ 	}
      else
      {
!     for (i=0;i<576;i++) {
        temp=istep*fabs(xr[i]); /* step always positive -> temp always postive */
        if (temp<0.499996)
  	ix[i]=0;
***************
*** 2206,2242 ****
  	  ix[i] = (int)( sqrt(sqrt(temp)*temp) + 0.4054); 
  	  }      
      }
!     for (;i<576;i++) ix[i] = 0;
!     
!     if ( s_start < 192 )
! 	for ( b = 0; b < 3; b++ )
! 	{
! 	    step = pow( 2.0, (quantizerStepSize + 8.0 * (double) cod_info->subblock_gain[b]) * 0.25 );
! #ifdef LOOP
!  for (i=s_start;i<192;i++)
!             {
!                 dbl = fabs((*xr_s)[i][b])/step;
  
-                 ln = (long)dbl;
-                 if(ln<10000)
-                 {
-                     idx=int2idx[ln];
-                     if(dbl<idx2dbl[idx+1]) (*ix_s)[i][b] = idx;
-                     else                   (*ix_s)[i][b] = idx+1;
-                 }
-                 else
-                 {
-                     dbl = sqrt(sqrt(dbl)*dbl);
-                     if(dbl<0.0946) (*ix_s)[i][b] = (int)(dbl - 0.5946);
-                     else           (*ix_s)[i][b] = (int)(dbl + 0.4154);
-                 }
- 
-             }
- #else
- 	    for ( i = s_start; i < 192; i++ )
- 		(*ix_s)[i][b] = nint( pow(fabs((*xr_s)[i][b]) / step, 0.75) - 0.0946 );
- #endif
- 	}
  }
  
  
--- 2170,2177 ----
  	  ix[i] = (int)( sqrt(sqrt(temp)*temp) + 0.4054); 
  	  }      
      }
!     }
  
  }
  
  
***************
*** 2256,2262 ****
  
      for ( i = begin; i < end; i++ )
      {
!         int x = abs( ix[i] );
          if ( x > max )
              max = x;
      }
--- 2191,2197 ----
  
      for ( i = begin; i < end; i++ )
      {
!         int x =  ix[i];
          if ( x > max )
              max = x;
      }
***************
*** 2310,2326 ****
      else
      {
          for ( i = 576; i > 1; i -= 2 )
!             if ( ix[i-1] == 0 && ix[i-2] == 0 )
!                 rzero++;
!             else
!                 break;
!         
          cod_info->count1 = 0 ;
          for ( ; i > 3; i -= 4 )
!             if ( abs(ix[i-1]) <= 1
!               && abs(ix[i-2]) <= 1
!               && abs(ix[i-3]) <= 1
!               && abs(ix[i-4]) <= 1 )
                  cod_info->count1++;
              else
                  break;
--- 2245,2255 ----
      else
      {
          for ( i = 576; i > 1; i -= 2 )
! 	    if ( ix[i-1] | ix[i-2] ) break;
! 
          cod_info->count1 = 0 ;
          for ( ; i > 3; i -= 4 )
! 	    if ( (ix[i-1] | ix[i-2] | ix[i-3] | ix[i-4]) <= 1 )
                  cod_info->count1++;
              else
                  break;
***************
*** 2327,2333 ****
          
          cod_info->big_values = i/2;
      }
-     assert( (2 * rzero + 4 * cod_info->count1 + 2 * cod_info->big_values) == 576 );
  }
  
  
--- 2256,2261 ----
***************
*** 2350,2361 ****
  
      for ( i = cod_info->big_values * 2, k = 0; k < cod_info->count1; i += 4, k++ )
      { 
!       v = abs(ix[i]);
!       w = abs(ix[i+1]);
!       x = abs(ix[i+2]);
!       y = abs(ix[i+3]);
  
- 
        /*
          v = ix[ i ];
          w = ix[ i + 1 ];
--- 2278,2288 ----
  
      for ( i = cod_info->big_values * 2, k = 0; k < cod_info->count1; i += 4, k++ )
      { 
! 	v = ix[i];
! 	w = ix[i+1];
! 	x = ix[i+2];
! 	y = ix[i+3];
  
        /*
          v = ix[ i ];
          w = ix[ i + 1 ];
***************
*** 2495,2501 ****
          }
          else
          {
!             if ( (cod_info->block_type == 2) && (cod_info->mixed_block_flag == 0) )
              { 
                  cod_info->region0_count =  8;
                  cod_info->region1_count =  36;
--- 2422,2428 ----
          }
          else
          {
!             if ( (cod_info->block_type == 2)  )
              { 
                  cod_info->region0_count =  8;
                  cod_info->region1_count =  36;
***************
*** 2519,2595 ****
  
  
  /*************************************************************************/
- /*            bigv_tab_select                                            */
- /*************************************************************************/
- 
- /*
-  *  Function: Select huffman code tables for bigvalues regions 
- */
- 
- void bigv_tab_select( int ix[576], gr_info *cod_info )
- {
-     /* int max; */
- 
-     cod_info->table_select[0] = 0;
-     cod_info->table_select[1] = 0;
-     cod_info->table_select[2] = 0;
-     
-     if ( cod_info->window_switching_flag && (cod_info->block_type == 2) )
-     {
-         /*
-           Within each scalefactor band, data is given for successive
-           time windows, beginning with window 0 and ending with window 2.
-           Within each window, the quantized values are then arranged in
-           order of increasing frequency...
-           */
-         int sfb, window, line, start, end, max1, max2, x, y;
-         int region1Start;
-         int *pmax;
- 
-         region1Start = 12;
-         max1 = max2 = 0;
- 
-         for ( sfb = 0; sfb < 13; sfb++ )
-         {
-             start = scalefac_band_short[ sfb ];
-             end   = scalefac_band_short[ sfb+1 ];
-             
-             if ( start < region1Start )
-                 pmax = &max1;
-             else
-                 pmax = &max2;
-             
-             for ( window = 0; window < 3; window++ )
-                 for ( line = start; line < end; line += 2 )
-                 {
-                     assert( line >= 0 );
-                     assert( line < 576 );
-                     x = abs( ix[ (line * 3) + window ] );
-                     y = abs( ix[ ((line + 1) * 3) + window ]);
-                     *pmax = *pmax > x ? *pmax : x;
-                     *pmax = *pmax > y ? *pmax : y;
-                 }
-         }
-         cod_info->table_select[0] = choose_table( max1 );
-         cod_info->table_select[1] = choose_table( max2 );
-     }
-     else
-     {
-         if ( cod_info->address1 > 0 )
-             cod_info->table_select[0] = new_choose_table( ix, 0, cod_info->address1 );
- 
-         if ( cod_info->address2 > cod_info->address1 )
-             cod_info->table_select[1] = new_choose_table( ix, cod_info->address1, cod_info->address2 );
- 
-         if ( cod_info->big_values * 2 > cod_info->address2 )
-             cod_info->table_select[2] = new_choose_table( ix, cod_info->address2, cod_info->big_values * 2 );
-     }
- }
- 
- 
- 
- 
- /*************************************************************************/
  /*            new_choose table                                           */
  /*************************************************************************/
  
--- 2446,2451 ----
***************
*** 2602,2608 ****
    with any arbitrary tables.
  */
  
! int new_choose_table( int ix[576], unsigned int begin, unsigned int end )
  {
      int i, max;
      int choice[ 2 ];
--- 2458,2464 ----
    with any arbitrary tables.
  */
  
! int new_choose_table( int ix[576], unsigned int begin, unsigned int end, int * s )
  {
      int i, max;
      int choice[ 2 ];
***************
*** 2612,2619 ****
  
      if ( max == 0 )
          return 0;
-     
-     max = abs( max );
  
      choice[ 0 ] = 0;
      choice[ 1 ] = 0;
--- 2468,2473 ----
***************
*** 2627,2633 ****
  		choice[ 0 ] = i;
                  break;
  	    }
- 	assert( choice[0] );
  
  	sum[ 0 ] = count_bit( ix, begin, end, choice[0] );
  
--- 2481,2486 ----
***************
*** 2636,2648 ****
--- 2489,2507 ----
  	  case 2:
  	    sum[ 1 ] = count_bit( ix, begin, end, 3 );
  	    if ( sum[1] <= sum[0] )
+ 	    {
+ 		sum[0]=sum[1];
  		choice[ 0 ] = 3;
+ 	    }
  	    break;
  
  	  case 5:
  	    sum[ 1 ] = count_bit( ix, begin, end, 6 );
  	    if ( sum[1] <= sum[0] )
+ 	    {
+ 		sum[0]=sum[1];
  		choice[ 0 ] = 6;
+ 	    }
  	    break;
  
  	  case 7:
***************
*** 2654,2660 ****
--- 2513,2522 ----
  	    }
  	    sum[ 1 ] = count_bit( ix, begin, end, 9 );
  	    if ( sum[1] <= sum[0] )
+ 	    {
+ 		sum[0]=sum[1];
  		choice[ 0 ] = 9;
+ 	    }
  	    break;
  
  	  case 10:
***************
*** 2666,2678 ****
--- 2528,2546 ----
  	    }
  	    sum[ 1 ] = count_bit( ix, begin, end, 12 );
  	    if ( sum[1] <= sum[0] )
+ 	    {
+ 		sum[0]=sum[1];
  		choice[ 0 ] = 12;
+ 	    }
  	    break;
  
  	  case 13:
  	    sum[ 1 ] = count_bit( ix, begin, end, 15 );
  	    if ( sum[1] <= sum[0] )
+ 	    {
+ 		sum[0]=sum[1];
  		choice[ 0 ] = 15;
+ 	    }
  	    break;
  
  	  default:
***************
*** 2700,2718 ****
  		break;
  	    }
  	}
- 	assert( choice[0] );
- 	assert( choice[1] );
  	
  	sum[ 0 ] = count_bit( ix, begin, end, choice[0] );
  	sum[ 1 ] = count_bit( ix, begin, end, choice[1] );
  	if ( sum[1] < sum[0] )
  	    choice[ 0 ] = choice[ 1 ];
      }
      return choice[ 0 ];
  }
  
  
- 
  /*************************************************************************/
  /*            choose table                                               */
  /*************************************************************************/
--- 2568,2587 ----
  		break;
  	    }
  	}
  	
  	sum[ 0 ] = count_bit( ix, begin, end, choice[0] );
  	sum[ 1 ] = count_bit( ix, begin, end, choice[1] );
  	if ( sum[1] < sum[0] )
+ 	{
+ 	    sum[0]=sum[1];
  	    choice[ 0 ] = choice[ 1 ];
+ 	}
      }
+     *s=sum[0];
      return choice[ 0 ];
  }
  
  
  /*************************************************************************/
  /*            choose table                                               */
  /*************************************************************************/
***************
*** 2724,2730 ****
      if ( max == 0 )
          return 0;
      
-     max = abs( max );    
      choice = 0;
  
      if ( max < 15 )
--- 2593,2598 ----
***************
*** 2755,2773 ****
  }
  
  
  /*************************************************************************/
  /*            bigv_bitcount                                              */
  /*************************************************************************/
  
  /*
  Function: Count the number of bits necessary to code the bigvalues region.
  */
  
! int bigv_bitcount( int ix[576], gr_info *gi )
  {
      int bits = 0;
      
!     if ( gi->window_switching_flag && gi->block_type == 2 )
      {
          /*
            Within each scalefactor band, data is given for successive
--- 2623,2647 ----
  }
  
  
+ 
  /*************************************************************************/
  /*            bigv_bitcount                                              */
  /*************************************************************************/
  
  /*
+ Function: Select huffman code tables for bigvalues regions 
  Function: Count the number of bits necessary to code the bigvalues region.
  */
  
! int bigv_bitcount( int ix[576], gr_info *cod_info )
  {
      int bits = 0;
+ 
+     cod_info->table_select[0] = 0;
+     cod_info->table_select[1] = 0;
+     cod_info->table_select[2] = 0;
      
!     if ( cod_info->window_switching_flag && (cod_info->block_type == 2) )
      {
          /*
            Within each scalefactor band, data is given for successive
***************
*** 2775,2792 ****
            Within each window, the quantized values are then arranged in
            order of increasing frequency...
            */
!         int sfb, window, line, start, end;
          I192_3 *ix_s;
  
-         if ( gi->mixed_block_flag )
-         {
-             unsigned int table;
  
!             if ( (table = gi->table_select[0]) != 0 )
!                 bits += count_bit( ix, 0, gi->address1, table );
!             sfb = 2;
          }
!         else
              sfb = 0;
  
          ix_s = (I192_3 *) &ix[0];
--- 2649,2692 ----
            Within each window, the quantized values are then arranged in
            order of increasing frequency...
            */
!         int sfb, window, line, start, end, max1, max2, x, y;
!         int region1Start;
!         int *pmax;
          I192_3 *ix_s;
  
  
!         region1Start = 12;
!         max1 = max2 = 0;
! 
!         for ( sfb = 0; sfb < 13; sfb++ )
!         {
!             start = scalefac_band_short[ sfb ];
!             end   = scalefac_band_short[ sfb+1 ];
!             
!             if ( start < region1Start )
!                 pmax = &max1;
!             else
!                 pmax = &max2;
!             
!             for ( window = 0; window < 3; window++ )
!                 for ( line = start; line < end; line += 2 )
!                 {
!                     x = ix[ (line * 3) + window ];
!                     y = ix[ ((line + 1) * 3) + window ];
!                     *pmax = *pmax > x ? *pmax : x;
!                     *pmax = *pmax > y ? *pmax : y;
!                 }
          }
!         cod_info->table_select[0] = choose_table( max1 );
!         cod_info->table_select[1] = choose_table( max2 );
! 
!         /*
!           Within each scalefactor band, data is given for successive
!           time windows, beginning with window 0 and ending with window 2.
!           Within each window, the quantized values are then arranged in
!           order of increasing frequency...
!           */
! 
              sfb = 0;
  
          ix_s = (I192_3 *) &ix[0];
***************
*** 2799,2808 ****
              end   = scalefac_band_short[ sfb+1 ];
  
              if ( start < 12 )
!                 tableindex = gi->table_select[ 0 ];
              else
!                 tableindex = gi->table_select[ 1 ];
!             assert( tableindex < 32 );
  
              for ( window = 0; window < 3; window++ )
                  for ( line = start; line < end; line += 2 )
--- 2699,2707 ----
              end   = scalefac_band_short[ sfb+1 ];
  
              if ( start < 12 )
!                 tableindex = cod_info->table_select[ 0 ];
              else
!                 tableindex = cod_info->table_select[ 1 ];
  
              for ( window = 0; window < 3; window++ )
                  for ( line = start; line < end; line += 2 )
***************
*** 2818,2830 ****
      else
      {
          unsigned int table;
          
!         if( (table=gi->table_select[0]) != 0 )  /* region0 */ 
!             bits += count_bit(ix, 0, gi->address1, table );
!         if( (table=gi->table_select[1]) != 0 )  /* region1 */ 
!             bits += count_bit(ix, gi->address1, gi->address2, table );
!         if( (table=gi->table_select[2]) != 0 )  /* region2 */ 
!             bits += count_bit(ix, gi->address2, gi->address3, table );
      }
      return bits;
  }
--- 2717,2744 ----
      else
      {
          unsigned int table;
+         int s;
          
!         if ( cod_info->address1 > 0 )
!         {
!             table = cod_info->table_select[0] = new_choose_table( ix, 0, cod_info->address1, &s );
!             if( table != 0 )  /* region0 */ 
!                bits += s;
!         }
! 
!         if ( cod_info->address2 > cod_info->address1 )
!         {
!             table = cod_info->table_select[1] = new_choose_table( ix, cod_info->address1, cod_info->address2, &s );
!            if( table != 0 )  /* region1 */ 
!                bits += s;
!         }
! 
!         if ( cod_info->big_values * 2 > cod_info->address2 )
!         {
!             table = cod_info->table_select[2] = new_choose_table( ix, cod_info->address2, cod_info->big_values * 2, &s );
!            if( table != 0 )  /* region2 */ 
!                bits += s;
!         }
      }
      return bits;
  }
***************
*** 2944,2959 ****
  void gr_deco( gr_info *cod_info )
  {
      if ( cod_info->window_switching_flag != 0 && cod_info->block_type == 2 )
-         if ( cod_info->mixed_block_flag == 0 )
          {
              cod_info->sfb_lmax = 0; /* No sb*/
              cod_info->sfb_smax = 0;
          }
-         else
-         {
-             cod_info->sfb_lmax = 8;
-             cod_info->sfb_smax = 3;
-         }
      else
      {
        /* MPEG 1 doesnt use last scalefactor band? */
--- 2858,2867 ----
***************
*** 2981,2993 ****
  int  *ix; /*  I576  *ix; */
  gr_info *cod_info;
  {
! int bits,max;
    calc_runlen(ix,cod_info);		/*rzero,count1,big_values*/
-   max = ix_max( ix, 0,576);
-   if(max > 8192) return 100000;         /* report unsuitable quantizer */
    bits = count1_bitcount(ix, cod_info); /*count1_table selection*/
    subdivide(cod_info);			/* bigvalues sfb division */
-   bigv_tab_select(ix,cod_info);		/* codebook selection*/
    bits += bigv_bitcount(ix,cod_info);	/* bit count */
  /* printf("\nglobal_gain = %f  bits= %d ",cod_info->quantizerStepSize,bits);*/
  return bits;
--- 2889,2903 ----
  int  *ix; /*  I576  *ix; */
  gr_info *cod_info;
  {
! int bits,i;
!   for ( i = 0; i < 576; i++ )
!   {
!      if ( ix[i] > 8191 + 14)
! 	return 100000;		/* report unsuitable quantizer */
!   }
    calc_runlen(ix,cod_info);		/*rzero,count1,big_values*/
    bits = count1_bitcount(ix, cod_info); /*count1_table selection*/
    subdivide(cod_info);			/* bigvalues sfb division */
    bits += bigv_bitcount(ix,cod_info);	/* bit count */
  /* printf("\nglobal_gain = %f  bits= %d ",cod_info->quantizerStepSize,bits);*/
  return bits;
***************
*** 2998,3004 ****
  int bin_search_StepSize(int desired_rate, double start, int *ix,
             double xrs[576], gr_info * cod_info)
  {
! double top,bot,next,last;
  int bit;
  top = start;
  bot = 200;
--- 2908,2914 ----
  int bin_search_StepSize(int desired_rate, double start, int *ix,
             double xrs[576], gr_info * cod_info)
  {
! int top,bot,next,last;
  int bit;
  top = start;
  bot = 200;
***************
*** 3006,3012 ****
  do
    {
    last = next;
!   next = aint((top+bot)/2.0);
    cod_info->quantizerStepSize = next;
    quantize(xrs,ix,cod_info);
    bit = count_bits(ix,cod_info);
--- 2916,2922 ----
  do
    {
    last = next;
!   next = (top+bot)/2;
    cod_info->quantizerStepSize = next;
    quantize(xrs,ix,cod_info);
    bit = count_bits(ix,cod_info);
***************
*** 3016,3022 ****
    printf("\n%f %f %f %f %d %d",start,next, top,bot,bit,desired_rate);
    */
    }
!   while ((bit != desired_rate) && fabs(last - next) > 1.0);
  /*
    printf("\n done  %f %d %d",next,bit,desired_rate);
  */
--- 2926,2932 ----
    printf("\n%f %f %f %f %d %d",start,next, top,bot,bit,desired_rate);
    */
    }
!   while ((bit != desired_rate) && abs(last - next) > 1);
  /*
    printf("\n done  %f %d %d",next,bit,desired_rate);
  */
----------
X-Sun-Data-Type: default
X-Sun-Data-Name: subs.diff
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 31

*** subs.c.1	Wed May 19 21:39:20 1999
--- subs.c	Thu May 20 17:35:36 1999
***************
*** 73,78 ****
--- 73,80 ----
  
  #define SQRT2   2*0.70710678118654752440084436210484
  
+ /* This is a simplified version for n an even power of 2 */
+ 
  static void fht(FLOAT *fz, int n)
  {
   int i,k,k1,k2,k3,k4,kx;
***************
*** 204,210 ****
         energy[i] = 0.0005;
         phi[i] = 0.0;
       }
!      else {
         phi[i] = atan2( b-a, b+a );
       }
   }
--- 206,213 ----
         energy[i] = 0.0005;
         phi[i] = 0.0;
       }
! /* If N==1024 we only use the angle of the first 6. */
!      else if(N!=1024 || i<6) {
         phi[i] = atan2( b-a, b+a );
       }
   }
----------
X-Sun-Data-Type: default
X-Sun-Data-Name: mdct.diff
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 776

*** mdct.c.1	Wed May 19 22:11:50 1999
--- mdct.c	Wed May 19 22:12:00 1999
***************
*** 54,62 ****
  	    /*
  	      Compensate for inversion in the analysis filter
  	    */
! 	    for ( band = 0; band < 32; band++ )
! 		for ( k = 0; k < 18; k++ )
! 		    if ( (band & 1) && (k & 1) )
  			(*sb_sample)[ch][gr+1][k][band] *= -1.0;
  	    
  	    /*
--- 54,61 ----
  	    /*
  	      Compensate for inversion in the analysis filter
  	    */
! 	    for ( band = 1; band < 32; band+=2 )
! 		for ( k = 1; k < 18; k+=2 )
  			(*sb_sample)[ch][gr+1][k][band] *= -1.0;
  	    
  	    /*
***************
*** 123,130 ****
    double sum;
    static double win[4][36];
    static int init = 0;
!   static double cos_s[6][12], cos_l[18][36];
!   static double fin[36];
  
    if ( init == 0 )
    {
--- 122,129 ----
    double sum;
    static double win[4][36];
    static int init = 0;
!   static double cos_s[6][12], cos_l[18][18];
!   static double fin[18];
  
    if ( init == 0 )
    {
***************
*** 149,176 ****
        win[3][i] = 1.0;
      for ( i = 18; i < 36; i++ )
        win[3][i] = sin( PI/36 * (i + 0.5) );
-     /* type 2*/
-     for ( i = 0; i < 12; i++ )
-     win[2][i] = sin( PI/12 * (i + 0.5) );
-     for ( i = 12; i < 36; i++ )
-       win[2][i] = 0.0;
  
      N = 12;
      for ( m = 0; m < N / 2; m++ )
        for ( k = 0; k < N; k++ )
          cos_s[m][k] = cos( (PI /(2 * N)) * (2 * k + 1 + N / 2) *
!                      (2 * m + 1) ) / (N / 4);
  
      N = 36;
      for ( m = 0; m < N / 2; m++ )
!       for ( k = 0; k < N; k++ )
          cos_l[m][k] = cos( (PI / (2 * N)) * (2 * k + 1 + N / 2) *
                       (2 * m + 1) ) / (N / 4);
! 
      init++;
    }
  
!   if ( block_type == 2 )
    {
      N = 12;
      for ( l = 0; l < 3; l++ )
--- 148,175 ----
        win[3][i] = 1.0;
      for ( i = 18; i < 36; i++ )
        win[3][i] = sin( PI/36 * (i + 0.5) );
  
      N = 12;
      for ( m = 0; m < N / 2; m++ )
        for ( k = 0; k < N; k++ )
          cos_s[m][k] = cos( (PI /(2 * N)) * (2 * k + 1 + N / 2) *
!                      (2 * m + 1) ) / (N / 4) * sin( PI/12 * (k + 0.5) );
  
      N = 36;
      for ( m = 0; m < N / 2; m++ )
!     {
!       for ( k = 0; k < 9; k++ )
!       {
          cos_l[m][k] = cos( (PI / (2 * N)) * (2 * k + 1 + N / 2) *
                       (2 * m + 1) ) / (N / 4);
!         cos_l[m][9+k] = cos( (PI / (2 * N)) * (2 * (18 + k) + 1 + N / 2) *
!                      (2 * m + 1) ) / (N / 4);
!       }
!     }
      init++;
    }
  
!   if ( block_type == 2)
    {
      N = 12;
      for ( l = 0; l < 3; l++ )
***************
*** 178,527 ****
        for ( m = 0; m < N / 2; m++ )
        {
          for ( sum = 0.0, k = 0; k < N; k++ )
!           sum += win[block_type][k] * in[k + 6 * l + 6] * cos_s[m][k];
          out[ 3 * m + l] = sum;
        }
      }
    }
!   else
    {
!   if (block_type!=0) { /* then it's a short->long or long->short block */
!     N = 36;
!     for (k=0;k<N;k++)
!       fin[k]=win[block_type][k]*in[k];
!     for ( m = 0; m < N / 2; m++ )
!     {
!       for ( sum = 0.0, k = 0; k < N; k++ )
!         sum += fin[k] * cos_l[m][k];
!       out[m] = sum;
!     }
!   }
! 	else /* block_type is 0.  This is a long->long transform */
!     {
!       N=36;
!       for (k=0;k<N;k++)
! 	fin[k]=win[0][k]*in[k];   /* do the f(k)*in(k) first. and save the results */
  
        /* 0 */  
!       sum = ( fin[0]-fin[17] ) * cos_l[0][0]; /* 17 */
!       sum += ( fin[1]-fin[16] ) * cos_l[0][1]; /* 15 */
!       sum += ( fin[2]-fin[15] ) * cos_l[0][2]; /* 13 */
!       sum += ( fin[3]-fin[14] ) * cos_l[0][3]; /* 11 */
!       sum += ( fin[4]-fin[13] ) * cos_l[0][4]; /* 9 */
!       sum += ( fin[5]-fin[12] ) * cos_l[0][5]; /* 7  */
!       sum += ( fin[6]-fin[11] ) * cos_l[0][6]; /* 5  */
!       sum += ( fin[7]-fin[10] ) * cos_l[0][7]; /* 3 */
!       sum += ( fin[8]-fin[9] ) * cos_l[0][8]; /* 1  */
!       sum += ( -fin[18]-fin[35] ) * -cos_l[0][18]; /* 19*/
!       sum += ( -fin[19]-fin[34] ) * -cos_l[0][19]; /* 21 */
!       sum += ( -fin[20]-fin[33] ) * -cos_l[0][20]; /* 23 */
!       sum += ( -fin[21]-fin[32] ) * -cos_l[0][21]; /*25 */
!       sum += ( -fin[22]-fin[31] ) * -cos_l[0][22]; /* 27 */
!       sum += ( -fin[23]-fin[30] ) * -cos_l[0][23]; /* 29 */
!       sum += ( -fin[24]-fin[29] ) * -cos_l[0][24]; /* 31*/
!       sum += ( -fin[25]-fin[28] ) * -cos_l[0][25]; /* 33 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[0][26]; /* 35 */    
        out[0]=sum; 
  
  
        /* 1 */
!       sum = ( -fin[2]-fin[3]+fin[14]+fin[15]-fin[26]-fin[27] ) * -cos_l[1][2];  /* mfc=3 2*/
!       sum += ( -fin[1]-fin[4]+fin[13]+fin[16]-fin[25]-fin[28] ) * -cos_l[1][1];  /* mfc=9 1*/
!       sum += ( -fin[0]-fin[5]+fin[12]+fin[17]-fin[24]-fin[29] ) * -cos_l[1][0];  /* mfc=15 0*/
!       sum += ( -fin[6]+fin[11]+fin[18]-fin[23]-fin[30]+fin[35] ) * -cos_l[1][6]; /* mfc=21 6*/
!       sum += ( -fin[7]+fin[10]+fin[19]-fin[22]-fin[31]+fin[34] ) * -cos_l[1][7]; /* mfc=27 7*/
!       sum += ( -fin[8]+fin[9]+fin[20]-fin[21]-fin[32]+fin[33] ) * -cos_l[1][8]; /* mfc = 28 8*/
        out[1]=sum;
  
        /* 2 */
!       sum = ( -fin[0]+fin[17] ) * -cos_l[2][0];  /* mfc 23 */
!       sum += ( -fin[1]+fin[16] ) * -cos_l[2][1];  /* mfc 33 */
!       sum += ( fin[2]-fin[15] ) * cos_l[2][2];   /* mfc 29 */
!       sum += ( fin[3]-fin[14] ) * cos_l[2][3];   /* mfc 19 */
!       sum += ( fin[4]-fin[13] ) * cos_l[2][4];   /* mfc 9  */
!       sum += ( fin[5]-fin[12] ) * cos_l[2][5];   /* mfc 1  */
!       sum += ( fin[6]-fin[11] ) * cos_l[2][6];   /* mfc 11 */
!       sum += ( fin[7]-fin[10] ) * cos_l[2][7];   /* mfc 21 */
!       sum += ( fin[8]-fin[9] ) * cos_l[2][8];    /* mfc 31 */
!       sum += ( fin[18]+fin[35] ) * cos_l[2][18]; /* mfc 13 */
!       sum += ( fin[19]+fin[34] ) * cos_l[2][19]; /* mfc 3  */
!       sum += ( fin[20]+fin[33] ) * cos_l[2][20]; /* mfc 7  */
!       sum += ( fin[21]+fin[32] ) * cos_l[2][21]; /* mfc 17 */
!       sum += ( fin[22]+fin[31] ) * cos_l[2][22]; /* mfc 27 */
!       sum += ( -fin[23]-fin[30] ) * -cos_l[2][23]; /* mfc 35 */
!       sum += ( -fin[24]-fin[29] ) * -cos_l[2][24]; /* mfc 25 */
!       sum += ( -fin[25]-fin[28] ) * -cos_l[2][25]; /* mfc 15 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[2][26]; /* mfc 5 */
        out[2]=sum;
  
        /* 3 */
!       sum = ( fin[0]-fin[17] ) * cos_l[3][0]; /* mfc 11 */
!       sum += ( fin[1]-fin[16] ) * cos_l[3][1]; /* mfc 3 */
!       sum += ( fin[2]-fin[15] ) * cos_l[3][2]; /* 17 */
!       sum += ( fin[3]-fin[14] ) * cos_l[3][3]; /* 31 */
!       sum += ( -fin[4]+fin[13] ) * -cos_l[3][4]; /* 27 */
!       sum += ( -fin[5]+fin[12] ) * -cos_l[3][5]; /* 13 */
!       sum += ( -fin[6]+fin[11] ) * -cos_l[3][6]; /* 1 */
!       sum += ( -fin[7]+fin[10] ) * -cos_l[3][7]; /* 15 */
!       sum += ( -fin[8]+fin[9] ) * -cos_l[3][8]; /* 29 */
!       sum += ( -fin[18]-fin[35] ) * -cos_l[3][18]; /* 25 */
!       sum += ( fin[19]+fin[34] ) * cos_l[3][19]; /* 33 */
!       sum += ( fin[20]+fin[33] ) * cos_l[3][20]; /* 19 */
!       sum += ( fin[21]+fin[32] ) * cos_l[3][21]; /* 5 */
!       sum += ( fin[22]+fin[31] ) * cos_l[3][22]; /* 9 */
!       sum += ( fin[23]+fin[30] ) * cos_l[3][23]; /* 23 */
!       sum += ( -fin[24]-fin[29] ) * -cos_l[3][24]; /* 35 */
!       sum += ( -fin[25]-fin[28] ) * -cos_l[3][25]; /* 21 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[3][26]; /* 7 */
        out[3]=sum;
  
        /* 4 */
        /* mfc 27 */
!       sum = ( fin[0]-fin[1]-fin[4]+fin[5]+fin[8]-fin[9]-fin[12]+fin[13]+fin[16]-fin[17] \
! 	       -fin[20]+fin[21]+fin[24]-fin[25]-fin[28]+fin[29]+fin[32]-fin[33] ) * cos_l[4][0];
        /* mfc 9 */
!       sum += ( -fin[2]-fin[3]+fin[6]+fin[7]-fin[10]-fin[11]+fin[14]+fin[15]-fin[18]-fin[19] \
! 	       +fin[22]+fin[23]-fin[26]-fin[27]+fin[30]+fin[31]-fin[34]-fin[35] ) * cos_l[4][6];
        out[4]=sum;
  
        /* 5 */
!       sum = ( -fin[0]+fin[17] ) * -cos_l[5][0]; /* 7 */
!       sum += ( -fin[1]+fin[16] ) * -cos_l[5][1]; /* 15 */
!       sum += ( fin[2]-fin[15] ) * cos_l[5][2]; /* 35 */
!       sum += ( fin[3]-fin[14] ) * cos_l[5][3]; /* 13 */
!       sum += ( fin[4]-fin[13] ) * cos_l[5][4]; /* 9 */
!       sum += ( fin[5]-fin[12] ) * cos_l[5][5]; /* 31 */
!       sum += ( -fin[6]+fin[11] ) * -cos_l[5][6]; /* 19 */
!       sum += ( -fin[7]+fin[10] ) * -cos_l[5][7]; /* 3 */
!       sum += ( -fin[8]+fin[9] ) * -cos_l[5][8]; /* 8 */
!       sum += ( fin[18]+fin[35] ) * cos_l[5][18]; /* 29 */
!       sum += ( -fin[19]-fin[34] ) * -cos_l[5][19]; /* 21 */
!       sum += ( -fin[20]-fin[33] ) * -cos_l[5][20]; /* 1 */
!       sum += ( -fin[21]-fin[32] ) * -cos_l[5][21]; /* 23 */
!       sum += ( fin[22]+fin[31] ) * cos_l[5][22]; /* 27 */
!       sum += ( fin[23]+fin[30] ) * cos_l[5][23]; /* 5 */
!       sum += ( fin[24]+fin[29] ) * cos_l[5][24]; /* 17 */
!       sum += ( -fin[25]-fin[28] ) * -cos_l[5][25]; /* 33 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[5][26]; /* 11 */
        out[5]=sum;
  
        /* 6 */
!       sum = ( -fin[0]+fin[17] ) * -cos_l[6][0]; /* 31 */
!       sum += ( fin[1]-fin[16] ) * cos_l[6][1]; /* 15 */
!       sum += ( fin[2]-fin[15] ) * cos_l[6][2]; /* 11 */
!       sum += ( -fin[3]+fin[14] ) * -cos_l[6][3]; /* 35 */
!       sum += ( -fin[4]+fin[13] ) * -cos_l[6][4]; /* 9 */
!       sum += ( -fin[5]+fin[12] ) * -cos_l[6][5]; /* 17 */
!       sum += ( fin[6]-fin[11] ) * cos_l[6][6]; /* 29 */
!       sum += ( fin[7]-fin[10] ) * cos_l[6][7]; /* 3 */
!       sum += ( fin[8]-fin[9] ) * cos_l[6][8]; /* 23 */
!       sum += ( fin[18]+fin[35] ) * cos_l[6][18]; /* 5 */
!       sum += ( fin[19]+fin[34] ) * cos_l[6][19]; /* 21 */
!       sum += ( -fin[20]-fin[33] ) * -cos_l[6][20]; /* 25 */
!       sum += ( -fin[21]-fin[32] ) * -cos_l[6][21]; /* 1 */
!       sum += ( -fin[22]-fin[31] ) * -cos_l[6][22]; /* 27 */
!       sum += ( fin[23]+fin[30] ) * cos_l[6][23]; /* 19 */
!       sum += ( fin[24]+fin[29] ) * cos_l[6][24]; /* 7 */
!       sum += ( fin[25]+fin[28] ) * cos_l[6][25]; /* 33 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[6][26]; /* 13 */    
        out[6]=sum;
  
        /* 7 */
!       sum = ( fin[0]+fin[5]-fin[12]-fin[17]+fin[24]+fin[29] ) * cos_l[7][0]; /* 3 */
!       sum += ( fin[1]+fin[4]-fin[13]-fin[16]+fin[25]+fin[28] ) * cos_l[7][1]; /* 27*/
!       sum += ( -fin[2]-fin[3]+fin[14]+fin[15]-fin[26]-fin[27] ) * -cos_l[7][2]; /* 15 */
!       sum += ( fin[6]-fin[11]-fin[18]+fin[23]+fin[30]-fin[35] ) * cos_l[7][6]; /* 33 */
!       sum += ( -fin[7]+fin[10]+fin[19]-fin[22]-fin[31]+fin[34] ) * -cos_l[7][7]; /* 9 */
!       sum += ( -fin[8]+fin[9]+fin[20]-fin[21]-fin[32]+fin[33] ) * -cos_l[7][8]; /* 21 */
        out[7]=sum;
  
        /* 8 */
!       sum = (  fin[0]-fin[17] ) * cos_l[8][0]; /* 35 */
!       sum += ( -fin[1]+fin[16] ) * -cos_l[8][1]; /* 3  */
!       sum += ( -fin[2]+fin[15] ) * -cos_l[8][2]; /* 31 */
!       sum += ( fin[3]-fin[14] ) * cos_l[8][3]; /*  7 */
!       sum += ( fin[4]-fin[13] ) * cos_l[8][4]; /* 27*/
!       sum += ( -fin[5]+fin[12] ) * -cos_l[8][5]; /* 11 */
!       sum += ( -fin[6]+fin[11] ) * -cos_l[8][6]; /* 23 */
!       sum += ( fin[7]-fin[10] ) * cos_l[8][7]; /* 15*/
!       sum += ( fin[8]-fin[9] ) * cos_l[8][8]; /* 19 */
!       sum += ( -fin[18]-fin[35] ) * -cos_l[8][18]; /* 1 */
!       sum += ( -fin[19]-fin[34] ) * -cos_l[8][19]; /* 33 */
!       sum += ( fin[20]+fin[33] ) * cos_l[8][20]; /*  5 */
!       sum += ( fin[21]+fin[32] ) * cos_l[8][21]; /* 29*/
!       sum += ( -fin[22]-fin[31] ) * -cos_l[8][22]; /*  9 */
!       sum += ( -fin[23]-fin[30] ) * -cos_l[8][23]; /* 25 */
!       sum += ( fin[24]+fin[29] ) * cos_l[8][24]; /* 13*/
!       sum += ( fin[25]+fin[28] ) * cos_l[8][25]; /* 21 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[8][26]; /* 17 */    
        out[8]=sum;
  
        /* 9 */
!       sum = ( -fin[0]+fin[17] ) * -cos_l[9][0]; /* 1  */
!       sum += ( fin[1]-fin[16] ) * cos_l[9][1]; /* 33 */
!       sum += ( fin[2]-fin[15] ) * cos_l[9][2]; /*  5 */
!       sum += ( -fin[3]+fin[14] ) * -cos_l[9][3]; /*  29*/
!       sum += ( -fin[4]+fin[13] ) * -cos_l[9][4]; /* 9 */
!       sum += ( fin[5]-fin[12] ) * cos_l[9][5]; /* 25 */
!       sum += ( fin[6]-fin[11] ) * cos_l[9][6]; /* 13 */
!       sum += ( -fin[7]+fin[10] ) * -cos_l[9][7]; /* 21*/
!       sum += ( -fin[8]+fin[9] ) * -cos_l[9][8]; /* 17 */
!       sum += ( -fin[18]-fin[35] ) * -cos_l[9][18]; /* 35*/
!       sum += ( -fin[19]-fin[34] ) * -cos_l[9][19]; /* 3  */
!       sum += ( fin[20]+fin[33] ) * cos_l[9][20]; /* 31 */
!       sum += ( fin[21]+fin[32] ) * cos_l[9][21]; /* 7 */
!       sum += ( -fin[22]-fin[31] ) * -cos_l[9][22]; /* 27 */
!       sum += ( -fin[23]-fin[30] ) * -cos_l[9][23]; /* 11 */
!       sum += ( fin[24]+fin[29] ) * cos_l[9][24]; /* 23*/
!       sum += ( fin[25]+fin[28] ) * cos_l[9][25]; /* 15 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[9][26]; /* 19 */    
        out[9]=sum; 
  
        /* 10 */
!       sum = ( fin[0]+fin[5]-fin[12]-fin[17]+fin[24]+fin[29] ) * cos_l[10][0]; /* 33 */
!       sum += ( fin[1]+fin[4]-fin[13]-fin[16]+fin[25]+fin[28] ) * cos_l[10][1]; /* 9 */
!       sum += ( -fin[2]-fin[3]+fin[14]+fin[15]-fin[26]-fin[27] ) * -cos_l[10][2]; /* 21 */
!       sum += ( -fin[6]+fin[11]+fin[18]-fin[23]-fin[30]+fin[35] ) * -cos_l[10][6]; /* 3 */
!       sum += ( fin[7]-fin[10]-fin[19]+fin[22]+fin[31]-fin[34] ) * cos_l[10][7]; /* 27 */
!       sum += ( fin[8]-fin[9]-fin[20]+fin[21]+fin[32]-fin[33] ) * cos_l[10][8]; /* 15 */
        out[10]=sum;
  
        /* 11 */
!       sum = ( fin[0]-fin[17] ) * cos_l[11][0]; /* 5  */
!       sum += ( -fin[1]+fin[16] ) * -cos_l[11][1]; /* 21 */
!       sum += ( -fin[2]+fin[15] ) * -cos_l[11][2]; /* 25 */
!       sum += ( fin[3]-fin[14] ) * cos_l[11][3]; /*  1 */
!       sum += ( -fin[4]+fin[13] ) * -cos_l[11][4]; /*27 */
!       sum += ( -fin[5]+fin[12] ) * -cos_l[11][5]; /* 19 */
!       sum += ( fin[6]-fin[11] ) * cos_l[11][6]; /* 7  */
!       sum += ( fin[7]-fin[10] ) * cos_l[11][7]; /* 33*/
!       sum += ( -fin[8]+fin[9] ) * -cos_l[11][8]; /* 13 */
!       sum += ( fin[18]+fin[35] ) * cos_l[11][18]; /* 31*/
!       sum += ( fin[19]+fin[34] ) * cos_l[11][19]; /* 15 */
!       sum += ( -fin[20]-fin[33] ) * -cos_l[11][20]; /* 11 */
!       sum += ( -fin[21]-fin[32] ) * -cos_l[11][21]; /*35 */
!       sum += ( fin[22]+fin[31] ) * cos_l[11][22]; /*  9 */
!       sum += ( -fin[23]-fin[30] ) * -cos_l[11][23]; /* 17 */
!       sum += ( -fin[24]-fin[29] ) * -cos_l[11][24]; /* 29*/
!       sum += ( fin[25]+fin[28] ) * cos_l[11][25]; /* 3  */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[11][26]; /* 23 */    
        out[11]=sum; 
  
        /* 12 */
!       sum = ( -fin[0]+fin[17] ) * -cos_l[12][0]; /* 29 */
!       sum += ( -fin[1]+fin[16] ) * -cos_l[12][1]; /* 21 */
!       sum += ( fin[2]-fin[15] ) * cos_l[12][2]; /* 1  */
!       sum += ( -fin[3]+fin[14] ) * -cos_l[12][3]; /* 23 */
!       sum += ( -fin[4]+fin[13] ) * -cos_l[12][4]; /*27 */
!       sum += ( fin[5]-fin[12] ) * cos_l[12][5]; /* 5  */
!       sum += ( -fin[6]+fin[11] ) * -cos_l[12][6]; /* 17 */
!       sum += ( -fin[7]+fin[10] ) * -cos_l[12][7]; /* 33*/
!       sum += ( fin[8]-fin[9] ) * cos_l[12][8]; /* 11 */
!       sum += ( -fin[18]-fin[35] ) * -cos_l[12][18]; /* 7 */
!       sum += ( fin[19]+fin[34] ) * cos_l[12][19]; /* 15 */
!       sum += ( fin[20]+fin[33] ) * cos_l[12][20]; /* 35 */
!       sum += ( -fin[21]-fin[32] ) * -cos_l[12][21]; /*13 */
!       sum += ( fin[22]+fin[31] ) * cos_l[12][22]; /*  9 */
!       sum += ( -fin[23]-fin[30] ) * -cos_l[12][23]; /* 31 */
!       sum += ( -fin[24]-fin[29] ) * -cos_l[12][24]; /* 19*/
!       sum += ( fin[25]+fin[28] ) * cos_l[12][25]; /* 3  */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[12][26]; /* 25 */    
        out[12]=sum; 
  
        /* 13 */
!       sum = ( -fin[0]+fin[1]+fin[4]-fin[5]-fin[8]+fin[9]+fin[12]-fin[13]-fin[16]+fin[17]+fin[20]-fin[21] \
! 	      -fin[24]+fin[25]+fin[28]-fin[29]-fin[32]+fin[33] ) * -cos_l[13][0]; /* 9 */
!       sum += ( -fin[2]-fin[3]+fin[6]+fin[7]-fin[10]-fin[11]+fin[14]+fin[15]-fin[18]-fin[19]+fin[22] \
! 	       +fin[23]-fin[26]-fin[27]+fin[30]+fin[31]-fin[34]-fin[35] ) * -cos_l[13][2]; /* 27 */
        out[13]=sum;
  
        /* 14 */
!       sum = ( fin[0]-fin[17] ) * cos_l[14][0]; /* 25 */
!       sum += ( fin[1]-fin[16] ) * cos_l[14][1]; /* 33 */
!       sum += ( -fin[2]+fin[15] ) * -cos_l[14][2]; /* 19 */
!       sum += ( fin[3]-fin[14] ) * cos_l[14][3]; /* 5  */
!       sum += ( -fin[4]+fin[13] ) * -cos_l[14][4]; /* 9 */
!       sum += ( fin[5]-fin[12] ) * cos_l[14][5]; /* 23 */
!       sum += ( fin[6]-fin[11] ) * cos_l[14][6]; /* 35 */
!       sum += ( -fin[7]+fin[10] ) * -cos_l[14][7]; /* 21*/
!       sum += ( fin[8]-fin[9] ) * cos_l[14][8]; /* 7  */
!       sum += ( fin[18]+fin[35] ) * cos_l[14][18]; /* 11*/
!       sum += ( -fin[19]-fin[34] ) * -cos_l[14][19]; /* 3  */
!       sum += ( fin[20]+fin[33] ) * cos_l[14][20]; /* 17 */
!       sum += ( -fin[21]-fin[32] ) * -cos_l[14][21]; /*31 */
!       sum += ( -fin[22]-fin[31] ) * -cos_l[14][22]; /* 27 */
!       sum += ( fin[23]+fin[30] ) * cos_l[14][23]; /* 13 */
!       sum += ( -fin[24]-fin[29] ) * -cos_l[14][24]; /* 1 */
!       sum += ( fin[25]+fin[28] ) * cos_l[14][25]; /* 15 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[14][26]; /* 29 */    
        out[14]=sum; 
  
        /* 15 */
!       sum = ( fin[0]-fin[17] ) * cos_l[15][0]; /* 13 */
!       sum += ( -fin[1]+fin[16] ) * -cos_l[15][1]; /* 3  */
!       sum += ( fin[2]-fin[15] ) * cos_l[15][2]; /* 7  */
!       sum += ( -fin[3]+fin[14] ) * -cos_l[15][3]; /* 17 */
!       sum += ( fin[4]-fin[13] ) * cos_l[15][4]; /* 27*/
!       sum += ( fin[5]-fin[12] ) * cos_l[15][5]; /* 35 */
!       sum += ( -fin[6]+fin[11] ) * -cos_l[15][6]; /* 25 */
!       sum += ( fin[7]-fin[10] ) * cos_l[15][7]; /* 15*/
!       sum += ( -fin[8]+fin[9] ) * -cos_l[15][8]; /* 5  */
!       sum += ( fin[18]+fin[35] ) * cos_l[15][18]; /* 23*/
!       sum += ( -fin[19]-fin[34] ) * -cos_l[15][19]; /* 33 */
!       sum += ( -fin[20]-fin[33] ) * -cos_l[15][20]; /* 29 */
!       sum += ( fin[21]+fin[32] ) * cos_l[15][21]; /*19 */
!       sum += ( -fin[22]-fin[31] ) * -cos_l[15][22]; /* 9  */
!       sum += ( fin[23]+fin[30] ) * cos_l[15][23]; /* 1  */
!       sum += ( -fin[24]-fin[29] ) * -cos_l[15][24]; /* 11*/
!       sum += ( fin[25]+fin[28] ) * cos_l[15][25]; /* 21 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[15][26]; /* 31 */    
        out[15]=sum; 
  
        /* 16 */
!       sum = ( -fin[0]-fin[5]+fin[12]+fin[17]-fin[24]-fin[29] ) * -cos_l[16][0]; /* 21 */
!       sum += ( fin[1]+fin[4]-fin[13]-fin[16]+fin[25]+fin[28] ) * cos_l[16][1];  /* 27 */
!       sum += ( -fin[2]-fin[3]+fin[14]+fin[15]-fin[26]-fin[27] ) * -cos_l[16][2]; /* 33 */
!       sum += ( fin[6]-fin[11]-fin[18]+fin[23]+fin[30]-fin[35] ) * cos_l[16][6]; /* 15 */
!       sum += ( -fin[7]+fin[10]+fin[19]-fin[22]-fin[31]+fin[34] ) * -cos_l[16][7]; /* 9 */
!       sum += ( fin[8]-fin[9]-fin[20]+fin[21]+fin[32]-fin[33] ) * cos_l[16][8]; /* 3 */
        out[16]=sum;
  
        /* 17 */
!       sum = ( -fin[0]+fin[17] ) * -cos_l[17][0]; /* 17 */
!       sum += ( fin[1]-fin[16] ) * cos_l[17][1]; /* 15 */
!       sum += ( -fin[2]+fin[15] ) * -cos_l[17][2]; /* 13 */
!       sum += ( fin[3]-fin[14] ) * cos_l[17][3]; /* 11 */
!       sum += ( -fin[4]+fin[13] ) * -cos_l[17][4]; /* 9 */
!       sum += ( fin[5]-fin[12] ) * cos_l[17][5]; /* 7  */
!       sum += ( -fin[6]+fin[11] ) * -cos_l[17][6]; /* 5  */
!       sum += ( fin[7]-fin[10] ) * cos_l[17][7]; /* 3 */
!       sum += ( -fin[8]+fin[9] ) * -cos_l[17][8]; /* 1  */
!       sum += ( -fin[18]-fin[35] ) * -cos_l[17][18]; /* 19*/
!       sum += ( fin[19]+fin[34] ) * cos_l[17][19]; /* 21 */
!       sum += ( -fin[20]-fin[33] ) * -cos_l[17][20]; /* 23 */
!       sum += ( fin[21]+fin[32] ) * cos_l[17][21]; /*25 */
!       sum += ( -fin[22]-fin[31] ) * -cos_l[17][22]; /* 27 */
!       sum += ( fin[23]+fin[30] ) * cos_l[17][23]; /* 29 */
!       sum += ( -fin[24]-fin[29] ) * -cos_l[17][24]; /* 31*/
!       sum += ( fin[25]+fin[28] ) * cos_l[17][25]; /* 33 */
!       sum += ( -fin[26]-fin[27] ) * -cos_l[17][26]; /* 35 */    
        out[17]=sum; 
!     }
!   }
  }
  
- void
- delay( double (*xr)[2][576], int stereo )
- {
-     static double xr_buff[2][576];
-     double xr_buff2[2][576];
-     unsigned int i,j;
-     
-     for (i=0;i<stereo;i++)
-     {
- 	for (j=0;j<576;j++) xr_buff2[i][j] = xr_buff[i][j];
- 	for (j=0;j<576;j++) xr_buff[i][j]  = xr[1][i][j];
- 	for (j=0;j<576;j++) xr[1][i][j]    = xr[0][i][j];
- 	for (j=0;j<576;j++) xr[0][i][j]    = xr_buff2[i][j];
-     }
- }
--- 177,499 ----
        for ( m = 0; m < N / 2; m++ )
        {
          for ( sum = 0.0, k = 0; k < N; k++ )
!           sum += in[k + 6 * l + 6] * cos_s[m][k];
          out[ 3 * m + l] = sum;
        }
      }
    }
!   else 
    {
!       for (k=0;k<9;k++)
!       {
! 	 fin[k] = win[block_type][k] * in[k] - win[block_type][17-k] * in[17-k];
! 	 fin[9+k] = win[block_type][18+k] * in[18+k] + win[block_type][35-k] * in[35-k];
!       }
  
        /* 0 */  
!       sum = ( fin[0] ) * cos_l[0][0]; /* 17 */
!       sum += ( fin[1] ) * cos_l[0][1]; /* 15 */
!       sum += ( fin[2] ) * cos_l[0][2]; /* 13 */
!       sum += ( fin[3] ) * cos_l[0][3]; /* 11 */
!       sum += ( fin[4] ) * cos_l[0][4]; /* 9 */
!       sum += ( fin[5] ) * cos_l[0][5]; /* 7  */
!       sum += ( fin[6] ) * cos_l[0][6]; /* 5  */
!       sum += ( fin[7] ) * cos_l[0][7]; /* 3 */
!       sum += ( fin[8] ) * cos_l[0][8]; /* 1  */
!       sum += ( -fin[9] ) * -cos_l[0][9]; /* 19*/
!       sum += ( -fin[10] ) * -cos_l[0][10]; /* 21 */
!       sum += ( -fin[11] ) * -cos_l[0][11]; /* 23 */
!       sum += ( -fin[12] ) * -cos_l[0][12]; /*25 */
!       sum += ( -fin[13] ) * -cos_l[0][13]; /* 27 */
!       sum += ( -fin[14] ) * -cos_l[0][14]; /* 29 */
!       sum += ( -fin[15] ) * -cos_l[0][15]; /* 31*/
!       sum += ( -fin[16] ) * -cos_l[0][16]; /* 33 */
!       sum += ( -fin[17] ) * -cos_l[0][17]; /* 35 */    
        out[0]=sum; 
  
  
        /* 1 */
!       sum = ( -fin[2]-fin[3]-fin[17] ) * -cos_l[1][2];  /* mfc=3 2*/
!       sum += ( -fin[1]-fin[4]-fin[16] ) * -cos_l[1][1];  /* mfc=9 1*/
!       sum += ( -fin[0]-fin[5]-fin[15] ) * -cos_l[1][0];  /* mfc=15 0*/
!       sum += ( -fin[6]+fin[9]-fin[14] ) * -cos_l[1][6]; /* mfc=21 6*/
!       sum += ( -fin[7]+fin[10]-fin[13] ) * -cos_l[1][7]; /* mfc=27 7*/
!       sum += ( -fin[8]+fin[11]-fin[12] ) * -cos_l[1][8]; /* mfc = 28 8*/
        out[1]=sum;
  
        /* 2 */
!       sum = ( -fin[0] ) * -cos_l[2][0];  /* mfc 23 */
!       sum += ( -fin[1] ) * -cos_l[2][1];  /* mfc 33 */
!       sum += ( fin[2] ) * cos_l[2][2];   /* mfc 29 */
!       sum += ( fin[3] ) * cos_l[2][3];   /* mfc 19 */
!       sum += ( fin[4] ) * cos_l[2][4];   /* mfc 9  */
!       sum += ( fin[5] ) * cos_l[2][5];   /* mfc 1  */
!       sum += ( fin[6] ) * cos_l[2][6];   /* mfc 11 */
!       sum += ( fin[7] ) * cos_l[2][7];   /* mfc 21 */
!       sum += ( fin[8] ) * cos_l[2][8];    /* mfc 31 */
!       sum += ( fin[9] ) * cos_l[2][9]; /* mfc 13 */
!       sum += ( fin[10] ) * cos_l[2][10]; /* mfc 3  */
!       sum += ( fin[11] ) * cos_l[2][11]; /* mfc 7  */
!       sum += ( fin[12] ) * cos_l[2][12]; /* mfc 17 */
!       sum += ( fin[13] ) * cos_l[2][13]; /* mfc 27 */
!       sum += ( -fin[14] ) * -cos_l[2][14]; /* mfc 35 */
!       sum += ( -fin[15] ) * -cos_l[2][15]; /* mfc 25 */
!       sum += ( -fin[16] ) * -cos_l[2][16]; /* mfc 15 */
!       sum += ( -fin[17] ) * -cos_l[2][17]; /* mfc 5 */
        out[2]=sum;
  
        /* 3 */
!       sum = ( fin[0] ) * cos_l[3][0]; /* mfc 11 */
!       sum += ( fin[1] ) * cos_l[3][1]; /* mfc 3 */
!       sum += ( fin[2] ) * cos_l[3][2]; /* 17 */
!       sum += ( fin[3] ) * cos_l[3][3]; /* 31 */
!       sum += ( -fin[4] ) * -cos_l[3][4]; /* 27 */
!       sum += ( -fin[5] ) * -cos_l[3][5]; /* 13 */
!       sum += ( -fin[6] ) * -cos_l[3][6]; /* 1 */
!       sum += ( -fin[7] ) * -cos_l[3][7]; /* 15 */
!       sum += ( -fin[8] ) * -cos_l[3][8]; /* 29 */
!       sum += ( -fin[9] ) * -cos_l[3][9]; /* 25 */
!       sum += ( fin[10] ) * cos_l[3][10]; /* 33 */
!       sum += ( fin[11] ) * cos_l[3][11]; /* 19 */
!       sum += ( fin[12] ) * cos_l[3][12]; /* 5 */
!       sum += ( fin[13] ) * cos_l[3][13]; /* 9 */
!       sum += ( fin[14] ) * cos_l[3][14]; /* 23 */
!       sum += ( -fin[15] ) * -cos_l[3][15]; /* 35 */
!       sum += ( -fin[16] ) * -cos_l[3][16]; /* 21 */
!       sum += ( -fin[17] ) * -cos_l[3][17]; /* 7 */
        out[3]=sum;
  
        /* 4 */
        /* mfc 27 */
!       sum = ( fin[0]-fin[1]-fin[4]+fin[5]+fin[8] \
! 	       -fin[11]+fin[12]+fin[15]-fin[16] ) * cos_l[4][0];
        /* mfc 9 */
!       sum += ( -fin[2]-fin[3]+fin[6]+fin[7]-fin[9]-fin[10] \
! 	       +fin[13]+fin[14]-fin[17] ) * cos_l[4][6];
        out[4]=sum;
  
        /* 5 */
!       sum = ( -fin[0] ) * -cos_l[5][0]; /* 7 */
!       sum += ( -fin[1] ) * -cos_l[5][1]; /* 15 */
!       sum += ( fin[2] ) * cos_l[5][2]; /* 35 */
!       sum += ( fin[3] ) * cos_l[5][3]; /* 13 */
!       sum += ( fin[4] ) * cos_l[5][4]; /* 9 */
!       sum += ( fin[5] ) * cos_l[5][5]; /* 31 */
!       sum += ( -fin[6] ) * -cos_l[5][6]; /* 19 */
!       sum += ( -fin[7] ) * -cos_l[5][7]; /* 3 */
!       sum += ( -fin[8] ) * -cos_l[5][8]; /* 8 */
!       sum += ( fin[9] ) * cos_l[5][9]; /* 29 */
!       sum += ( -fin[10] ) * -cos_l[5][10]; /* 21 */
!       sum += ( -fin[11] ) * -cos_l[5][11]; /* 1 */
!       sum += ( -fin[12] ) * -cos_l[5][12]; /* 23 */
!       sum += ( fin[13] ) * cos_l[5][13]; /* 27 */
!       sum += ( fin[14] ) * cos_l[5][14]; /* 5 */
!       sum += ( fin[15] ) * cos_l[5][15]; /* 17 */
!       sum += ( -fin[16] ) * -cos_l[5][16]; /* 33 */
!       sum += ( -fin[17] ) * -cos_l[5][17]; /* 11 */
        out[5]=sum;
  
        /* 6 */
!       sum = ( -fin[0] ) * -cos_l[6][0]; /* 31 */
!       sum += ( fin[1] ) * cos_l[6][1]; /* 15 */
!       sum += ( fin[2] ) * cos_l[6][2]; /* 11 */
!       sum += ( -fin[3] ) * -cos_l[6][3]; /* 35 */
!       sum += ( -fin[4] ) * -cos_l[6][4]; /* 9 */
!       sum += ( -fin[5] ) * -cos_l[6][5]; /* 17 */
!       sum += ( fin[6] ) * cos_l[6][6]; /* 29 */
!       sum += ( fin[7] ) * cos_l[6][7]; /* 3 */
!       sum += ( fin[8] ) * cos_l[6][8]; /* 23 */
!       sum += ( fin[9] ) * cos_l[6][9]; /* 5 */
!       sum += ( fin[10] ) * cos_l[6][10]; /* 21 */
!       sum += ( -fin[11] ) * -cos_l[6][11]; /* 25 */
!       sum += ( -fin[12] ) * -cos_l[6][12]; /* 1 */
!       sum += ( -fin[13] ) * -cos_l[6][13]; /* 27 */
!       sum += ( fin[14] ) * cos_l[6][14]; /* 19 */
!       sum += ( fin[15] ) * cos_l[6][15]; /* 7 */
!       sum += ( fin[16] ) * cos_l[6][16]; /* 33 */
!       sum += ( -fin[17] ) * -cos_l[6][17]; /* 13 */    
        out[6]=sum;
  
        /* 7 */
!       sum = ( fin[0]+fin[5]+fin[15] ) * cos_l[7][0]; /* 3 */
!       sum += ( fin[1]+fin[4]+fin[16] ) * cos_l[7][1]; /* 27*/
!       sum += ( -fin[2]-fin[3]-fin[17] ) * -cos_l[7][2]; /* 15 */
!       sum += ( fin[6]-fin[9]+fin[14] ) * cos_l[7][6]; /* 33 */
!       sum += ( -fin[7]+fin[10]-fin[13] ) * -cos_l[7][7]; /* 9 */
!       sum += ( -fin[8]+fin[11]-fin[12] ) * -cos_l[7][8]; /* 21 */
        out[7]=sum;
  
        /* 8 */
!       sum = (  fin[0] ) * cos_l[8][0]; /* 35 */
!       sum += ( -fin[1] ) * -cos_l[8][1]; /* 3  */
!       sum += ( -fin[2] ) * -cos_l[8][2]; /* 31 */
!       sum += ( fin[3] ) * cos_l[8][3]; /*  7 */
!       sum += ( fin[4] ) * cos_l[8][4]; /* 27*/
!       sum += ( -fin[5] ) * -cos_l[8][5]; /* 11 */
!       sum += ( -fin[6] ) * -cos_l[8][6]; /* 23 */
!       sum += ( fin[7] ) * cos_l[8][7]; /* 15*/
!       sum += ( fin[8] ) * cos_l[8][8]; /* 19 */
!       sum += ( -fin[9] ) * -cos_l[8][9]; /* 1 */
!       sum += ( -fin[10] ) * -cos_l[8][10]; /* 33 */
!       sum += ( fin[11] ) * cos_l[8][11]; /*  5 */
!       sum += ( fin[12] ) * cos_l[8][12]; /* 29*/
!       sum += ( -fin[13] ) * -cos_l[8][13]; /*  9 */
!       sum += ( -fin[14] ) * -cos_l[8][14]; /* 25 */
!       sum += ( fin[15] ) * cos_l[8][15]; /* 13*/
!       sum += ( fin[16] ) * cos_l[8][16]; /* 21 */
!       sum += ( -fin[17] ) * -cos_l[8][17]; /* 17 */    
        out[8]=sum;
  
        /* 9 */
!       sum = ( -fin[0] ) * -cos_l[9][0]; /* 1  */
!       sum += ( fin[1] ) * cos_l[9][1]; /* 33 */
!       sum += ( fin[2] ) * cos_l[9][2]; /*  5 */
!       sum += ( -fin[3] ) * -cos_l[9][3]; /*  29*/
!       sum += ( -fin[4] ) * -cos_l[9][4]; /* 9 */
!       sum += ( fin[5] ) * cos_l[9][5]; /* 25 */
!       sum += ( fin[6] ) * cos_l[9][6]; /* 13 */
!       sum += ( -fin[7] ) * -cos_l[9][7]; /* 21*/
!       sum += ( -fin[8] ) * -cos_l[9][8]; /* 17 */
!       sum += ( -fin[9] ) * -cos_l[9][9]; /* 35*/
!       sum += ( -fin[10] ) * -cos_l[9][10]; /* 3  */
!       sum += ( fin[11] ) * cos_l[9][11]; /* 31 */
!       sum += ( fin[12] ) * cos_l[9][12]; /* 7 */
!       sum += ( -fin[13] ) * -cos_l[9][13]; /* 27 */
!       sum += ( -fin[14] ) * -cos_l[9][14]; /* 11 */
!       sum += ( fin[15] ) * cos_l[9][15]; /* 23*/
!       sum += ( fin[16] ) * cos_l[9][16]; /* 15 */
!       sum += ( -fin[17] ) * -cos_l[9][17]; /* 19 */    
        out[9]=sum; 
  
        /* 10 */
!       sum = ( fin[0]+fin[5]+fin[15] ) * cos_l[10][0]; /* 33 */
!       sum += ( fin[1]+fin[4]+fin[16] ) * cos_l[10][1]; /* 9 */
!       sum += ( -fin[2]-fin[3]-fin[17] ) * -cos_l[10][2]; /* 21 */
!       sum += ( -fin[6]+fin[9]-fin[14] ) * -cos_l[10][6]; /* 3 */
!       sum += ( fin[7]-fin[10]+fin[13] ) * cos_l[10][7]; /* 27 */
!       sum += ( fin[8]-fin[11]+fin[12] ) * cos_l[10][8]; /* 15 */
        out[10]=sum;
  
        /* 11 */
!       sum = ( fin[0] ) * cos_l[11][0]; /* 5  */
!       sum += ( -fin[1] ) * -cos_l[11][1]; /* 21 */
!       sum += ( -fin[2] ) * -cos_l[11][2]; /* 25 */
!       sum += ( fin[3] ) * cos_l[11][3]; /*  1 */
!       sum += ( -fin[4] ) * -cos_l[11][4]; /*27 */
!       sum += ( -fin[5] ) * -cos_l[11][5]; /* 19 */
!       sum += ( fin[6] ) * cos_l[11][6]; /* 7  */
!       sum += ( fin[7] ) * cos_l[11][7]; /* 33*/
!       sum += ( -fin[8] ) * -cos_l[11][8]; /* 13 */
!       sum += ( fin[9] ) * cos_l[11][9]; /* 31*/
!       sum += ( fin[10] ) * cos_l[11][10]; /* 15 */
!       sum += ( -fin[11] ) * -cos_l[11][11]; /* 11 */
!       sum += ( -fin[12] ) * -cos_l[11][12]; /*35 */
!       sum += ( fin[13] ) * cos_l[11][13]; /*  9 */
!       sum += ( -fin[14] ) * -cos_l[11][14]; /* 17 */
!       sum += ( -fin[15] ) * -cos_l[11][15]; /* 29*/
!       sum += ( fin[16] ) * cos_l[11][16]; /* 3  */
!       sum += ( -fin[17] ) * -cos_l[11][17]; /* 23 */    
        out[11]=sum; 
  
        /* 12 */
!       sum = ( -fin[0] ) * -cos_l[12][0]; /* 29 */
!       sum += ( -fin[1] ) * -cos_l[12][1]; /* 21 */
!       sum += ( fin[2] ) * cos_l[12][2]; /* 1  */
!       sum += ( -fin[3] ) * -cos_l[12][3]; /* 23 */
!       sum += ( -fin[4] ) * -cos_l[12][4]; /*27 */
!       sum += ( fin[5] ) * cos_l[12][5]; /* 5  */
!       sum += ( -fin[6] ) * -cos_l[12][6]; /* 17 */
!       sum += ( -fin[7] ) * -cos_l[12][7]; /* 33*/
!       sum += ( fin[8] ) * cos_l[12][8]; /* 11 */
!       sum += ( -fin[9] ) * -cos_l[12][9]; /* 7 */
!       sum += ( fin[10] ) * cos_l[12][10]; /* 15 */
!       sum += ( fin[11] ) * cos_l[12][11]; /* 35 */
!       sum += ( -fin[12] ) * -cos_l[12][12]; /*13 */
!       sum += ( fin[13] ) * cos_l[12][13]; /*  9 */
!       sum += ( -fin[14] ) * -cos_l[12][14]; /* 31 */
!       sum += ( -fin[15] ) * -cos_l[12][15]; /* 19*/
!       sum += ( fin[16] ) * cos_l[12][16]; /* 3  */
!       sum += ( -fin[17] ) * -cos_l[12][17]; /* 25 */    
        out[12]=sum; 
  
        /* 13 */
!       sum = ( -fin[0]+fin[1]+fin[4]-fin[5]-fin[8]+fin[11]-fin[12] \
! 	      -fin[15]+fin[16] ) * -cos_l[13][0]; /* 9 */
!       sum += ( -fin[2]-fin[3]+fin[6]+fin[7]-fin[9]-fin[10]+fin[13] \
! 	       +fin[14]-fin[17] ) * -cos_l[13][2]; /* 27 */
        out[13]=sum;
  
        /* 14 */
!       sum = ( fin[0] ) * cos_l[14][0]; /* 25 */
!       sum += ( fin[1] ) * cos_l[14][1]; /* 33 */
!       sum += ( -fin[2] ) * -cos_l[14][2]; /* 19 */
!       sum += ( fin[3] ) * cos_l[14][3]; /* 5  */
!       sum += ( -fin[4] ) * -cos_l[14][4]; /* 9 */
!       sum += ( fin[5] ) * cos_l[14][5]; /* 23 */
!       sum += ( fin[6] ) * cos_l[14][6]; /* 35 */
!       sum += ( -fin[7] ) * -cos_l[14][7]; /* 21*/
!       sum += ( fin[8] ) * cos_l[14][8]; /* 7  */
!       sum += ( fin[9] ) * cos_l[14][9]; /* 11*/
!       sum += ( -fin[10] ) * -cos_l[14][10]; /* 3  */
!       sum += ( fin[11] ) * cos_l[14][11]; /* 17 */
!       sum += ( -fin[12] ) * -cos_l[14][12]; /*31 */
!       sum += ( -fin[13] ) * -cos_l[14][13]; /* 27 */
!       sum += ( fin[14] ) * cos_l[14][14]; /* 13 */
!       sum += ( -fin[15] ) * -cos_l[14][15]; /* 1 */
!       sum += ( fin[16] ) * cos_l[14][16]; /* 15 */
!       sum += ( -fin[17] ) * -cos_l[14][17]; /* 29 */    
        out[14]=sum; 
  
        /* 15 */
!       sum = ( fin[0] ) * cos_l[15][0]; /* 13 */
!       sum += ( -fin[1] ) * -cos_l[15][1]; /* 3  */
!       sum += ( fin[2] ) * cos_l[15][2]; /* 7  */
!       sum += ( -fin[3] ) * -cos_l[15][3]; /* 17 */
!       sum += ( fin[4] ) * cos_l[15][4]; /* 27*/
!       sum += ( fin[5] ) * cos_l[15][5]; /* 35 */
!       sum += ( -fin[6] ) * -cos_l[15][6]; /* 25 */
!       sum += ( fin[7] ) * cos_l[15][7]; /* 15*/
!       sum += ( -fin[8] ) * -cos_l[15][8]; /* 5  */
!       sum += ( fin[9] ) * cos_l[15][9]; /* 23*/
!       sum += ( -fin[10] ) * -cos_l[15][10]; /* 33 */
!       sum += ( -fin[11] ) * -cos_l[15][11]; /* 29 */
!       sum += ( fin[12] ) * cos_l[15][12]; /*19 */
!       sum += ( -fin[13] ) * -cos_l[15][13]; /* 9  */
!       sum += ( fin[14] ) * cos_l[15][14]; /* 1  */
!       sum += ( -fin[15] ) * -cos_l[15][15]; /* 11*/
!       sum += ( fin[16] ) * cos_l[15][16]; /* 21 */
!       sum += ( -fin[17] ) * -cos_l[15][17]; /* 31 */    
        out[15]=sum; 
  
        /* 16 */
!       sum = ( -fin[0]-fin[5]-fin[15] ) * -cos_l[16][0]; /* 21 */
!       sum += ( fin[1]+fin[4]+fin[16] ) * cos_l[16][1];  /* 27 */
!       sum += ( -fin[2]-fin[3]-fin[17] ) * -cos_l[16][2]; /* 33 */
!       sum += ( fin[6]-fin[9]+fin[14] ) * cos_l[16][6]; /* 15 */
!       sum += ( -fin[7]+fin[10]-fin[13] ) * -cos_l[16][7]; /* 9 */
!       sum += ( fin[8]-fin[11]+fin[12] ) * cos_l[16][8]; /* 3 */
        out[16]=sum;
  
        /* 17 */
!       sum = ( -fin[0] ) * -cos_l[17][0]; /* 17 */
!       sum += ( fin[1] ) * cos_l[17][1]; /* 15 */
!       sum += ( -fin[2] ) * -cos_l[17][2]; /* 13 */
!       sum += ( fin[3] ) * cos_l[17][3]; /* 11 */
!       sum += ( -fin[4] ) * -cos_l[17][4]; /* 9 */
!       sum += ( fin[5] ) * cos_l[17][5]; /* 7  */
!       sum += ( -fin[6] ) * -cos_l[17][6]; /* 5  */
!       sum += ( fin[7] ) * cos_l[17][7]; /* 3 */
!       sum += ( -fin[8] ) * -cos_l[17][8]; /* 1  */
!       sum += ( -fin[9] ) * -cos_l[17][9]; /* 19*/
!       sum += ( fin[10] ) * cos_l[17][10]; /* 21 */
!       sum += ( -fin[11] ) * -cos_l[17][11]; /* 23 */
!       sum += ( fin[12] ) * cos_l[17][12]; /*25 */
!       sum += ( -fin[13] ) * -cos_l[17][13]; /* 27 */
!       sum += ( fin[14] ) * cos_l[17][14]; /* 29 */
!       sum += ( -fin[15] ) * -cos_l[17][15]; /* 31*/
!       sum += ( fin[16] ) * cos_l[17][16]; /* 33 */
!       sum += ( -fin[17] ) * -cos_l[17][17]; /* 35 */    
        out[17]=sum; 
!    }
  }
  
----------
X-Sun-Data-Type: default
X-Sun-Data-Name: encode.diff
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 143

*** encode.c.1	Wed May 19 21:46:42 1999
--- encode.c	Thu May 20 18:20:06 1999
***************
*** 220,238 ****
  ************************************************************************/
   
  void window_subband(buffer, z, k)
! short FAR **buffer;
! double FAR z[HAN_SIZE];
  int k;
  {
      typedef double FAR XX[2][HAN_SIZE];
      static XX FAR *x;
      int i, j;
      static int off[2] = {0,0};
      static char init = 0;
-     static double FAR *c;
      if (!init) {
-         c = (double FAR *) mem_alloc(sizeof(double) * HAN_SIZE, "window");
-         read_ana_window(c);
          x = (XX FAR *) mem_alloc(sizeof(XX),"x");
          for (i=0;i<2;i++)
              for (j=0;j<HAN_SIZE;j++)
--- 220,236 ----
  ************************************************************************/
   
  void window_subband(buffer, z, k)
! short **buffer;
! double z[HAN_SIZE];
  int k;
  {
      typedef double FAR XX[2][HAN_SIZE];
      static XX FAR *x;
+     double *xk;
      int i, j;
      static int off[2] = {0,0};
      static char init = 0;
      if (!init) {
          x = (XX FAR *) mem_alloc(sizeof(XX),"x");
          for (i=0;i<2;i++)
              for (j=0;j<HAN_SIZE;j++)
***************
*** 239,249 ****
                  (*x)[i][j] = 0;
          init = 1;
      }
  
      /* replace 32 oldest samples with 32 new samples */
!     for (i=0;i<32;i++) (*x)[k][31-i+off[k]] = (double) *(*buffer)++/SCALE;
      /* shift samples into proper window positions */
!     for (i=0;i<HAN_SIZE;i++) z[i] = (*x)[k][(i+off[k])&HAN_SIZE-1] * c[i];
      off[k] += 480;              /*offset is modulo (HAN_SIZE-1)*/
      off[k] &= HAN_SIZE-1;
  
--- 237,248 ----
                  (*x)[i][j] = 0;
          init = 1;
      }
+     xk=(*x)[k];
  
      /* replace 32 oldest samples with 32 new samples */
!     for (i=0;i<32;i++) /*(*x)[k]*/xk[31-i+off[k]] = (double) *(*buffer)++/SCALE;
      /* shift samples into proper window positions */
!     for (i=0;i<HAN_SIZE;i++) z[i] = xk[(i+off[k])&HAN_SIZE-1] * enwindow[i];
      off[k] += 480;              /*offset is modulo (HAN_SIZE-1)*/
      off[k] &= HAN_SIZE-1;
  
***************
*** 263,268 ****
--- 262,285 ----
  *
  ************************************************************************/
  
+ 
+ /*#define NORING*/
+ /* define NORING to use the MDCT from Fredrik Noring <[EMAIL PROTECTED]>
+  * actually seems to be about 10% slower than we have.  
+  */
+ 
+ #ifdef NORING
+ extern void mfct(double *, double *);
+ void filter_subband(z,s)
+ double FAR z[HAN_SIZE], s[SBLIMIT];
+ {
+   double y[64];
+   int i,j;
+   
+   for (i=0;i<64;i++) for (j=0, y[i] = 0;j<8;j++) y[i] += z[i+64*j];
+   mfct(y, s);
+ }
+ #else
  void
  create_dct_matrix( filter )
  double filter[16][32];
***************
*** 271,281 ****
   
    for (i=0; i<16; i++)
      for (k=0; k<32; k++) {
!       if ((filter[i][k] = 1e9*cos((double)((2*i+1)*k*PI64))) >= 0)
! 	modf(filter[i][k]+0.5, &filter[i][k]);
!       else
! 	modf(filter[i][k]-0.5, &filter[i][k]);
!       filter[i][k] *= 1e-9;
      }
  }
  
--- 288,294 ----
   
    for (i=0; i<16; i++)
      for (k=0; k<32; k++) {
!        filter[i][k] = cos((double)((2*i+1)*k*PI64));
      }
  }
  
***************
*** 302,326 ****
    }
  }
  
- /*#define NORING*/
- /* define NORING to use the MDCT from Fredrik Noring <[EMAIL PROTECTED]>
-  * actually seems to be about 10% slower than we have.  
-  */
- 
- #ifdef NORING
- extern void mfct(double *, double *);
  void filter_subband(z,s)
  double FAR z[HAN_SIZE], s[SBLIMIT];
- {
-   double y[64];
-   int i,j;
-   
-   for (i=0;i<64;i++) for (j=0, y[i] = 0;j<8;j++) y[i] += z[i+64*j];
-   mfct(y, s);
- }
- #else
- void filter_subband(z,s)
- double FAR z[HAN_SIZE], s[SBLIMIT];
  {
     double y[64],yprime[32];
     int i,j;
--- 315,322 ----
----------
X-Sun-Data-Type: default
X-Sun-Data-Name: encode.diff
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 176

*** encode.c.1	Wed May 19 21:46:42 1999
--- encode.c	Thu May 20 18:25:23 1999
***************
*** 189,212 ****
   
  /************************************************************************
  *
- * read_ana_window()
- *
- * PURPOSE:  Reads encoder window file "enwindow" into array #ana_win#
- *
- ************************************************************************/
- 
- extern double enwindow[];
- 
- void read_ana_window(ana_win)
- double FAR ana_win[HAN_SIZE];
- {
-   int i;
-   for (i = 0; i<HAN_SIZE; i++) 
-     ana_win[i] = enwindow[i];
- }
- 
- /************************************************************************
- *
  * window_subband()
  *
  * PURPOSE:  Overlapping window on PCM samples
--- 189,194 ----
***************
*** 218,238 ****
  * windowed sample #z#
  *
  ************************************************************************/
!  
  void window_subband(buffer, z, k)
! short FAR **buffer;
! double FAR z[HAN_SIZE];
  int k;
  {
      typedef double FAR XX[2][HAN_SIZE];
      static XX FAR *x;
      int i, j;
      static int off[2] = {0,0};
      static char init = 0;
-     static double FAR *c;
      if (!init) {
-         c = (double FAR *) mem_alloc(sizeof(double) * HAN_SIZE, "window");
-         read_ana_window(c);
          x = (XX FAR *) mem_alloc(sizeof(XX),"x");
          for (i=0;i<2;i++)
              for (j=0;j<HAN_SIZE;j++)
--- 200,220 ----
  * windowed sample #z#
  *
  ************************************************************************/
! 
! extern double enwindow[];
! 
  void window_subband(buffer, z, k)
! short **buffer;
! double z[HAN_SIZE];
  int k;
  {
      typedef double FAR XX[2][HAN_SIZE];
      static XX FAR *x;
+     double *xk;
      int i, j;
      static int off[2] = {0,0};
      static char init = 0;
      if (!init) {
          x = (XX FAR *) mem_alloc(sizeof(XX),"x");
          for (i=0;i<2;i++)
              for (j=0;j<HAN_SIZE;j++)
***************
*** 239,249 ****
                  (*x)[i][j] = 0;
          init = 1;
      }
  
      /* replace 32 oldest samples with 32 new samples */
!     for (i=0;i<32;i++) (*x)[k][31-i+off[k]] = (double) *(*buffer)++/SCALE;
      /* shift samples into proper window positions */
!     for (i=0;i<HAN_SIZE;i++) z[i] = (*x)[k][(i+off[k])&HAN_SIZE-1] * c[i];
      off[k] += 480;              /*offset is modulo (HAN_SIZE-1)*/
      off[k] &= HAN_SIZE-1;
  
--- 221,232 ----
                  (*x)[i][j] = 0;
          init = 1;
      }
+     xk=(*x)[k];
  
      /* replace 32 oldest samples with 32 new samples */
!     for (i=0;i<32;i++) /*(*x)[k]*/xk[31-i+off[k]] = (double) *(*buffer)++/SCALE;
      /* shift samples into proper window positions */
!     for (i=0;i<HAN_SIZE;i++) z[i] = xk[(i+off[k])&HAN_SIZE-1] * enwindow[i];
      off[k] += 480;              /*offset is modulo (HAN_SIZE-1)*/
      off[k] &= HAN_SIZE-1;
  
***************
*** 263,268 ****
--- 246,269 ----
  *
  ************************************************************************/
  
+ 
+ /*#define NORING*/
+ /* define NORING to use the MDCT from Fredrik Noring <[EMAIL PROTECTED]>
+  * actually seems to be about 10% slower than we have.  
+  */
+ 
+ #ifdef NORING
+ extern void mfct(double *, double *);
+ void filter_subband(z,s)
+ double FAR z[HAN_SIZE], s[SBLIMIT];
+ {
+   double y[64];
+   int i,j;
+   
+   for (i=0;i<64;i++) for (j=0, y[i] = 0;j<8;j++) y[i] += z[i+64*j];
+   mfct(y, s);
+ }
+ #else
  void
  create_dct_matrix( filter )
  double filter[16][32];
***************
*** 271,281 ****
   
    for (i=0; i<16; i++)
      for (k=0; k<32; k++) {
!       if ((filter[i][k] = 1e9*cos((double)((2*i+1)*k*PI64))) >= 0)
! 	modf(filter[i][k]+0.5, &filter[i][k]);
!       else
! 	modf(filter[i][k]-0.5, &filter[i][k]);
!       filter[i][k] *= 1e-9;
      }
  }
  
--- 272,278 ----
   
    for (i=0; i<16; i++)
      for (k=0; k<32; k++) {
!        filter[i][k] = cos((double)((2*i+1)*k*PI64));
      }
  }
  
***************
*** 302,326 ****
    }
  }
  
- /*#define NORING*/
- /* define NORING to use the MDCT from Fredrik Noring <[EMAIL PROTECTED]>
-  * actually seems to be about 10% slower than we have.  
-  */
- 
- #ifdef NORING
- extern void mfct(double *, double *);
  void filter_subband(z,s)
  double FAR z[HAN_SIZE], s[SBLIMIT];
- {
-   double y[64];
-   int i,j;
-   
-   for (i=0;i<64;i++) for (j=0, y[i] = 0;j<8;j++) y[i] += z[i+64*j];
-   mfct(y, s);
- }
- #else
- void filter_subband(z,s)
- double FAR z[HAN_SIZE], s[SBLIMIT];
  {
     double y[64],yprime[32];
     int i,j;
--- 299,306 ----
----------
X-Sun-Data-Type: default
X-Sun-Data-Name: loop-pvt.diff
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 18

*** loop-pvt.h.1	Wed May 19 21:36:05 1999
--- loop-pvt.h	Wed May 19 21:37:17 1999
***************
*** 151,158 ****
              unsigned int end );
  
  
! int
! new_choose_table( int ix[576],
! 		  unsigned int begin,
! 		  unsigned int end );
  #endif
--- 151,155 ----
              unsigned int end );
  
  
! int new_choose_table( int ix[576], unsigned int begin, unsigned int end, int * s );
  #endif
--
MP3 ENCODER mailing list

Reply via email to