Blame src/libmpg123/layer3.c

Packit c32a2d
/*
Packit c32a2d
	layer3.c: the layer 3 decoder
Packit c32a2d
Packit c32a2d
	copyright 1995-2017 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Michael Hipp
Packit c32a2d
Packit c32a2d
	Dear visitor:
Packit c32a2d
	If you feel you don't understand fully the works of this file, your feeling might be correct.
Packit c32a2d
Packit c32a2d
	Optimize-TODO: put short bands into the band-field without the stride of 3 reals
Packit c32a2d
	Length-optimze: unify long and short band code where it is possible
Packit c32a2d
Packit c32a2d
	The int-vs-pointer situation has to be cleaned up.
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include "mpg123lib_intern.h"
Packit c32a2d
#ifdef USE_NEW_HUFFTABLE
Packit c32a2d
#include "newhuffman.h"
Packit c32a2d
#else
Packit c32a2d
#include "huffman.h"
Packit c32a2d
#endif
Packit c32a2d
#include "getbits.h"
Packit c32a2d
#include "debug.h"
Packit c32a2d
Packit c32a2d
Packit c32a2d
Packit c32a2d
/* define CUT_SFB21 if you want to cut-off the frequency above 16kHz */
Packit c32a2d
#if 0
Packit c32a2d
#define CUT_SFB21
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
#define NEW_DCT9
Packit c32a2d
#include "l3_integer_tables.h"
Packit c32a2d
#else
Packit c32a2d
/* static one-time calculated tables... or so */
Packit c32a2d
static real ispow[8207];
Packit c32a2d
static real aa_ca[8],aa_cs[8];
Packit c32a2d
static ALIGNED(16) real win[4][36];
Packit c32a2d
static ALIGNED(16) real win1[4][36];
Packit c32a2d
real COS9[9]; /* dct36_3dnow wants to use that */
Packit c32a2d
static real COS6_1,COS6_2;
Packit c32a2d
real tfcos36[9]; /* dct36_3dnow wants to use that */
Packit c32a2d
static real tfcos12[3];
Packit c32a2d
#define NEW_DCT9
Packit c32a2d
#ifdef NEW_DCT9
Packit c32a2d
static real cos9[3],cos18[3];
Packit c32a2d
static real tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16];
Packit c32a2d
static real pow1_1[2][32],pow2_1[2][32],pow1_2[2][32],pow2_2[2][32];
Packit c32a2d
#endif
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* Decoder state data, living on the stack of do_layer3. */
Packit c32a2d
Packit c32a2d
struct gr_info_s
Packit c32a2d
{
Packit c32a2d
	int scfsi;
Packit c32a2d
	unsigned part2_3_length;
Packit c32a2d
	unsigned big_values;
Packit c32a2d
	unsigned scalefac_compress;
Packit c32a2d
	unsigned block_type;
Packit c32a2d
	unsigned mixed_block_flag;
Packit c32a2d
	unsigned table_select[3];
Packit c32a2d
	/* Making those two signed int as workaround for open64/pathscale/sun compilers, and also for consistency, since they're worked on together with other signed variables. */
Packit c32a2d
	int maxband[3];
Packit c32a2d
	int maxbandl;
Packit c32a2d
	unsigned maxb;
Packit c32a2d
	unsigned region1start;
Packit c32a2d
	unsigned region2start;
Packit c32a2d
	unsigned preflag;
Packit c32a2d
	unsigned scalefac_scale;
Packit c32a2d
	unsigned count1table_select;
Packit c32a2d
	real *full_gain[3];
Packit c32a2d
	real *pow2gain;
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
struct III_sideinfo
Packit c32a2d
{
Packit c32a2d
	unsigned main_data_begin;
Packit c32a2d
	unsigned private_bits;
Packit c32a2d
	/* Hm, funny... struct inside struct... */
Packit c32a2d
	struct { struct gr_info_s gr[2]; } ch[2];
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
struct bandInfoStruct
Packit c32a2d
{
Packit c32a2d
	unsigned short longIdx[23];
Packit c32a2d
	unsigned char longDiff[22];
Packit c32a2d
	unsigned short shortIdx[14];
Packit c32a2d
	unsigned char shortDiff[13];
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
/* Techy details about our friendly MPEG data. Fairly constant over the years;-) */
Packit c32a2d
static const struct bandInfoStruct bandInfo[9] =
Packit c32a2d
{
Packit c32a2d
	{ /* MPEG 1.0 */
Packit c32a2d
		{0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576},
Packit c32a2d
		{4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158},
Packit c32a2d
		{0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3},
Packit c32a2d
		{4,4,4,4,6,8,10,12,14,18,22,30,56}
Packit c32a2d
	},
Packit c32a2d
	{
Packit c32a2d
		{0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576},
Packit c32a2d
		{4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192},
Packit c32a2d
		{0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3},
Packit c32a2d
		{4,4,4,4,6,6,10,12,14,16,20,26,66}
Packit c32a2d
	},
Packit c32a2d
	{
Packit c32a2d
		{0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
Packit c32a2d
		{4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26},
Packit c32a2d
		{0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3},
Packit c32a2d
		{4,4,4,4,6,8,12,16,20,26,34,42,12}
Packit c32a2d
	},
Packit c32a2d
	{ /* MPEG 2.0 */
Packit c32a2d
		{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
Packit c32a2d
		{6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } ,
Packit c32a2d
		{0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} ,
Packit c32a2d
		{4,4,4,6,6,8,10,14,18,26,32,42,18 }
Packit c32a2d
	},
Packit c32a2d
	{ /* Twiddling 3 values here (not just 330->332!) fixed bug 1895025. */
Packit c32a2d
		{0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,332,394,464,540,576},
Packit c32a2d
		{6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36 },
Packit c32a2d
		{0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3},
Packit c32a2d
		{4,4,4,6,8,10,12,14,18,24,32,44,12 }
Packit c32a2d
	},
Packit c32a2d
	{
Packit c32a2d
		{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
Packit c32a2d
		{6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 },
Packit c32a2d
		{0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3},
Packit c32a2d
		{4,4,4,6,8,10,12,14,18,24,30,40,18 }
Packit c32a2d
	},
Packit c32a2d
	{ /* MPEG 2.5 */
Packit c32a2d
		{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
Packit c32a2d
		{6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
Packit c32a2d
		{0,12,24,36,54,78,108,144,186,240,312,402,522,576},
Packit c32a2d
		{4,4,4,6,8,10,12,14,18,24,30,40,18}
Packit c32a2d
	},
Packit c32a2d
	{
Packit c32a2d
		{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
Packit c32a2d
		{6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
Packit c32a2d
		{0,12,24,36,54,78,108,144,186,240,312,402,522,576},
Packit c32a2d
		{4,4,4,6,8,10,12,14,18,24,30,40,18}
Packit c32a2d
	},
Packit c32a2d
	{
Packit c32a2d
		{0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
Packit c32a2d
		{12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2},
Packit c32a2d
		{0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576},
Packit c32a2d
		{8,8,8,12,16,20,24,28,36,2,2,2,26}
Packit c32a2d
	}
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
static int mapbuf0[9][152];
Packit c32a2d
static int mapbuf1[9][156];
Packit c32a2d
static int mapbuf2[9][44];
Packit c32a2d
static int *map[9][3];
Packit c32a2d
static int *mapend[9][3];
Packit c32a2d
Packit c32a2d
static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
Packit c32a2d
static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
Packit c32a2d
Packit c32a2d
/* Some helpers used in init_layer3 */
Packit c32a2d
Packit c32a2d
#ifdef OPT_MMXORSSE
Packit c32a2d
real init_layer3_gainpow2_mmx(mpg123_handle *fr, int i)
Packit c32a2d
{
Packit c32a2d
	if(!fr->p.down_sample) return DOUBLE_TO_REAL(16384.0 * pow((double)2.0,-0.25 * (double) (i+210) ));
Packit c32a2d
	else return DOUBLE_TO_REAL(pow((double)2.0,-0.25 * (double) (i+210)));
Packit c32a2d
}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
real init_layer3_gainpow2(mpg123_handle *fr, int i)
Packit c32a2d
{
Packit c32a2d
#if defined(REAL_IS_FIXED) && defined(PRECALC_TABLES)
Packit c32a2d
	return gainpow2[i+256];
Packit c32a2d
#else
Packit c32a2d
	return DOUBLE_TO_REAL_SCALE_LAYER3(pow((double)2.0,-0.25 * (double) (i+210)),i+256);
Packit c32a2d
#endif
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
/* init tables for layer-3 ... specific with the downsampling... */
Packit c32a2d
void init_layer3(void)
Packit c32a2d
{
Packit c32a2d
	int i,j,k,l;
Packit c32a2d
Packit c32a2d
#if !defined(REAL_IS_FIXED) || !defined(PRECALC_TABLES)
Packit c32a2d
	for(i=0;i<8207;i++)
Packit c32a2d
	ispow[i] = DOUBLE_TO_REAL_POW43(pow((double)i,(double)4.0/3.0));
Packit c32a2d
Packit c32a2d
	for(i=0;i<8;i++)
Packit c32a2d
	{
Packit c32a2d
		const double Ci[8] = {-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
Packit c32a2d
		double sq = sqrt(1.0+Ci[i]*Ci[i]);
Packit c32a2d
		aa_cs[i] = DOUBLE_TO_REAL(1.0/sq);
Packit c32a2d
		aa_ca[i] = DOUBLE_TO_REAL(Ci[i]/sq);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	for(i=0;i<18;i++)
Packit c32a2d
	{
Packit c32a2d
		win[0][i]    = win[1][i]    =
Packit c32a2d
			DOUBLE_TO_REAL( 0.5*sin(M_PI/72.0 * (double)(2*(i+0) +1)) / cos(M_PI * (double)(2*(i+0) +19) / 72.0) );
Packit c32a2d
		win[0][i+18] = win[3][i+18] =
Packit c32a2d
			DOUBLE_TO_REAL( 0.5*sin(M_PI/72.0 * (double)(2*(i+18)+1)) / cos(M_PI * (double)(2*(i+18)+19) / 72.0) );
Packit c32a2d
	}
Packit c32a2d
	for(i=0;i<6;i++)
Packit c32a2d
	{
Packit c32a2d
		win[1][i+18] = DOUBLE_TO_REAL(0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 ));
Packit c32a2d
		win[3][i+12] = DOUBLE_TO_REAL(0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 ));
Packit c32a2d
		win[1][i+24] = DOUBLE_TO_REAL(0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 ));
Packit c32a2d
		win[1][i+30] = win[3][i] = DOUBLE_TO_REAL(0.0);
Packit c32a2d
		win[3][i+6 ] = DOUBLE_TO_REAL(0.5 * sin( M_PI / 24.0 * (double) (2*i+1 ) ) / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 ));
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	for(i=0;i<9;i++)
Packit c32a2d
	COS9[i] = DOUBLE_TO_REAL(cos( M_PI / 18.0 * (double) i));
Packit c32a2d
Packit c32a2d
	for(i=0;i<9;i++)
Packit c32a2d
	tfcos36[i] = DOUBLE_TO_REAL(0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 ));
Packit c32a2d
Packit c32a2d
	for(i=0;i<3;i++)
Packit c32a2d
	tfcos12[i] = DOUBLE_TO_REAL(0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 ));
Packit c32a2d
Packit c32a2d
	COS6_1 = DOUBLE_TO_REAL(cos( M_PI / 6.0 * (double) 1));
Packit c32a2d
	COS6_2 = DOUBLE_TO_REAL(cos( M_PI / 6.0 * (double) 2));
Packit c32a2d
Packit c32a2d
#ifdef NEW_DCT9
Packit c32a2d
	cos9[0]  = DOUBLE_TO_REAL(cos(1.0*M_PI/9.0));
Packit c32a2d
	cos9[1]  = DOUBLE_TO_REAL(cos(5.0*M_PI/9.0));
Packit c32a2d
	cos9[2]  = DOUBLE_TO_REAL(cos(7.0*M_PI/9.0));
Packit c32a2d
	cos18[0] = DOUBLE_TO_REAL(cos(1.0*M_PI/18.0));
Packit c32a2d
	cos18[1] = DOUBLE_TO_REAL(cos(11.0*M_PI/18.0));
Packit c32a2d
	cos18[2] = DOUBLE_TO_REAL(cos(13.0*M_PI/18.0));
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	for(i=0;i<12;i++)
Packit c32a2d
	{
Packit c32a2d
		win[2][i] = DOUBLE_TO_REAL(0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 ));
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	for(i=0;i<16;i++)
Packit c32a2d
	{
Packit c32a2d
		double t = tan( (double) i * M_PI / 12.0 );
Packit c32a2d
		tan1_1[i] = DOUBLE_TO_REAL_15(t / (1.0+t));
Packit c32a2d
		tan2_1[i] = DOUBLE_TO_REAL_15(1.0 / (1.0 + t));
Packit c32a2d
		tan1_2[i] = DOUBLE_TO_REAL_15(M_SQRT2 * t / (1.0+t));
Packit c32a2d
		tan2_2[i] = DOUBLE_TO_REAL_15(M_SQRT2 / (1.0 + t));
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	for(i=0;i<32;i++)
Packit c32a2d
	{
Packit c32a2d
		for(j=0;j<2;j++)
Packit c32a2d
		{
Packit c32a2d
			double base = pow(2.0,-0.25*(j+1.0));
Packit c32a2d
			double p1=1.0,p2=1.0;
Packit c32a2d
			if(i > 0)
Packit c32a2d
			{
Packit c32a2d
				if( i & 1 ) p1 = pow(base,(i+1.0)*0.5);
Packit c32a2d
				else p2 = pow(base,i*0.5);
Packit c32a2d
			}
Packit c32a2d
			pow1_1[j][i] = DOUBLE_TO_REAL_15(p1);
Packit c32a2d
			pow2_1[j][i] = DOUBLE_TO_REAL_15(p2);
Packit c32a2d
			pow1_2[j][i] = DOUBLE_TO_REAL_15(M_SQRT2 * p1);
Packit c32a2d
			pow2_2[j][i] = DOUBLE_TO_REAL_15(M_SQRT2 * p2);
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	for(j=0;j<4;j++)
Packit c32a2d
	{
Packit c32a2d
		const int len[4] = { 36,36,12,36 };
Packit c32a2d
		for(i=0;i
Packit c32a2d
Packit c32a2d
		for(i=1;i
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	for(j=0;j<9;j++)
Packit c32a2d
	{
Packit c32a2d
		const struct bandInfoStruct *bi = &bandInfo[j];
Packit c32a2d
		int *mp;
Packit c32a2d
		int cb,lwin;
Packit c32a2d
		const unsigned char *bdf;
Packit c32a2d
		int switch_idx;
Packit c32a2d
Packit c32a2d
		mp = map[j][0] = mapbuf0[j];
Packit c32a2d
		bdf = bi->longDiff;
Packit c32a2d
		switch_idx = (j < 3) ? 8 : 6;
Packit c32a2d
		for(i=0,cb = 0; cb < switch_idx ; cb++,i+=*bdf++)
Packit c32a2d
		{
Packit c32a2d
			*mp++ = (*bdf) >> 1;
Packit c32a2d
			*mp++ = i;
Packit c32a2d
			*mp++ = 3;
Packit c32a2d
			*mp++ = cb;
Packit c32a2d
		}
Packit c32a2d
		bdf = bi->shortDiff+3;
Packit c32a2d
		for(cb=3;cb<13;cb++)
Packit c32a2d
		{
Packit c32a2d
			int l = (*bdf++) >> 1;
Packit c32a2d
			for(lwin=0;lwin<3;lwin++)
Packit c32a2d
			{
Packit c32a2d
				*mp++ = l;
Packit c32a2d
				*mp++ = i + lwin;
Packit c32a2d
				*mp++ = lwin;
Packit c32a2d
				*mp++ = cb;
Packit c32a2d
			}
Packit c32a2d
			i += 6*l;
Packit c32a2d
		}
Packit c32a2d
		mapend[j][0] = mp;
Packit c32a2d
Packit c32a2d
		mp = map[j][1] = mapbuf1[j];
Packit c32a2d
		bdf = bi->shortDiff+0;
Packit c32a2d
		for(i=0,cb=0;cb<13;cb++)
Packit c32a2d
		{
Packit c32a2d
			int l = (*bdf++) >> 1;
Packit c32a2d
			for(lwin=0;lwin<3;lwin++)
Packit c32a2d
			{
Packit c32a2d
				*mp++ = l;
Packit c32a2d
				*mp++ = i + lwin;
Packit c32a2d
				*mp++ = lwin;
Packit c32a2d
				*mp++ = cb;
Packit c32a2d
			}
Packit c32a2d
			i += 6*l;
Packit c32a2d
		}
Packit c32a2d
		mapend[j][1] = mp;
Packit c32a2d
Packit c32a2d
		mp = map[j][2] = mapbuf2[j];
Packit c32a2d
		bdf = bi->longDiff;
Packit c32a2d
		for(cb = 0; cb < 22 ; cb++)
Packit c32a2d
		{
Packit c32a2d
			*mp++ = (*bdf++) >> 1;
Packit c32a2d
			*mp++ = cb;
Packit c32a2d
		}
Packit c32a2d
		mapend[j][2] = mp;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	/* Now for some serious loopings! */
Packit c32a2d
	for(i=0;i<5;i++)
Packit c32a2d
	for(j=0;j<6;j++)
Packit c32a2d
	for(k=0;k<6;k++)
Packit c32a2d
	{
Packit c32a2d
		int n = k + j * 6 + i * 36;
Packit c32a2d
		i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12);
Packit c32a2d
	}
Packit c32a2d
	for(i=0;i<4;i++)
Packit c32a2d
	for(j=0;j<4;j++)
Packit c32a2d
	for(k=0;k<4;k++)
Packit c32a2d
	{
Packit c32a2d
		int n = k + j * 4 + i * 16;
Packit c32a2d
		i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12);
Packit c32a2d
	}
Packit c32a2d
	for(i=0;i<4;i++)
Packit c32a2d
	for(j=0;j<3;j++)
Packit c32a2d
	{
Packit c32a2d
		int n = j + i * 3;
Packit c32a2d
		i_slen2[n+244] = i|(j<<3) | (5<<12);
Packit c32a2d
		n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15);
Packit c32a2d
	}
Packit c32a2d
	for(i=0;i<5;i++)
Packit c32a2d
	for(j=0;j<5;j++)
Packit c32a2d
	for(k=0;k<4;k++)
Packit c32a2d
	for(l=0;l<4;l++)
Packit c32a2d
	{
Packit c32a2d
		int n = l + k * 4 + j * 16 + i * 80;
Packit c32a2d
		n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12);
Packit c32a2d
	}
Packit c32a2d
	for(i=0;i<5;i++)
Packit c32a2d
	for(j=0;j<5;j++)
Packit c32a2d
	for(k=0;k<4;k++)
Packit c32a2d
	{
Packit c32a2d
		int n = k + j * 4 + i * 20;
Packit c32a2d
		n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12);
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
void init_layer3_stuff(mpg123_handle *fr, real (*gainpow2)(mpg123_handle *fr, int i))
Packit c32a2d
{
Packit c32a2d
	int i,j;
Packit c32a2d
Packit c32a2d
	for(i=-256;i<118+4;i++)	fr->gainpow2[i+256] = gainpow2(fr,i);
Packit c32a2d
Packit c32a2d
	for(j=0;j<9;j++)
Packit c32a2d
	{
Packit c32a2d
		for(i=0;i<23;i++)
Packit c32a2d
		{
Packit c32a2d
			fr->longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
Packit c32a2d
			if(fr->longLimit[j][i] > (fr->down_sample_sblimit) )
Packit c32a2d
			fr->longLimit[j][i] = fr->down_sample_sblimit;
Packit c32a2d
		}
Packit c32a2d
		for(i=0;i<14;i++)
Packit c32a2d
		{
Packit c32a2d
			fr->shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
Packit c32a2d
			if(fr->shortLimit[j][i] > (fr->down_sample_sblimit) )
Packit c32a2d
			fr->shortLimit[j][i] = fr->down_sample_sblimit;
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	Observe!
Packit c32a2d
	Now come the actualy decoding routines.
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
/* read additional side information (for MPEG 1 and MPEG 2) */
Packit c32a2d
static int III_get_side_info(mpg123_handle *fr, struct III_sideinfo *si,int stereo, int ms_stereo,long sfreq,int single)
Packit c32a2d
{
Packit c32a2d
	int ch, gr;
Packit c32a2d
	int powdiff = (single == SINGLE_MIX) ? 4 : 0;
Packit c32a2d
Packit c32a2d
	const int tabs[2][5] = { { 2,9,5,3,4 } , { 1,8,1,2,9 } };
Packit c32a2d
	const int *tab = tabs[fr->lsf];
Packit c32a2d
Packit c32a2d
	si->main_data_begin = getbits(fr, tab[1]);
Packit c32a2d
Packit c32a2d
	if(si->main_data_begin > fr->bitreservoir)
Packit c32a2d
	{
Packit c32a2d
		if(!fr->to_ignore && VERBOSE2) fprintf(stderr, "Note: missing %d bytes in bit reservoir for frame %li\n", (int)(si->main_data_begin - fr->bitreservoir), (long)fr->num);
Packit c32a2d
Packit c32a2d
		/*  overwrite main_data_begin for the really available bit reservoir */
Packit c32a2d
		backbits(fr, tab[1]);
Packit c32a2d
		if(fr->lsf == 0)
Packit c32a2d
		{
Packit c32a2d
			fr->wordpointer[0] = (unsigned char) (fr->bitreservoir >> 1);
Packit c32a2d
			fr->wordpointer[1] = (unsigned char) ((fr->bitreservoir & 1) << 7);
Packit c32a2d
		}
Packit c32a2d
		else fr->wordpointer[0] = (unsigned char) fr->bitreservoir;
Packit c32a2d
Packit c32a2d
		/* zero "side-info" data for a silence-frame
Packit c32a2d
		without touching audio data used as bit reservoir for following frame */
Packit c32a2d
		memset(fr->wordpointer+2, 0, fr->ssize-2);
Packit c32a2d
Packit c32a2d
		/* reread the new bit reservoir offset */
Packit c32a2d
		si->main_data_begin = getbits(fr, tab[1]);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	/* Keep track of the available data bytes for the bit reservoir.
Packit c32a2d
	Think: Substract the 2 crc bytes in parser already? */
Packit c32a2d
	fr->bitreservoir = fr->bitreservoir + fr->framesize - fr->ssize - (fr->error_protection ? 2 : 0);
Packit c32a2d
	/* Limit the reservoir to the max for MPEG 1.0 or 2.x . */
Packit c32a2d
	if(fr->bitreservoir > (unsigned int) (fr->lsf == 0 ? 511 : 255))
Packit c32a2d
	fr->bitreservoir = (fr->lsf == 0 ? 511 : 255);
Packit c32a2d
Packit c32a2d
	/* Now back into less commented territory. It's code. It works. */
Packit c32a2d
Packit c32a2d
	if (stereo == 1)
Packit c32a2d
	si->private_bits = getbits_fast(fr, tab[2]);
Packit c32a2d
	else 
Packit c32a2d
	si->private_bits = getbits_fast(fr, tab[3]);
Packit c32a2d
Packit c32a2d
	if(!fr->lsf) for(ch=0; ch
Packit c32a2d
	{
Packit c32a2d
		si->ch[ch].gr[0].scfsi = -1;
Packit c32a2d
		si->ch[ch].gr[1].scfsi = getbits_fast(fr, 4);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	for (gr=0; gr
Packit c32a2d
	for (ch=0; ch
Packit c32a2d
	{
Packit c32a2d
		register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
Packit c32a2d
Packit c32a2d
		gr_info->part2_3_length = getbits(fr, 12);
Packit c32a2d
		gr_info->big_values = getbits(fr, 9);
Packit c32a2d
		if(gr_info->big_values > 288)
Packit c32a2d
		{
Packit c32a2d
			if(NOQUIET) error("big_values too large!");
Packit c32a2d
			gr_info->big_values = 288;
Packit c32a2d
		}
Packit c32a2d
		gr_info->pow2gain = fr->gainpow2+256 - getbits_fast(fr, 8) + powdiff;
Packit c32a2d
		if(ms_stereo) gr_info->pow2gain += 2;
Packit c32a2d
		gr_info->scalefac_compress = getbits(fr, tab[4]);
Packit c32a2d
		if(gr_info->part2_3_length == 0)
Packit c32a2d
		{
Packit c32a2d
			if(gr_info->scalefac_compress > 0)
Packit c32a2d
				debug1( "scalefac_compress _should_ be zero instead of %i"
Packit c32a2d
				,	gr_info->scalefac_compress );
Packit c32a2d
			gr_info->scalefac_compress = 0;
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		if(get1bit(fr))
Packit c32a2d
		{ /* window switch flag  */
Packit c32a2d
			int i;
Packit c32a2d
			gr_info->block_type       = getbits_fast(fr, 2);
Packit c32a2d
			gr_info->mixed_block_flag = get1bit(fr);
Packit c32a2d
			gr_info->table_select[0]  = getbits_fast(fr, 5);
Packit c32a2d
			gr_info->table_select[1]  = getbits_fast(fr, 5);
Packit c32a2d
			/*
Packit c32a2d
				table_select[2] not needed, because there is no region2,
Packit c32a2d
				but to satisfy some verification tools we set it either.
Packit c32a2d
			*/
Packit c32a2d
			gr_info->table_select[2] = 0;
Packit c32a2d
			for(i=0;i<3;i++)
Packit c32a2d
			gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(fr, 3)<<3);
Packit c32a2d
Packit c32a2d
			if(gr_info->block_type == 0)
Packit c32a2d
			{
Packit c32a2d
				if(NOQUIET) error("Blocktype == 0 and window-switching == 1 not allowed.");
Packit c32a2d
				return 1;
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			/* region_count/start parameters are implicit in this case. */       
Packit c32a2d
			if( (!fr->lsf || (gr_info->block_type == 2)) && !fr->mpeg25)
Packit c32a2d
			{
Packit c32a2d
				gr_info->region1start = 36>>1;
Packit c32a2d
				gr_info->region2start = 576>>1;
Packit c32a2d
			}
Packit c32a2d
			else
Packit c32a2d
			{
Packit c32a2d
				if(fr->mpeg25)
Packit c32a2d
				{ 
Packit c32a2d
					int r0c,r1c;
Packit c32a2d
					if((gr_info->block_type == 2) && (!gr_info->mixed_block_flag) ) r0c = 5;
Packit c32a2d
					else r0c = 7;
Packit c32a2d
Packit c32a2d
					/* r0c+1+r1c+1 == 22, always. */
Packit c32a2d
					r1c = 20 - r0c;
Packit c32a2d
					gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
Packit c32a2d
					gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; 
Packit c32a2d
				}
Packit c32a2d
				else
Packit c32a2d
				{
Packit c32a2d
					gr_info->region1start = 54>>1;
Packit c32a2d
					gr_info->region2start = 576>>1; 
Packit c32a2d
				} 
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			int i,r0c,r1c;
Packit c32a2d
			for (i=0; i<3; i++)
Packit c32a2d
			gr_info->table_select[i] = getbits_fast(fr, 5);
Packit c32a2d
Packit c32a2d
			r0c = getbits_fast(fr, 4); /* 0 .. 15 */
Packit c32a2d
			r1c = getbits_fast(fr, 3); /* 0 .. 7 */
Packit c32a2d
			gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
Packit c32a2d
Packit c32a2d
			/* max(r0c+r1c+2) = 15+7+2 = 24 */
Packit c32a2d
			if(r0c+1+r1c+1 > 22) gr_info->region2start = 576>>1;
Packit c32a2d
			else gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
Packit c32a2d
Packit c32a2d
			gr_info->block_type = 0;
Packit c32a2d
			gr_info->mixed_block_flag = 0;
Packit c32a2d
		}
Packit c32a2d
		if(!fr->lsf) gr_info->preflag = get1bit(fr);
Packit c32a2d
Packit c32a2d
		gr_info->scalefac_scale = get1bit(fr);
Packit c32a2d
		gr_info->count1table_select = get1bit(fr);
Packit c32a2d
	}
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
/* read scalefactors */
Packit c32a2d
static int III_get_scale_factors_1(mpg123_handle *fr, int *scf,struct gr_info_s *gr_info,int ch,int gr)
Packit c32a2d
{
Packit c32a2d
	const unsigned char slen[2][16] =
Packit c32a2d
	{
Packit c32a2d
		{0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
Packit c32a2d
		{0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
Packit c32a2d
	};
Packit c32a2d
	int numbits;
Packit c32a2d
	int num0 = slen[0][gr_info->scalefac_compress];
Packit c32a2d
	int num1 = slen[1][gr_info->scalefac_compress];
Packit c32a2d
Packit c32a2d
	if(gr_info->part2_3_length == 0)
Packit c32a2d
	{
Packit c32a2d
		int i;
Packit c32a2d
		for(i=0;i<39;i++)
Packit c32a2d
			*scf++ = 0;
Packit c32a2d
		return 0;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	if(gr_info->block_type == 2)
Packit c32a2d
	{
Packit c32a2d
		int i=18;
Packit c32a2d
		numbits = (num0 + num1) * 18;
Packit c32a2d
Packit c32a2d
		if(gr_info->mixed_block_flag)
Packit c32a2d
		{
Packit c32a2d
			for (i=8;i;i--)
Packit c32a2d
			*scf++ = getbits_fast(fr, num0);
Packit c32a2d
Packit c32a2d
			i = 9;
Packit c32a2d
			numbits -= num0; /* num0 * 17 + num1 * 18 */
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		for(;i;i--) *scf++ = getbits_fast(fr, num0);
Packit c32a2d
Packit c32a2d
		for(i = 18; i; i--) *scf++ = getbits_fast(fr, num1);
Packit c32a2d
Packit c32a2d
		*scf++ = 0; *scf++ = 0; *scf++ = 0; /* short[13][0..2] = 0 */
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		int i;
Packit c32a2d
		int scfsi = gr_info->scfsi;
Packit c32a2d
Packit c32a2d
		if(scfsi < 0)
Packit c32a2d
		{ /* scfsi < 0 => granule == 0 */
Packit c32a2d
			for(i=11;i;i--) *scf++ = getbits_fast(fr, num0);
Packit c32a2d
Packit c32a2d
			for(i=10;i;i--) *scf++ = getbits_fast(fr, num1);
Packit c32a2d
Packit c32a2d
			numbits = (num0 + num1) * 10 + num0;
Packit c32a2d
			*scf++ = 0;
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			numbits = 0;
Packit c32a2d
			if(!(scfsi & 0x8))
Packit c32a2d
			{
Packit c32a2d
				for (i=0;i<6;i++) *scf++ = getbits_fast(fr, num0);
Packit c32a2d
Packit c32a2d
				numbits += num0 * 6;
Packit c32a2d
			}
Packit c32a2d
			else scf += 6; 
Packit c32a2d
Packit c32a2d
			if(!(scfsi & 0x4))
Packit c32a2d
			{
Packit c32a2d
				for (i=0;i<5;i++) *scf++ = getbits_fast(fr, num0);
Packit c32a2d
Packit c32a2d
				numbits += num0 * 5;
Packit c32a2d
			}
Packit c32a2d
			else scf += 5;
Packit c32a2d
Packit c32a2d
			if(!(scfsi & 0x2))
Packit c32a2d
			{
Packit c32a2d
				for(i=0;i<5;i++) *scf++ = getbits_fast(fr, num1);
Packit c32a2d
Packit c32a2d
				numbits += num1 * 5;
Packit c32a2d
			}
Packit c32a2d
			else scf += 5;
Packit c32a2d
Packit c32a2d
			if(!(scfsi & 0x1))
Packit c32a2d
			{
Packit c32a2d
				for (i=0;i<5;i++) *scf++ = getbits_fast(fr, num1);
Packit c32a2d
Packit c32a2d
				numbits += num1 * 5;
Packit c32a2d
			}
Packit c32a2d
			else scf += 5;
Packit c32a2d
Packit c32a2d
			*scf++ = 0;  /* no l[21] in original sources */
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	return numbits;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
static int III_get_scale_factors_2(mpg123_handle *fr, int *scf,struct gr_info_s *gr_info,int i_stereo)
Packit c32a2d
{
Packit c32a2d
	const unsigned char *pnt;
Packit c32a2d
	int i,j,n=0,numbits=0;
Packit c32a2d
	unsigned int slen;
Packit c32a2d
Packit c32a2d
	const unsigned char stab[3][6][4] =
Packit c32a2d
	{
Packit c32a2d
		{
Packit c32a2d
			{ 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0},
Packit c32a2d
			{ 7, 7, 7,0 } , { 6, 6, 6,3 } , {  8, 8,5,0}
Packit c32a2d
		},
Packit c32a2d
		{
Packit c32a2d
			{ 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0},
Packit c32a2d
			{12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0}
Packit c32a2d
		},
Packit c32a2d
		{
Packit c32a2d
			{ 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0},
Packit c32a2d
			{ 6,15,12,0 } , { 6,12, 9,6 } , {  6,18,9,0}
Packit c32a2d
		}
Packit c32a2d
	}; 
Packit c32a2d
Packit c32a2d
	if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */
Packit c32a2d
	slen = i_slen2[gr_info->scalefac_compress>>1];
Packit c32a2d
	else
Packit c32a2d
	slen = n_slen2[gr_info->scalefac_compress];
Packit c32a2d
Packit c32a2d
	gr_info->preflag = (slen>>15) & 0x1;
Packit c32a2d
Packit c32a2d
	n = 0;  
Packit c32a2d
	if( gr_info->block_type == 2 )
Packit c32a2d
	{
Packit c32a2d
		n++;
Packit c32a2d
		if(gr_info->mixed_block_flag) n++;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	pnt = stab[n][(slen>>12)&0x7];
Packit c32a2d
Packit c32a2d
	if(gr_info->part2_3_length == 0)
Packit c32a2d
	{
Packit c32a2d
		int i;
Packit c32a2d
		for(i=0;i<39;i++)
Packit c32a2d
			*scf++ = 0;
Packit c32a2d
		return 0;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	for(i=0;i<4;i++)
Packit c32a2d
	{
Packit c32a2d
		int num = slen & 0x7;
Packit c32a2d
		slen >>= 3;
Packit c32a2d
		if(num)
Packit c32a2d
		{
Packit c32a2d
			for(j=0;j<(int)(pnt[i]);j++) *scf++ = getbits_fast(fr, num);
Packit c32a2d
Packit c32a2d
			numbits += pnt[i] * num;
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		for(j=0;j<(int)(pnt[i]);j++) *scf++ = 0;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	n = (n << 1) + 1;
Packit c32a2d
	for(i=0;i
Packit c32a2d
Packit c32a2d
	return numbits;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
static unsigned char pretab_choice[2][22] =
Packit c32a2d
{
Packit c32a2d
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Packit c32a2d
	{0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0}
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	Dequantize samples
Packit c32a2d
	...includes Huffman decoding
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
/* 24 is enough because tab13 has max. a 19 bit huffvector */
Packit c32a2d
/* The old code played games with shifting signed integers around in not quite */
Packit c32a2d
/* legal ways. Also, it used long where just 32 bits are required. This could */
Packit c32a2d
/* be good or bad on 64 bit architectures ... anyway, making clear that */
Packit c32a2d
/* 32 bits suffice is a benefit. */
Packit c32a2d
#if 0
Packit c32a2d
/* To reconstruct old code, use this: */
Packit c32a2d
#define MASK_STYPE long
Packit c32a2d
#define MASK_UTYPE unsigned long
Packit c32a2d
#define MASK_TYPE MASK_STYPE
Packit c32a2d
#define MSB_MASK (mask < 0)
Packit c32a2d
#else
Packit c32a2d
/* This should be more proper: */
Packit c32a2d
#define MASK_STYPE int32_t
Packit c32a2d
#define MASK_UTYPE uint32_t
Packit c32a2d
#define MASK_TYPE  MASK_UTYPE
Packit c32a2d
#define MSB_MASK ((MASK_UTYPE)mask & (MASK_UTYPE)1<<(sizeof(MASK_TYPE)*8-1))
Packit c32a2d
#endif
Packit c32a2d
#define BITSHIFT ((sizeof(MASK_TYPE)-1)*8)
Packit c32a2d
#define REFRESH_MASK \
Packit c32a2d
	while(num < BITSHIFT) { \
Packit c32a2d
		mask |= ((MASK_UTYPE)getbyte(fr))<<(BITSHIFT-num); \
Packit c32a2d
		num += 8; \
Packit c32a2d
		part2remain -= 8; }
Packit c32a2d
/* Complicated way of checking for msb value. This used to be (mask < 0). */
Packit c32a2d
Packit c32a2d
static int III_dequantize_sample(mpg123_handle *fr, real xr[SBLIMIT][SSLIMIT],int *scf, struct gr_info_s *gr_info,int sfreq,int part2bits)
Packit c32a2d
{
Packit c32a2d
	int shift = 1 + gr_info->scalefac_scale;
Packit c32a2d
	real *xrpnt = (real *) xr;
Packit c32a2d
	int l[3],l3;
Packit c32a2d
	int part2remain = gr_info->part2_3_length - part2bits;
Packit c32a2d
	int *me;
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
	int gainpow2_scale_idx = 378;
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	/* Assumption: If there is some part2_3_length at all, there should be
Packit c32a2d
	   enough of it to work with properly. In case of zero length we silently
Packit c32a2d
	   zero things. */
Packit c32a2d
	if(gr_info->part2_3_length > 0)
Packit c32a2d
	{
Packit c32a2d
Packit c32a2d
	/* mhipp tree has this split up a bit... */
Packit c32a2d
	int num=getbitoffset(fr);
Packit c32a2d
	MASK_TYPE mask;
Packit c32a2d
	/* We must split this, because for num==0 the shift is undefined if you do it in one step. */
Packit c32a2d
	mask  = ((MASK_UTYPE) getbits(fr, num))<
Packit c32a2d
	mask <<= 8-num;
Packit c32a2d
	part2remain -= num;
Packit c32a2d
Packit c32a2d
	{
Packit c32a2d
		int bv       = gr_info->big_values;
Packit c32a2d
		int region1  = gr_info->region1start;
Packit c32a2d
		int region2  = gr_info->region2start;
Packit c32a2d
		l3 = ((576>>1)-bv)>>1;   
Packit c32a2d
Packit c32a2d
		/* we may lose the 'odd' bit here !! check this later again */
Packit c32a2d
		if(bv <= region1)
Packit c32a2d
		{
Packit c32a2d
			l[0] = bv;
Packit c32a2d
			l[1] = 0;
Packit c32a2d
			l[2] = 0;
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			l[0] = region1;
Packit c32a2d
			if(bv <= region2)
Packit c32a2d
			{
Packit c32a2d
				l[1] = bv - l[0];
Packit c32a2d
				l[2] = 0;
Packit c32a2d
			}
Packit c32a2d
			else
Packit c32a2d
			{
Packit c32a2d
				l[1] = region2 - l[0];
Packit c32a2d
				l[2] = bv - region2;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
#define CHECK_XRPNT if(xrpnt >= &xr[SBLIMIT][0]) \
Packit c32a2d
{ \
Packit c32a2d
	if(NOQUIET) \
Packit c32a2d
		error2("attempted xrpnt overflow (%p !< %p)", (void*) xrpnt, (void*) &xr[SBLIMIT][0]); \
Packit c32a2d
	return 1; \
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
	if(gr_info->block_type == 2)
Packit c32a2d
	{
Packit c32a2d
		/* decoding with short or mixed mode BandIndex table */
Packit c32a2d
		int i,max[4];
Packit c32a2d
		int step=0,lwin=3,cb=0;
Packit c32a2d
		register real v = 0.0;
Packit c32a2d
		register int *m,mc;
Packit c32a2d
Packit c32a2d
		if(gr_info->mixed_block_flag)
Packit c32a2d
		{
Packit c32a2d
			max[3] = -1;
Packit c32a2d
			max[0] = max[1] = max[2] = 2;
Packit c32a2d
			m = map[sfreq][0];
Packit c32a2d
			me = mapend[sfreq][0];
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			max[0] = max[1] = max[2] = max[3] = -1;
Packit c32a2d
			/* max[3] not really needed in this case */
Packit c32a2d
			m = map[sfreq][1];
Packit c32a2d
			me = mapend[sfreq][1];
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		mc = 0;
Packit c32a2d
		for(i=0;i<2;i++)
Packit c32a2d
		{
Packit c32a2d
			int lp = l[i];
Packit c32a2d
			const struct newhuff *h = ht+gr_info->table_select[i];
Packit c32a2d
			for(;lp;lp--,mc--)
Packit c32a2d
			{
Packit c32a2d
				register MASK_STYPE x,y;
Packit c32a2d
				if( (!mc) )
Packit c32a2d
				{
Packit c32a2d
					mc    = *m++;
Packit c32a2d
					xrpnt = ((real *) xr) + (*m++);
Packit c32a2d
					lwin  = *m++;
Packit c32a2d
					cb    = *m++;
Packit c32a2d
					if(lwin == 3)
Packit c32a2d
					{
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
						gainpow2_scale_idx = (int)(gr_info->pow2gain + (*scf << shift) - fr->gainpow2);
Packit c32a2d
#endif
Packit c32a2d
						v = gr_info->pow2gain[(*scf++) << shift];
Packit c32a2d
						step = 1;
Packit c32a2d
					}
Packit c32a2d
					else
Packit c32a2d
					{
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
						gainpow2_scale_idx = (int)(gr_info->full_gain[lwin] + (*scf << shift) - fr->gainpow2);
Packit c32a2d
#endif
Packit c32a2d
						v = gr_info->full_gain[lwin][(*scf++) << shift];
Packit c32a2d
						step = 3;
Packit c32a2d
					}
Packit c32a2d
				}
Packit c32a2d
				{
Packit c32a2d
					const short *val = h->table;
Packit c32a2d
					REFRESH_MASK;
Packit c32a2d
#ifdef USE_NEW_HUFFTABLE
Packit c32a2d
					while((y=val[(MASK_UTYPE)mask>>(BITSHIFT+4)])<0)
Packit c32a2d
					{
Packit c32a2d
						val -= y;
Packit c32a2d
						num -= 4;
Packit c32a2d
						mask <<= 4;
Packit c32a2d
					}
Packit c32a2d
					num -= (y >> 8);
Packit c32a2d
					mask <<= (y >> 8);
Packit c32a2d
					x = (y >> 4) & 0xf;
Packit c32a2d
					y &= 0xf;
Packit c32a2d
#else
Packit c32a2d
					while((y=*val++)<0)
Packit c32a2d
					{
Packit c32a2d
						if (MSB_MASK) val -= y;
Packit c32a2d
Packit c32a2d
						num--;
Packit c32a2d
						mask <<= 1;
Packit c32a2d
					}
Packit c32a2d
					x = y >> 4;
Packit c32a2d
					y &= 0xf;
Packit c32a2d
#endif
Packit c32a2d
				}
Packit c32a2d
				CHECK_XRPNT;
Packit c32a2d
				if(x == 15 && h->linbits)
Packit c32a2d
				{
Packit c32a2d
					max[lwin] = cb;
Packit c32a2d
					REFRESH_MASK;
Packit c32a2d
					x += ((MASK_UTYPE) mask) >> (BITSHIFT+8-h->linbits);
Packit c32a2d
					num -= h->linbits+1;
Packit c32a2d
					mask <<= h->linbits;
Packit c32a2d
					if(MSB_MASK) *xrpnt = REAL_MUL_SCALE_LAYER3(-ispow[x], v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt = REAL_MUL_SCALE_LAYER3( ispow[x], v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else if(x)
Packit c32a2d
				{
Packit c32a2d
					max[lwin] = cb;
Packit c32a2d
					if(MSB_MASK) *xrpnt = REAL_MUL_SCALE_LAYER3(-ispow[x], v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt = REAL_MUL_SCALE_LAYER3( ispow[x], v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					num--;
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else *xrpnt = DOUBLE_TO_REAL(0.0);
Packit c32a2d
Packit c32a2d
				xrpnt += step;
Packit c32a2d
				CHECK_XRPNT;
Packit c32a2d
				if(y == 15 && h->linbits)
Packit c32a2d
				{
Packit c32a2d
					max[lwin] = cb;
Packit c32a2d
					REFRESH_MASK;
Packit c32a2d
					y += ((MASK_UTYPE) mask) >> (BITSHIFT+8-h->linbits);
Packit c32a2d
					num -= h->linbits+1;
Packit c32a2d
					mask <<= h->linbits;
Packit c32a2d
					if(MSB_MASK) *xrpnt = REAL_MUL_SCALE_LAYER3(-ispow[y], v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt = REAL_MUL_SCALE_LAYER3( ispow[y], v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else if(y)
Packit c32a2d
				{
Packit c32a2d
					max[lwin] = cb;
Packit c32a2d
					if(MSB_MASK) *xrpnt = REAL_MUL_SCALE_LAYER3(-ispow[y], v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt = REAL_MUL_SCALE_LAYER3( ispow[y], v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					num--;
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else *xrpnt = DOUBLE_TO_REAL(0.0);
Packit c32a2d
Packit c32a2d
				xrpnt += step;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		for(;l3 && (part2remain+num > 0);l3--)
Packit c32a2d
		{
Packit c32a2d
			const struct newhuff* h;
Packit c32a2d
			const short* val;
Packit c32a2d
			register short a;
Packit c32a2d
Packit c32a2d
			h = htc+gr_info->count1table_select;
Packit c32a2d
			val = h->table;
Packit c32a2d
Packit c32a2d
			REFRESH_MASK;
Packit c32a2d
			while((a=*val++)<0)
Packit c32a2d
			{
Packit c32a2d
				if(MSB_MASK) val -= a;
Packit c32a2d
Packit c32a2d
				num--;
Packit c32a2d
				mask <<= 1;
Packit c32a2d
			}
Packit c32a2d
			if(part2remain+num <= 0)
Packit c32a2d
			{
Packit c32a2d
				num -= part2remain+num;
Packit c32a2d
				break;
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			for(i=0;i<4;i++)
Packit c32a2d
			{
Packit c32a2d
				if(!(i & 1))
Packit c32a2d
				{
Packit c32a2d
					if(!mc)
Packit c32a2d
					{
Packit c32a2d
						mc = *m++;
Packit c32a2d
						xrpnt = ((real *) xr) + (*m++);
Packit c32a2d
						lwin = *m++;
Packit c32a2d
						cb = *m++;
Packit c32a2d
						if(lwin == 3)
Packit c32a2d
						{
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
							gainpow2_scale_idx = (int)(gr_info->pow2gain + (*scf << shift) - fr->gainpow2);
Packit c32a2d
#endif
Packit c32a2d
							v = gr_info->pow2gain[(*scf++) << shift];
Packit c32a2d
							step = 1;
Packit c32a2d
						}
Packit c32a2d
						else
Packit c32a2d
						{
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
							gainpow2_scale_idx = (int)(gr_info->full_gain[lwin] + (*scf << shift) - fr->gainpow2);
Packit c32a2d
#endif
Packit c32a2d
							v = gr_info->full_gain[lwin][(*scf++) << shift];
Packit c32a2d
							step = 3;
Packit c32a2d
						}
Packit c32a2d
					}
Packit c32a2d
					mc--;
Packit c32a2d
				}
Packit c32a2d
				CHECK_XRPNT;
Packit c32a2d
				if( (a & (0x8>>i)) )
Packit c32a2d
				{
Packit c32a2d
					max[lwin] = cb;
Packit c32a2d
					if(part2remain+num <= 0)
Packit c32a2d
					break;
Packit c32a2d
Packit c32a2d
					if(MSB_MASK) *xrpnt = -REAL_SCALE_LAYER3(v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt =  REAL_SCALE_LAYER3(v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					num--;
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else *xrpnt = DOUBLE_TO_REAL(0.0);
Packit c32a2d
Packit c32a2d
				xrpnt += step;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		if(lwin < 3)
Packit c32a2d
		{ /* short band? */
Packit c32a2d
			while(1)
Packit c32a2d
			{
Packit c32a2d
				for(;mc > 0;mc--)
Packit c32a2d
				{
Packit c32a2d
					CHECK_XRPNT;
Packit c32a2d
					*xrpnt = DOUBLE_TO_REAL(0.0); xrpnt += 3; /* short band -> step=3 */
Packit c32a2d
					*xrpnt = DOUBLE_TO_REAL(0.0); xrpnt += 3;
Packit c32a2d
				}
Packit c32a2d
				if(m >= me)
Packit c32a2d
				break;
Packit c32a2d
Packit c32a2d
				mc    = *m++;
Packit c32a2d
				xrpnt = ((real *) xr) + *m++;
Packit c32a2d
				if(*m++ == 0)
Packit c32a2d
				break; /* optimize: field will be set to zero at the end of the function */
Packit c32a2d
Packit c32a2d
				m++; /* cb */
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		gr_info->maxband[0] = max[0]+1;
Packit c32a2d
		gr_info->maxband[1] = max[1]+1;
Packit c32a2d
		gr_info->maxband[2] = max[2]+1;
Packit c32a2d
		gr_info->maxbandl   = max[3]+1;
Packit c32a2d
Packit c32a2d
		{
Packit c32a2d
			int rmax = max[0] > max[1] ? max[0] : max[1];
Packit c32a2d
			rmax = (rmax > max[2] ? rmax : max[2]) + 1;
Packit c32a2d
			gr_info->maxb = rmax ? fr->shortLimit[sfreq][rmax] : fr->longLimit[sfreq][max[3]+1];
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		/* decoding with 'long' BandIndex table (block_type != 2) */
Packit c32a2d
		const unsigned char *pretab = pretab_choice[gr_info->preflag];
Packit c32a2d
		int i,max = -1;
Packit c32a2d
		int cb = 0;
Packit c32a2d
		int *m = map[sfreq][2];
Packit c32a2d
		register real v = 0.0;
Packit c32a2d
		int mc = 0;
Packit c32a2d
Packit c32a2d
		/* long hash table values */
Packit c32a2d
		for(i=0;i<3;i++)
Packit c32a2d
		{
Packit c32a2d
			int lp = l[i];
Packit c32a2d
			const struct newhuff *h = ht+gr_info->table_select[i];
Packit c32a2d
Packit c32a2d
			for(;lp;lp--,mc--)
Packit c32a2d
			{
Packit c32a2d
				MASK_STYPE x,y;
Packit c32a2d
				if(!mc)
Packit c32a2d
				{
Packit c32a2d
					mc = *m++;
Packit c32a2d
					cb = *m++;
Packit c32a2d
#ifdef CUT_SFB21
Packit c32a2d
					if(cb == 21)
Packit c32a2d
						v = 0.0;
Packit c32a2d
					else
Packit c32a2d
#endif
Packit c32a2d
					{
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
						gainpow2_scale_idx = (int)(gr_info->pow2gain + (*scf << shift) - fr->gainpow2);
Packit c32a2d
#endif
Packit c32a2d
						v = gr_info->pow2gain[(*(scf++) + (*pretab++)) << shift];
Packit c32a2d
					}
Packit c32a2d
				}
Packit c32a2d
				{
Packit c32a2d
					const short *val = h->table;
Packit c32a2d
					REFRESH_MASK;
Packit c32a2d
#ifdef USE_NEW_HUFFTABLE
Packit c32a2d
					while((y=val[(MASK_UTYPE)mask>>(BITSHIFT+4)])<0)
Packit c32a2d
					{
Packit c32a2d
						val -= y;
Packit c32a2d
						num -= 4;
Packit c32a2d
						mask <<= 4;
Packit c32a2d
					}
Packit c32a2d
					num -= (y >> 8);
Packit c32a2d
					mask <<= (y >> 8);
Packit c32a2d
					x = (y >> 4) & 0xf;
Packit c32a2d
					y &= 0xf;
Packit c32a2d
#else
Packit c32a2d
					while((y=*val++)<0)
Packit c32a2d
					{
Packit c32a2d
						if (MSB_MASK) val -= y;
Packit c32a2d
Packit c32a2d
						num--;
Packit c32a2d
						mask <<= 1;
Packit c32a2d
					}
Packit c32a2d
					x = y >> 4;
Packit c32a2d
					y &= 0xf;
Packit c32a2d
#endif
Packit c32a2d
				}
Packit c32a2d
Packit c32a2d
				CHECK_XRPNT;
Packit c32a2d
				if(x == 15 && h->linbits)
Packit c32a2d
				{
Packit c32a2d
					max = cb;
Packit c32a2d
					REFRESH_MASK;
Packit c32a2d
					x += ((MASK_UTYPE) mask) >> (BITSHIFT+8-h->linbits);
Packit c32a2d
					num -= h->linbits+1;
Packit c32a2d
					mask <<= h->linbits;
Packit c32a2d
					if(MSB_MASK) *xrpnt++ = REAL_MUL_SCALE_LAYER3(-ispow[x], v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt++ = REAL_MUL_SCALE_LAYER3( ispow[x], v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else if(x)
Packit c32a2d
				{
Packit c32a2d
					max = cb;
Packit c32a2d
					if(MSB_MASK) *xrpnt++ = REAL_MUL_SCALE_LAYER3(-ispow[x], v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt++ = REAL_MUL_SCALE_LAYER3( ispow[x], v, gainpow2_scale_idx);
Packit c32a2d
					num--;
Packit c32a2d
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else *xrpnt++ = DOUBLE_TO_REAL(0.0);
Packit c32a2d
Packit c32a2d
				CHECK_XRPNT;
Packit c32a2d
				if(y == 15 && h->linbits)
Packit c32a2d
				{
Packit c32a2d
					max = cb;
Packit c32a2d
					REFRESH_MASK;
Packit c32a2d
					y += ((MASK_UTYPE) mask) >> (BITSHIFT+8-h->linbits);
Packit c32a2d
					num -= h->linbits+1;
Packit c32a2d
					mask <<= h->linbits;
Packit c32a2d
					if(MSB_MASK) *xrpnt++ = REAL_MUL_SCALE_LAYER3(-ispow[y], v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt++ = REAL_MUL_SCALE_LAYER3( ispow[y], v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else if(y)
Packit c32a2d
				{
Packit c32a2d
					max = cb;
Packit c32a2d
					if(MSB_MASK) *xrpnt++ = REAL_MUL_SCALE_LAYER3(-ispow[y], v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt++ = REAL_MUL_SCALE_LAYER3( ispow[y], v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					num--;
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else *xrpnt++ = DOUBLE_TO_REAL(0.0);
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		/* short (count1table) values */
Packit c32a2d
		for(;l3 && (part2remain+num > 0);l3--)
Packit c32a2d
		{
Packit c32a2d
			const struct newhuff *h = htc+gr_info->count1table_select;
Packit c32a2d
			const short *val = h->table;
Packit c32a2d
			register short a;
Packit c32a2d
Packit c32a2d
			REFRESH_MASK;
Packit c32a2d
			while((a=*val++)<0)
Packit c32a2d
			{
Packit c32a2d
				if (MSB_MASK) val -= a;
Packit c32a2d
Packit c32a2d
				num--;
Packit c32a2d
				mask <<= 1;
Packit c32a2d
			}
Packit c32a2d
			if(part2remain+num <= 0)
Packit c32a2d
			{
Packit c32a2d
				num -= part2remain+num;
Packit c32a2d
				break;
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			for(i=0;i<4;i++)
Packit c32a2d
			{
Packit c32a2d
				if(!(i & 1))
Packit c32a2d
				{
Packit c32a2d
					if(!mc)
Packit c32a2d
					{
Packit c32a2d
						mc = *m++;
Packit c32a2d
						cb = *m++;
Packit c32a2d
#ifdef CUT_SFB21
Packit c32a2d
						if(cb == 21)
Packit c32a2d
							v = 0.0;
Packit c32a2d
						else
Packit c32a2d
#endif
Packit c32a2d
						{
Packit c32a2d
#ifdef REAL_IS_FIXED
Packit c32a2d
							gainpow2_scale_idx = (int)(gr_info->pow2gain + (*scf << shift) - fr->gainpow2);
Packit c32a2d
#endif
Packit c32a2d
							v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
Packit c32a2d
						}
Packit c32a2d
					}
Packit c32a2d
					mc--;
Packit c32a2d
				}
Packit c32a2d
				CHECK_XRPNT;
Packit c32a2d
				if( (a & (0x8>>i)) )
Packit c32a2d
				{
Packit c32a2d
					max = cb;
Packit c32a2d
					if(part2remain+num <= 0)
Packit c32a2d
					break;
Packit c32a2d
Packit c32a2d
					if(MSB_MASK) *xrpnt++ = -REAL_SCALE_LAYER3(v, gainpow2_scale_idx);
Packit c32a2d
					else         *xrpnt++ =  REAL_SCALE_LAYER3(v, gainpow2_scale_idx);
Packit c32a2d
Packit c32a2d
					num--;
Packit c32a2d
					mask <<= 1;
Packit c32a2d
				}
Packit c32a2d
				else *xrpnt++ = DOUBLE_TO_REAL(0.0);
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		gr_info->maxbandl = max+1;
Packit c32a2d
		gr_info->maxb = fr->longLimit[sfreq][gr_info->maxbandl];
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	part2remain += num;
Packit c32a2d
	backbits(fr, num);
Packit c32a2d
	num = 0;
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		part2remain = 0;
Packit c32a2d
		/* Not entirely sure what good values are, must be > 0. */
Packit c32a2d
		gr_info->maxband[0] =
Packit c32a2d
		gr_info->maxband[1] =
Packit c32a2d
		gr_info->maxband[2] =
Packit c32a2d
		gr_info->maxbandl   = 1; /* sfb=maxband[lwin]*3 + lwin - mixed_block_flag must be >= 0 */
Packit c32a2d
		gr_info->maxb       = 1;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	while(xrpnt < &xr[SBLIMIT][0]) 
Packit c32a2d
	*xrpnt++ = DOUBLE_TO_REAL(0.0);
Packit c32a2d
Packit c32a2d
	while( part2remain > 16 )
Packit c32a2d
	{
Packit c32a2d
		skipbits(fr, 16); /* Dismiss stuffing Bits */
Packit c32a2d
		part2remain -= 16;
Packit c32a2d
	}
Packit c32a2d
	if(part2remain > 0) skipbits(fr, part2remain);
Packit c32a2d
	else if(part2remain < 0)
Packit c32a2d
	{
Packit c32a2d
		debug1("Can't rewind stream by %d bits!",-part2remain);
Packit c32a2d
		return 1; /* -> error */
Packit c32a2d
	}
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
/* calculate real channel values for Joint-I-Stereo-mode */
Packit c32a2d
static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac, struct gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf)
Packit c32a2d
{
Packit c32a2d
	real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf;
Packit c32a2d
	const struct bandInfoStruct *bi = &bandInfo[sfreq];
Packit c32a2d
Packit c32a2d
	const real *tab1,*tab2;
Packit c32a2d
Packit c32a2d
#if 1
Packit c32a2d
	int tab;
Packit c32a2d
/* TODO: optimize as static */
Packit c32a2d
	const real *tabs[3][2][2] =
Packit c32a2d
	{ 
Packit c32a2d
		{ { tan1_1,tan2_1 }       , { tan1_2,tan2_2 } },
Packit c32a2d
		{ { pow1_1[0],pow2_1[0] } , { pow1_2[0],pow2_2[0] } },
Packit c32a2d
		{ { pow1_1[1],pow2_1[1] } , { pow1_2[1],pow2_2[1] } }
Packit c32a2d
	};
Packit c32a2d
Packit c32a2d
	tab = lsf + (gr_info->scalefac_compress & lsf);
Packit c32a2d
	tab1 = tabs[tab][ms_stereo][0];
Packit c32a2d
	tab2 = tabs[tab][ms_stereo][1];
Packit c32a2d
#else
Packit c32a2d
	if(lsf)
Packit c32a2d
	{
Packit c32a2d
		int p = gr_info->scalefac_compress & 0x1;
Packit c32a2d
		if(ms_stereo)
Packit c32a2d
		{
Packit c32a2d
			tab1 = pow1_2[p];
Packit c32a2d
			tab2 = pow2_2[p];
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			tab1 = pow1_1[p];
Packit c32a2d
			tab2 = pow2_1[p];
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		if(ms_stereo)
Packit c32a2d
		{
Packit c32a2d
			tab1 = tan1_2;
Packit c32a2d
			tab2 = tan2_2;
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			tab1 = tan1_1;
Packit c32a2d
			tab2 = tan2_1;
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	if(gr_info->block_type == 2)
Packit c32a2d
	{
Packit c32a2d
		int lwin,do_l = 0;
Packit c32a2d
		if( gr_info->mixed_block_flag ) do_l = 1;
Packit c32a2d
Packit c32a2d
		for(lwin=0;lwin<3;lwin++)
Packit c32a2d
		{ /* process each window */
Packit c32a2d
			/* get first band with zero values */
Packit c32a2d
			int is_p,sb,idx,sfb = gr_info->maxband[lwin];  /* sfb is minimal 3 for mixed mode */
Packit c32a2d
			if(sfb > 3) do_l = 0;
Packit c32a2d
Packit c32a2d
			for(;sfb<12;sfb++)
Packit c32a2d
			{
Packit c32a2d
				is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ 
Packit c32a2d
				if(is_p != 7)
Packit c32a2d
				{
Packit c32a2d
					real t1,t2;
Packit c32a2d
					sb  = bi->shortDiff[sfb];
Packit c32a2d
					idx = bi->shortIdx[sfb] + lwin;
Packit c32a2d
					t1  = tab1[is_p]; t2 = tab2[is_p];
Packit c32a2d
					for (; sb > 0; sb--,idx+=3)
Packit c32a2d
					{
Packit c32a2d
						real v = xr[0][idx];
Packit c32a2d
						xr[0][idx] = REAL_MUL_15(v, t1);
Packit c32a2d
						xr[1][idx] = REAL_MUL_15(v, t2);
Packit c32a2d
					}
Packit c32a2d
				}
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
#if 1
Packit c32a2d
/* in the original: copy 10 to 11 , here: copy 11 to 12 
Packit c32a2d
maybe still wrong??? (copy 12 to 13?) */
Packit c32a2d
			is_p = scalefac[11*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
Packit c32a2d
			sb   = bi->shortDiff[12];
Packit c32a2d
			idx  = bi->shortIdx[12] + lwin;
Packit c32a2d
#else
Packit c32a2d
			is_p = scalefac[10*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
Packit c32a2d
			sb   = bi->shortDiff[11];
Packit c32a2d
			idx  = bi->shortIdx[11] + lwin;
Packit c32a2d
#endif
Packit c32a2d
			if(is_p != 7)
Packit c32a2d
			{
Packit c32a2d
				real t1,t2;
Packit c32a2d
				t1 = tab1[is_p]; t2 = tab2[is_p];
Packit c32a2d
				for( ; sb > 0; sb--,idx+=3 )
Packit c32a2d
				{  
Packit c32a2d
					real v = xr[0][idx];
Packit c32a2d
					xr[0][idx] = REAL_MUL_15(v, t1);
Packit c32a2d
					xr[1][idx] = REAL_MUL_15(v, t2);
Packit c32a2d
				}
Packit c32a2d
			}
Packit c32a2d
		} /* end for(lwin; .. ; . ) */
Packit c32a2d
Packit c32a2d
		/* also check l-part, if ALL bands in the three windows are 'empty' and mode = mixed_mode */
Packit c32a2d
		if(do_l)
Packit c32a2d
		{
Packit c32a2d
			int sfb = gr_info->maxbandl;
Packit c32a2d
			int idx;
Packit c32a2d
			if(sfb > 21) return; /* similarity fix related to CVE-2006-1655 */
Packit c32a2d
Packit c32a2d
			idx = bi->longIdx[sfb];
Packit c32a2d
			for( ; sfb<8; sfb++ )
Packit c32a2d
			{
Packit c32a2d
				int sb = bi->longDiff[sfb];
Packit c32a2d
				int is_p = scalefac[sfb]; /* scale: 0-15 */
Packit c32a2d
				if(is_p != 7)
Packit c32a2d
				{
Packit c32a2d
					real t1,t2;
Packit c32a2d
					t1 = tab1[is_p]; t2 = tab2[is_p];
Packit c32a2d
					for( ; sb > 0; sb--,idx++)
Packit c32a2d
					{
Packit c32a2d
						real v = xr[0][idx];
Packit c32a2d
						xr[0][idx] = REAL_MUL_15(v, t1);
Packit c32a2d
						xr[1][idx] = REAL_MUL_15(v, t2);
Packit c32a2d
					}
Packit c32a2d
				}
Packit c32a2d
				else idx += sb;
Packit c32a2d
			}
Packit c32a2d
		}     
Packit c32a2d
	} 
Packit c32a2d
	else
Packit c32a2d
	{ /* ((gr_info->block_type != 2)) */
Packit c32a2d
		int sfb = gr_info->maxbandl;
Packit c32a2d
		int is_p,idx;
Packit c32a2d
		if(sfb > 21) return; /* tightened fix for CVE-2006-1655 */
Packit c32a2d
Packit c32a2d
		idx = bi->longIdx[sfb];
Packit c32a2d
		for ( ; sfb<21; sfb++)
Packit c32a2d
		{
Packit c32a2d
			int sb = bi->longDiff[sfb];
Packit c32a2d
			is_p = scalefac[sfb]; /* scale: 0-15 */
Packit c32a2d
			if(is_p != 7)
Packit c32a2d
			{
Packit c32a2d
				real t1,t2;
Packit c32a2d
				t1 = tab1[is_p]; t2 = tab2[is_p];
Packit c32a2d
				for( ; sb > 0; sb--,idx++)
Packit c32a2d
				{
Packit c32a2d
					 real v = xr[0][idx];
Packit c32a2d
					 xr[0][idx] = REAL_MUL_15(v, t1);
Packit c32a2d
					 xr[1][idx] = REAL_MUL_15(v, t2);
Packit c32a2d
				}
Packit c32a2d
			}
Packit c32a2d
			else idx += sb;
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		is_p = scalefac[20];
Packit c32a2d
		if(is_p != 7)
Packit c32a2d
		{  /* copy l-band 20 to l-band 21 */
Packit c32a2d
			int sb;
Packit c32a2d
			real t1 = tab1[is_p],t2 = tab2[is_p]; 
Packit c32a2d
Packit c32a2d
			for( sb = bi->longDiff[21]; sb > 0; sb--,idx++ )
Packit c32a2d
			{
Packit c32a2d
				real v = xr[0][idx];
Packit c32a2d
				xr[0][idx] = REAL_MUL_15(v, t1);
Packit c32a2d
				xr[1][idx] = REAL_MUL_15(v, t2);
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_info)
Packit c32a2d
{
Packit c32a2d
	int sblim;
Packit c32a2d
Packit c32a2d
	if(gr_info->block_type == 2)
Packit c32a2d
	{
Packit c32a2d
			if(!gr_info->mixed_block_flag) return;
Packit c32a2d
Packit c32a2d
			sblim = 1; 
Packit c32a2d
	}
Packit c32a2d
	else sblim = gr_info->maxb-1;
Packit c32a2d
Packit c32a2d
	/* 31 alias-reduction operations between each pair of sub-bands */
Packit c32a2d
	/* with 8 butterflies between each pair                         */
Packit c32a2d
Packit c32a2d
	{
Packit c32a2d
		int sb;
Packit c32a2d
		real *xr1=(real *) xr[1];
Packit c32a2d
Packit c32a2d
		for(sb=sblim; sb; sb--,xr1+=10)
Packit c32a2d
		{
Packit c32a2d
			int ss;
Packit c32a2d
			real *cs=aa_cs,*ca=aa_ca;
Packit c32a2d
			real *xr2 = xr1;
Packit c32a2d
Packit c32a2d
			for(ss=7;ss>=0;ss--)
Packit c32a2d
			{ /* upper and lower butterfly inputs */
Packit c32a2d
				register real bu = *--xr2,bd = *xr1;
Packit c32a2d
				*xr2   = REAL_MUL(bu, *cs) - REAL_MUL(bd, *ca);
Packit c32a2d
				*xr1++ = REAL_MUL(bd, *cs++) + REAL_MUL(bu, *ca++);
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* 
Packit c32a2d
	This is an optimized DCT from Jeff Tsay's maplay 1.2+ package.
Packit c32a2d
	Saved one multiplication by doing the 'twiddle factor' stuff
Packit c32a2d
	together with the window mul. (MH)
Packit c32a2d
Packit c32a2d
	This uses Byeong Gi Lee's Fast Cosine Transform algorithm, but the
Packit c32a2d
	9 point IDCT needs to be reduced further. Unfortunately, I don't
Packit c32a2d
	know how to do that, because 9 is not an even number. - Jeff.
Packit c32a2d
Packit c32a2d
	Original Message:
Packit c32a2d
Packit c32a2d
	9 Point Inverse Discrete Cosine Transform
Packit c32a2d
Packit c32a2d
	This piece of code is Copyright 1997 Mikko Tommila and is freely usable
Packit c32a2d
	by anybody. The algorithm itself is of course in the public domain.
Packit c32a2d
Packit c32a2d
	Again derived heuristically from the 9-point WFTA.
Packit c32a2d
Packit c32a2d
	The algorithm is optimized (?) for speed, not for small rounding errors or
Packit c32a2d
	good readability.
Packit c32a2d
Packit c32a2d
	36 additions, 11 multiplications
Packit c32a2d
Packit c32a2d
	Again this is very likely sub-optimal.
Packit c32a2d
Packit c32a2d
	The code is optimized to use a minimum number of temporary variables,
Packit c32a2d
	so it should compile quite well even on 8-register Intel x86 processors.
Packit c32a2d
	This makes the code quite obfuscated and very difficult to understand.
Packit c32a2d
Packit c32a2d
	References:
Packit c32a2d
	[1] S. Winograd: "On Computing the Discrete Fourier Transform",
Packit c32a2d
	    Mathematics of Computation, Volume 32, Number 141, January 1978,
Packit c32a2d
	    Pages 175-199
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
/* Calculation of the inverse MDCT
Packit c32a2d
   used to be static without 3dnow - does that really matter? */
Packit c32a2d
void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf)
Packit c32a2d
{
Packit c32a2d
#ifdef NEW_DCT9
Packit c32a2d
	real tmp[18];
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	{
Packit c32a2d
		register real *in = inbuf;
Packit c32a2d
Packit c32a2d
		in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14];
Packit c32a2d
		in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11];
Packit c32a2d
		in[11]+=in[10]; in[10]+=in[9];  in[9] +=in[8];
Packit c32a2d
		in[8] +=in[7];  in[7] +=in[6];  in[6] +=in[5];
Packit c32a2d
		in[5] +=in[4];  in[4] +=in[3];  in[3] +=in[2];
Packit c32a2d
		in[2] +=in[1];  in[1] +=in[0];
Packit c32a2d
Packit c32a2d
		in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
Packit c32a2d
		in[9] +=in[7];  in[7] +=in[5];  in[5] +=in[3];  in[3] +=in[1];
Packit c32a2d
Packit c32a2d
Packit c32a2d
#ifdef NEW_DCT9
Packit c32a2d
#if 1
Packit c32a2d
		{
Packit c32a2d
			real t3;
Packit c32a2d
			{
Packit c32a2d
				real t0, t1, t2;
Packit c32a2d
Packit c32a2d
				t0 = REAL_MUL(COS6_2, (in[8] + in[16] - in[4]));
Packit c32a2d
				t1 = REAL_MUL(COS6_2, in[12]);
Packit c32a2d
Packit c32a2d
				t3 = in[0];
Packit c32a2d
				t2 = t3 - t1 - t1;
Packit c32a2d
				tmp[1] = tmp[7] = t2 - t0;
Packit c32a2d
				tmp[4]          = t2 + t0 + t0;
Packit c32a2d
				t3 += t1;
Packit c32a2d
Packit c32a2d
				t2 = REAL_MUL(COS6_1, (in[10] + in[14] - in[2]));
Packit c32a2d
				tmp[1] -= t2;
Packit c32a2d
				tmp[7] += t2;
Packit c32a2d
			}
Packit c32a2d
			{
Packit c32a2d
				real t0, t1, t2;
Packit c32a2d
Packit c32a2d
				t0 = REAL_MUL(cos9[0], (in[4] + in[8] ));
Packit c32a2d
				t1 = REAL_MUL(cos9[1], (in[8] - in[16]));
Packit c32a2d
				t2 = REAL_MUL(cos9[2], (in[4] + in[16]));
Packit c32a2d
Packit c32a2d
				tmp[2] = tmp[6] = t3 - t0      - t2;
Packit c32a2d
				tmp[0] = tmp[8] = t3 + t0 + t1;
Packit c32a2d
				tmp[3] = tmp[5] = t3      - t1 + t2;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
		{
Packit c32a2d
			real t1, t2, t3;
Packit c32a2d
Packit c32a2d
			t1 = REAL_MUL(cos18[0], (in[2]  + in[10]));
Packit c32a2d
			t2 = REAL_MUL(cos18[1], (in[10] - in[14]));
Packit c32a2d
			t3 = REAL_MUL(COS6_1,    in[6]);
Packit c32a2d
Packit c32a2d
			{
Packit c32a2d
				real t0 = t1 + t2 + t3;
Packit c32a2d
				tmp[0] += t0;
Packit c32a2d
				tmp[8] -= t0;
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			t2 -= t3;
Packit c32a2d
			t1 -= t3;
Packit c32a2d
Packit c32a2d
			t3 = REAL_MUL(cos18[2], (in[2] + in[14]));
Packit c32a2d
Packit c32a2d
			t1 += t3;
Packit c32a2d
			tmp[3] += t1;
Packit c32a2d
			tmp[5] -= t1;
Packit c32a2d
Packit c32a2d
			t2 -= t3;
Packit c32a2d
			tmp[2] += t2;
Packit c32a2d
			tmp[6] -= t2;
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
#else
Packit c32a2d
		{
Packit c32a2d
			real t0, t1, t2, t3, t4, t5, t6, t7;
Packit c32a2d
Packit c32a2d
			t1 = REAL_MUL(COS6_2, in[12]);
Packit c32a2d
			t2 = REAL_MUL(COS6_2, (in[8] + in[16] - in[4]));
Packit c32a2d
Packit c32a2d
			t3 = in[0] + t1;
Packit c32a2d
			t4 = in[0] - t1 - t1;
Packit c32a2d
			t5     = t4 - t2;
Packit c32a2d
			tmp[4] = t4 + t2 + t2;
Packit c32a2d
Packit c32a2d
			t0 = REAL_MUL(cos9[0], (in[4] + in[8]));
Packit c32a2d
			t1 = REAL_MUL(cos9[1], (in[8] - in[16]));
Packit c32a2d
Packit c32a2d
			t2 = REAL_MUL(cos9[2], (in[4] + in[16]));
Packit c32a2d
Packit c32a2d
			t6 = t3 - t0 - t2;
Packit c32a2d
			t0 += t3 + t1;
Packit c32a2d
			t3 += t2 - t1;
Packit c32a2d
Packit c32a2d
			t2 = REAL_MUL(cos18[0], (in[2]  + in[10]));
Packit c32a2d
			t4 = REAL_MUL(cos18[1], (in[10] - in[14]));
Packit c32a2d
			t7 = REAL_MUL(COS6_1, in[6]);
Packit c32a2d
Packit c32a2d
			t1 = t2 + t4 + t7;
Packit c32a2d
			tmp[0] = t0 + t1;
Packit c32a2d
			tmp[8] = t0 - t1;
Packit c32a2d
			t1 = REAL_MUL(cos18[2], (in[2] + in[14]));
Packit c32a2d
			t2 += t1 - t7;
Packit c32a2d
Packit c32a2d
			tmp[3] = t3 + t2;
Packit c32a2d
			t0 = REAL_MUL(COS6_1, (in[10] + in[14] - in[2]));
Packit c32a2d
			tmp[5] = t3 - t2;
Packit c32a2d
Packit c32a2d
			t4 -= t1 + t7;
Packit c32a2d
Packit c32a2d
			tmp[1] = t5 - t0;
Packit c32a2d
			tmp[7] = t5 + t0;
Packit c32a2d
			tmp[2] = t6 + t4;
Packit c32a2d
			tmp[6] = t6 - t4;
Packit c32a2d
		}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
		{
Packit c32a2d
			real t0, t1, t2, t3, t4, t5, t6, t7;
Packit c32a2d
Packit c32a2d
			t1 = REAL_MUL(COS6_2, in[13]);
Packit c32a2d
			t2 = REAL_MUL(COS6_2, (in[9] + in[17] - in[5]));
Packit c32a2d
Packit c32a2d
			t3 = in[1] + t1;
Packit c32a2d
			t4 = in[1] - t1 - t1;
Packit c32a2d
			t5 = t4 - t2;
Packit c32a2d
Packit c32a2d
			t0 = REAL_MUL(cos9[0], (in[5] + in[9]));
Packit c32a2d
			t1 = REAL_MUL(cos9[1], (in[9] - in[17]));
Packit c32a2d
Packit c32a2d
			tmp[13] = REAL_MUL((t4 + t2 + t2), tfcos36[17-13]);
Packit c32a2d
			t2 = REAL_MUL(cos9[2], (in[5] + in[17]));
Packit c32a2d
Packit c32a2d
			t6 = t3 - t0 - t2;
Packit c32a2d
			t0 += t3 + t1;
Packit c32a2d
			t3 += t2 - t1;
Packit c32a2d
Packit c32a2d
			t2 = REAL_MUL(cos18[0], (in[3]  + in[11]));
Packit c32a2d
			t4 = REAL_MUL(cos18[1], (in[11] - in[15]));
Packit c32a2d
			t7 = REAL_MUL(COS6_1, in[7]);
Packit c32a2d
Packit c32a2d
			t1 = t2 + t4 + t7;
Packit c32a2d
			tmp[17] = REAL_MUL((t0 + t1), tfcos36[17-17]);
Packit c32a2d
			tmp[9]  = REAL_MUL((t0 - t1), tfcos36[17-9]);
Packit c32a2d
			t1 = REAL_MUL(cos18[2], (in[3] + in[15]));
Packit c32a2d
			t2 += t1 - t7;
Packit c32a2d
Packit c32a2d
			tmp[14] = REAL_MUL((t3 + t2), tfcos36[17-14]);
Packit c32a2d
			t0 = REAL_MUL(COS6_1, (in[11] + in[15] - in[3]));
Packit c32a2d
			tmp[12] = REAL_MUL((t3 - t2), tfcos36[17-12]);
Packit c32a2d
Packit c32a2d
			t4 -= t1 + t7;
Packit c32a2d
Packit c32a2d
			tmp[16] = REAL_MUL((t5 - t0), tfcos36[17-16]);
Packit c32a2d
			tmp[10] = REAL_MUL((t5 + t0), tfcos36[17-10]);
Packit c32a2d
			tmp[15] = REAL_MUL((t6 + t4), tfcos36[17-15]);
Packit c32a2d
			tmp[11] = REAL_MUL((t6 - t4), tfcos36[17-11]);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
#define MACRO(v) { \
Packit c32a2d
		real tmpval; \
Packit c32a2d
		tmpval = tmp[(v)] + tmp[17-(v)]; \
Packit c32a2d
		out2[9+(v)] = REAL_MUL(tmpval, w[27+(v)]); \
Packit c32a2d
		out2[8-(v)] = REAL_MUL(tmpval, w[26-(v)]); \
Packit c32a2d
		tmpval = tmp[(v)] - tmp[17-(v)]; \
Packit c32a2d
		ts[SBLIMIT*(8-(v))] = out1[8-(v)] + REAL_MUL(tmpval, w[8-(v)]); \
Packit c32a2d
		ts[SBLIMIT*(9+(v))] = out1[9+(v)] + REAL_MUL(tmpval, w[9+(v)]); }
Packit c32a2d
Packit c32a2d
		{
Packit c32a2d
			register real *out2 = o2;
Packit c32a2d
			register real *w = wintab;
Packit c32a2d
			register real *out1 = o1;
Packit c32a2d
			register real *ts = tsbuf;
Packit c32a2d
Packit c32a2d
			MACRO(0);
Packit c32a2d
			MACRO(1);
Packit c32a2d
			MACRO(2);
Packit c32a2d
			MACRO(3);
Packit c32a2d
			MACRO(4);
Packit c32a2d
			MACRO(5);
Packit c32a2d
			MACRO(6);
Packit c32a2d
			MACRO(7);
Packit c32a2d
			MACRO(8);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
#else
Packit c32a2d
Packit c32a2d
		{
Packit c32a2d
Packit c32a2d
#define MACRO0(v) { \
Packit c32a2d
	real tmp; \
Packit c32a2d
	out2[9+(v)] = REAL_MUL((tmp = sum0 + sum1), w[27+(v)]); \
Packit c32a2d
	out2[8-(v)] = REAL_MUL(tmp, w[26-(v)]);   } \
Packit c32a2d
	sum0 -= sum1; \
Packit c32a2d
	ts[SBLIMIT*(8-(v))] = out1[8-(v)] + REAL_MUL(sum0, w[8-(v)]); \
Packit c32a2d
	ts[SBLIMIT*(9+(v))] = out1[9+(v)] + REAL_MUL(sum0, w[9+(v)]);
Packit c32a2d
#define MACRO1(v) { \
Packit c32a2d
	real sum0,sum1; \
Packit c32a2d
	sum0 = tmp1a + tmp2a; \
Packit c32a2d
	sum1 = REAL_MUL((tmp1b + tmp2b), tfcos36[(v)]); \
Packit c32a2d
	MACRO0(v); }
Packit c32a2d
#define MACRO2(v) { \
Packit c32a2d
	real sum0,sum1; \
Packit c32a2d
	sum0 = tmp2a - tmp1a; \
Packit c32a2d
	sum1 = REAL_MUL((tmp2b - tmp1b), tfcos36[(v)]); \
Packit c32a2d
	MACRO0(v); }
Packit c32a2d
Packit c32a2d
			register const real *c = COS9;
Packit c32a2d
			register real *out2 = o2;
Packit c32a2d
			register real *w = wintab;
Packit c32a2d
			register real *out1 = o1;
Packit c32a2d
			register real *ts = tsbuf;
Packit c32a2d
Packit c32a2d
			real ta33,ta66,tb33,tb66;
Packit c32a2d
Packit c32a2d
			ta33 = REAL_MUL(in[2*3+0], c[3]);
Packit c32a2d
			ta66 = REAL_MUL(in[2*6+0], c[6]);
Packit c32a2d
			tb33 = REAL_MUL(in[2*3+1], c[3]);
Packit c32a2d
			tb66 = REAL_MUL(in[2*6+1], c[6]);
Packit c32a2d
Packit c32a2d
			{ 
Packit c32a2d
				real tmp1a,tmp2a,tmp1b,tmp2b;
Packit c32a2d
				tmp1a = REAL_MUL(in[2*1+0], c[1]) + ta33 + REAL_MUL(in[2*5+0], c[5]) + REAL_MUL(in[2*7+0], c[7]);
Packit c32a2d
				tmp1b = REAL_MUL(in[2*1+1], c[1]) + tb33 + REAL_MUL(in[2*5+1], c[5]) + REAL_MUL(in[2*7+1], c[7]);
Packit c32a2d
				tmp2a = REAL_MUL(in[2*2+0], c[2]) + REAL_MUL(in[2*4+0], c[4]) + ta66 + REAL_MUL(in[2*8+0], c[8]);
Packit c32a2d
				tmp2b = REAL_MUL(in[2*2+1], c[2]) + REAL_MUL(in[2*4+1], c[4]) + tb66 + REAL_MUL(in[2*8+1], c[8]);
Packit c32a2d
Packit c32a2d
				MACRO1(0);
Packit c32a2d
				MACRO2(8);
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			{
Packit c32a2d
				real tmp1a,tmp2a,tmp1b,tmp2b;
Packit c32a2d
				tmp1a = REAL_MUL(( in[2*1+0] - in[2*5+0] - in[2*7+0] ), c[3]);
Packit c32a2d
				tmp1b = REAL_MUL(( in[2*1+1] - in[2*5+1] - in[2*7+1] ), c[3]);
Packit c32a2d
				tmp2a = REAL_MUL(( in[2*2+0] - in[2*4+0] - in[2*8+0] ), c[6]) - in[2*6+0] + in[2*0+0];
Packit c32a2d
				tmp2b = REAL_MUL(( in[2*2+1] - in[2*4+1] - in[2*8+1] ), c[6]) - in[2*6+1] + in[2*0+1];
Packit c32a2d
Packit c32a2d
				MACRO1(1);
Packit c32a2d
				MACRO2(7);
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			{
Packit c32a2d
				real tmp1a,tmp2a,tmp1b,tmp2b;
Packit c32a2d
				tmp1a =   REAL_MUL(in[2*1+0], c[5]) - ta33 - REAL_MUL(in[2*5+0], c[7]) + REAL_MUL(in[2*7+0], c[1]);
Packit c32a2d
				tmp1b =   REAL_MUL(in[2*1+1], c[5]) - tb33 - REAL_MUL(in[2*5+1], c[7]) + REAL_MUL(in[2*7+1], c[1]);
Packit c32a2d
				tmp2a = - REAL_MUL(in[2*2+0], c[8]) - REAL_MUL(in[2*4+0], c[2]) + ta66 + REAL_MUL(in[2*8+0], c[4]);
Packit c32a2d
				tmp2b = - REAL_MUL(in[2*2+1], c[8]) - REAL_MUL(in[2*4+1], c[2]) + tb66 + REAL_MUL(in[2*8+1], c[4]);
Packit c32a2d
Packit c32a2d
				MACRO1(2);
Packit c32a2d
				MACRO2(6);
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			{
Packit c32a2d
				real tmp1a,tmp2a,tmp1b,tmp2b;
Packit c32a2d
				tmp1a =   REAL_MUL(in[2*1+0], c[7]) - ta33 + REAL_MUL(in[2*5+0], c[1]) - REAL_MUL(in[2*7+0], c[5]);
Packit c32a2d
				tmp1b =   REAL_MUL(in[2*1+1], c[7]) - tb33 + REAL_MUL(in[2*5+1], c[1]) - REAL_MUL(in[2*7+1], c[5]);
Packit c32a2d
				tmp2a = - REAL_MUL(in[2*2+0], c[4]) + REAL_MUL(in[2*4+0], c[8]) + ta66 - REAL_MUL(in[2*8+0], c[2]);
Packit c32a2d
				tmp2b = - REAL_MUL(in[2*2+1], c[4]) + REAL_MUL(in[2*4+1], c[8]) + tb66 - REAL_MUL(in[2*8+1], c[2]);
Packit c32a2d
Packit c32a2d
				MACRO1(3);
Packit c32a2d
				MACRO2(5);
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			{
Packit c32a2d
				real sum0,sum1;
Packit c32a2d
				sum0 =  in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0];
Packit c32a2d
				sum1 = REAL_MUL((in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ), tfcos36[4]);
Packit c32a2d
				MACRO0(4);
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
/* new DCT12 */
Packit c32a2d
static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts)
Packit c32a2d
{
Packit c32a2d
#define DCT12_PART1 \
Packit c32a2d
	in5 = in[5*3];  \
Packit c32a2d
	in5 += (in4 = in[4*3]); \
Packit c32a2d
	in4 += (in3 = in[3*3]); \
Packit c32a2d
	in3 += (in2 = in[2*3]); \
Packit c32a2d
	in2 += (in1 = in[1*3]); \
Packit c32a2d
	in1 += (in0 = in[0*3]); \
Packit c32a2d
	\
Packit c32a2d
	in5 += in3; in3 += in1; \
Packit c32a2d
	\
Packit c32a2d
	in2 = REAL_MUL(in2, COS6_1); \
Packit c32a2d
	in3 = REAL_MUL(in3, COS6_1);
Packit c32a2d
Packit c32a2d
#define DCT12_PART2 \
Packit c32a2d
	in0 += REAL_MUL(in4, COS6_2); \
Packit c32a2d
	\
Packit c32a2d
	in4 = in0 + in2; \
Packit c32a2d
	in0 -= in2;      \
Packit c32a2d
	\
Packit c32a2d
	in1 += REAL_MUL(in5, COS6_2); \
Packit c32a2d
	\
Packit c32a2d
	in5 = REAL_MUL((in1 + in3), tfcos12[0]); \
Packit c32a2d
	in1 = REAL_MUL((in1 - in3), tfcos12[2]); \
Packit c32a2d
	\
Packit c32a2d
	in3 = in4 + in5; \
Packit c32a2d
	in4 -= in5;      \
Packit c32a2d
	\
Packit c32a2d
	in2 = in0 + in1; \
Packit c32a2d
	in0 -= in1;
Packit c32a2d
Packit c32a2d
	{
Packit c32a2d
		real in0,in1,in2,in3,in4,in5;
Packit c32a2d
		register real *out1 = rawout1;
Packit c32a2d
		ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2];
Packit c32a2d
		ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5];
Packit c32a2d
 
Packit c32a2d
		DCT12_PART1
Packit c32a2d
Packit c32a2d
		{
Packit c32a2d
			real tmp0,tmp1 = (in0 - in4);
Packit c32a2d
			{
Packit c32a2d
				real tmp2 = REAL_MUL((in1 - in5), tfcos12[1]);
Packit c32a2d
				tmp0 = tmp1 + tmp2;
Packit c32a2d
				tmp1 -= tmp2;
Packit c32a2d
			}
Packit c32a2d
			ts[(17-1)*SBLIMIT] = out1[17-1] + REAL_MUL(tmp0, wi[11-1]);
Packit c32a2d
			ts[(12+1)*SBLIMIT] = out1[12+1] + REAL_MUL(tmp0, wi[6+1]);
Packit c32a2d
			ts[(6 +1)*SBLIMIT] = out1[6 +1] + REAL_MUL(tmp1, wi[1]);
Packit c32a2d
			ts[(11-1)*SBLIMIT] = out1[11-1] + REAL_MUL(tmp1, wi[5-1]);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		DCT12_PART2
Packit c32a2d
Packit c32a2d
		ts[(17-0)*SBLIMIT] = out1[17-0] + REAL_MUL(in2, wi[11-0]);
Packit c32a2d
		ts[(12+0)*SBLIMIT] = out1[12+0] + REAL_MUL(in2, wi[6+0]);
Packit c32a2d
		ts[(12+2)*SBLIMIT] = out1[12+2] + REAL_MUL(in3, wi[6+2]);
Packit c32a2d
		ts[(17-2)*SBLIMIT] = out1[17-2] + REAL_MUL(in3, wi[11-2]);
Packit c32a2d
Packit c32a2d
		ts[(6 +0)*SBLIMIT]  = out1[6+0] + REAL_MUL(in0, wi[0]);
Packit c32a2d
		ts[(11-0)*SBLIMIT] = out1[11-0] + REAL_MUL(in0, wi[5-0]);
Packit c32a2d
		ts[(6 +2)*SBLIMIT]  = out1[6+2] + REAL_MUL(in4, wi[2]);
Packit c32a2d
		ts[(11-2)*SBLIMIT] = out1[11-2] + REAL_MUL(in4, wi[5-2]);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	in++;
Packit c32a2d
Packit c32a2d
	{
Packit c32a2d
		real in0,in1,in2,in3,in4,in5;
Packit c32a2d
		register real *out2 = rawout2;
Packit c32a2d
 
Packit c32a2d
		DCT12_PART1
Packit c32a2d
Packit c32a2d
		{
Packit c32a2d
			real tmp0,tmp1 = (in0 - in4);
Packit c32a2d
			{
Packit c32a2d
				real tmp2 = REAL_MUL((in1 - in5), tfcos12[1]);
Packit c32a2d
				tmp0 = tmp1 + tmp2;
Packit c32a2d
				tmp1 -= tmp2;
Packit c32a2d
			}
Packit c32a2d
			out2[5-1] = REAL_MUL(tmp0, wi[11-1]);
Packit c32a2d
			out2[0+1] = REAL_MUL(tmp0, wi[6+1]);
Packit c32a2d
			ts[(12+1)*SBLIMIT] += REAL_MUL(tmp1, wi[1]);
Packit c32a2d
			ts[(17-1)*SBLIMIT] += REAL_MUL(tmp1, wi[5-1]);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		DCT12_PART2
Packit c32a2d
Packit c32a2d
		out2[5-0] = REAL_MUL(in2, wi[11-0]);
Packit c32a2d
		out2[0+0] = REAL_MUL(in2, wi[6+0]);
Packit c32a2d
		out2[0+2] = REAL_MUL(in3, wi[6+2]);
Packit c32a2d
		out2[5-2] = REAL_MUL(in3, wi[11-2]);
Packit c32a2d
Packit c32a2d
		ts[(12+0)*SBLIMIT] += REAL_MUL(in0, wi[0]);
Packit c32a2d
		ts[(17-0)*SBLIMIT] += REAL_MUL(in0, wi[5-0]);
Packit c32a2d
		ts[(12+2)*SBLIMIT] += REAL_MUL(in4, wi[2]);
Packit c32a2d
		ts[(17-2)*SBLIMIT] += REAL_MUL(in4, wi[5-2]);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	in++; 
Packit c32a2d
Packit c32a2d
	{
Packit c32a2d
		real in0,in1,in2,in3,in4,in5;
Packit c32a2d
		register real *out2 = rawout2;
Packit c32a2d
		out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0;
Packit c32a2d
Packit c32a2d
		DCT12_PART1
Packit c32a2d
Packit c32a2d
		{
Packit c32a2d
			real tmp0,tmp1 = (in0 - in4);
Packit c32a2d
			{
Packit c32a2d
				real tmp2 = REAL_MUL((in1 - in5), tfcos12[1]);
Packit c32a2d
				tmp0 = tmp1 + tmp2;
Packit c32a2d
				tmp1 -= tmp2;
Packit c32a2d
			}
Packit c32a2d
			out2[11-1] = REAL_MUL(tmp0, wi[11-1]);
Packit c32a2d
			out2[6 +1] = REAL_MUL(tmp0, wi[6+1]);
Packit c32a2d
			out2[0+1] += REAL_MUL(tmp1, wi[1]);
Packit c32a2d
			out2[5-1] += REAL_MUL(tmp1, wi[5-1]);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		DCT12_PART2
Packit c32a2d
Packit c32a2d
		out2[11-0] = REAL_MUL(in2, wi[11-0]);
Packit c32a2d
		out2[6 +0] = REAL_MUL(in2, wi[6+0]);
Packit c32a2d
		out2[6 +2] = REAL_MUL(in3, wi[6+2]);
Packit c32a2d
		out2[11-2] = REAL_MUL(in3, wi[11-2]);
Packit c32a2d
Packit c32a2d
		out2[0+0] += REAL_MUL(in0, wi[0]);
Packit c32a2d
		out2[5-0] += REAL_MUL(in0, wi[5-0]);
Packit c32a2d
		out2[0+2] += REAL_MUL(in4, wi[2]);
Packit c32a2d
		out2[5-2] += REAL_MUL(in4, wi[5-2]);
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
static void III_hybrid(real fsIn[SBLIMIT][SSLIMIT], real tsOut[SSLIMIT][SBLIMIT], int ch,struct gr_info_s *gr_info, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	real (*block)[2][SBLIMIT*SSLIMIT] = fr->hybrid_block;
Packit c32a2d
	int *blc = fr->hybrid_blc;
Packit c32a2d
Packit c32a2d
	real *tspnt = (real *) tsOut;
Packit c32a2d
	real *rawout1,*rawout2;
Packit c32a2d
	int bt = 0;
Packit c32a2d
	size_t sb = 0;
Packit c32a2d
Packit c32a2d
	{
Packit c32a2d
		int b = blc[ch];
Packit c32a2d
		rawout1=block[b][ch];
Packit c32a2d
		b=-b+1;
Packit c32a2d
		rawout2=block[b][ch];
Packit c32a2d
		blc[ch] = b;
Packit c32a2d
	}
Packit c32a2d
  
Packit c32a2d
	if(gr_info->mixed_block_flag)
Packit c32a2d
	{
Packit c32a2d
		sb = 2;
Packit c32a2d
		opt_dct36(fr)(fsIn[0],rawout1,rawout2,win[0],tspnt);
Packit c32a2d
		opt_dct36(fr)(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1);
Packit c32a2d
		rawout1 += 36; rawout2 += 36; tspnt += 2;
Packit c32a2d
	}
Packit c32a2d
 
Packit c32a2d
	bt = gr_info->block_type;
Packit c32a2d
	if(bt == 2)
Packit c32a2d
	{
Packit c32a2d
		for(; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36)
Packit c32a2d
		{
Packit c32a2d
			dct12(fsIn[sb]  ,rawout1   ,rawout2   ,win[2] ,tspnt);
Packit c32a2d
			dct12(fsIn[sb+1],rawout1+18,rawout2+18,win1[2],tspnt+1);
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		for(; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36)
Packit c32a2d
		{
Packit c32a2d
			opt_dct36(fr)(fsIn[sb],rawout1,rawout2,win[bt],tspnt);
Packit c32a2d
			opt_dct36(fr)(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1);
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	for(;sb
Packit c32a2d
	{
Packit c32a2d
		int i;
Packit c32a2d
		for(i=0;i
Packit c32a2d
		{
Packit c32a2d
			tspnt[i*SBLIMIT] = *rawout1++;
Packit c32a2d
			*rawout2++ = DOUBLE_TO_REAL(0.0);
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
/* And at the end... the main layer3 handler */
Packit c32a2d
int do_layer3(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	int gr, ch, ss,clip=0;
Packit c32a2d
	int scalefacs[2][39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
Packit c32a2d
	struct III_sideinfo sideinfo;
Packit c32a2d
	int stereo = fr->stereo;
Packit c32a2d
	int single = fr->single;
Packit c32a2d
	int ms_stereo,i_stereo;
Packit c32a2d
	int sfreq = fr->sampling_frequency;
Packit c32a2d
	int stereo1,granules;
Packit c32a2d
Packit c32a2d
	if(stereo == 1)
Packit c32a2d
	{ /* stream is mono */
Packit c32a2d
		stereo1 = 1;
Packit c32a2d
		single = SINGLE_LEFT;
Packit c32a2d
	}
Packit c32a2d
	else if(single != SINGLE_STEREO) /* stream is stereo, but force to mono */
Packit c32a2d
	stereo1 = 1;
Packit c32a2d
	else
Packit c32a2d
	stereo1 = 2;
Packit c32a2d
Packit c32a2d
	if(fr->mode == MPG_MD_JOINT_STEREO)
Packit c32a2d
	{
Packit c32a2d
		ms_stereo = (fr->mode_ext & 0x2)>>1;
Packit c32a2d
		i_stereo  = fr->mode_ext & 0x1;
Packit c32a2d
	}
Packit c32a2d
	else ms_stereo = i_stereo = 0;
Packit c32a2d
Packit c32a2d
	granules = fr->lsf ? 1 : 2;
Packit c32a2d
Packit c32a2d
	/* quick hack to keep the music playing */
Packit c32a2d
	/* after having seen this nasty test file... */
Packit c32a2d
	if(III_get_side_info(fr, &sideinfo,stereo,ms_stereo,sfreq,single))
Packit c32a2d
	{
Packit c32a2d
		if(NOQUIET) error("bad frame - unable to get valid sideinfo");
Packit c32a2d
		return clip;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	set_pointer(fr,sideinfo.main_data_begin);
Packit c32a2d
Packit c32a2d
	for(gr=0;gr
Packit c32a2d
	{
Packit c32a2d
		/*  hybridIn[2][SBLIMIT][SSLIMIT] */
Packit c32a2d
		real (*hybridIn)[SBLIMIT][SSLIMIT] = fr->layer3.hybrid_in;
Packit c32a2d
		/*  hybridOut[2][SSLIMIT][SBLIMIT] */
Packit c32a2d
		real (*hybridOut)[SSLIMIT][SBLIMIT] = fr->layer3.hybrid_out;
Packit c32a2d
Packit c32a2d
		{
Packit c32a2d
			struct gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]);
Packit c32a2d
			long part2bits;
Packit c32a2d
			if(fr->lsf)
Packit c32a2d
			part2bits = III_get_scale_factors_2(fr, scalefacs[0],gr_info,0);
Packit c32a2d
			else
Packit c32a2d
			part2bits = III_get_scale_factors_1(fr, scalefacs[0],gr_info,0,gr);
Packit c32a2d
Packit c32a2d
			if(III_dequantize_sample(fr, hybridIn[0], scalefacs[0],gr_info,sfreq,part2bits))
Packit c32a2d
			{
Packit c32a2d
				if(VERBOSE2) error("dequantization failed!");
Packit c32a2d
				return clip;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		if(stereo == 2)
Packit c32a2d
		{
Packit c32a2d
			struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]);
Packit c32a2d
			long part2bits;
Packit c32a2d
			if(fr->lsf) 
Packit c32a2d
			part2bits = III_get_scale_factors_2(fr, scalefacs[1],gr_info,i_stereo);
Packit c32a2d
			else
Packit c32a2d
			part2bits = III_get_scale_factors_1(fr, scalefacs[1],gr_info,1,gr);
Packit c32a2d
Packit c32a2d
			if(III_dequantize_sample(fr, hybridIn[1],scalefacs[1],gr_info,sfreq,part2bits))
Packit c32a2d
			{
Packit c32a2d
				if(VERBOSE2) error("dequantization failed!");
Packit c32a2d
				return clip;
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			if(ms_stereo)
Packit c32a2d
			{
Packit c32a2d
				int i;
Packit c32a2d
				unsigned int maxb = sideinfo.ch[0].gr[gr].maxb;
Packit c32a2d
				if(sideinfo.ch[1].gr[gr].maxb > maxb) maxb = sideinfo.ch[1].gr[gr].maxb;
Packit c32a2d
Packit c32a2d
				for(i=0;i
Packit c32a2d
				{
Packit c32a2d
					real tmp0 = ((real *)hybridIn[0])[i];
Packit c32a2d
					real tmp1 = ((real *)hybridIn[1])[i];
Packit c32a2d
					((real *)hybridIn[0])[i] = tmp0 + tmp1;
Packit c32a2d
					((real *)hybridIn[1])[i] = tmp0 - tmp1;
Packit c32a2d
				}
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			if(i_stereo) III_i_stereo(hybridIn,scalefacs[1],gr_info,sfreq,ms_stereo,fr->lsf);
Packit c32a2d
Packit c32a2d
			if(ms_stereo || i_stereo || (single == SINGLE_MIX) )
Packit c32a2d
			{
Packit c32a2d
				if(gr_info->maxb > sideinfo.ch[0].gr[gr].maxb) 
Packit c32a2d
				sideinfo.ch[0].gr[gr].maxb = gr_info->maxb;
Packit c32a2d
				else
Packit c32a2d
				gr_info->maxb = sideinfo.ch[0].gr[gr].maxb;
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			switch(single)
Packit c32a2d
			{
Packit c32a2d
				case SINGLE_MIX:
Packit c32a2d
				{
Packit c32a2d
					register int i;
Packit c32a2d
					register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
Packit c32a2d
					for(i=0;i<SSLIMIT*(int)gr_info->maxb;i++,in0++)
Packit c32a2d
					*in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */ 
Packit c32a2d
				}
Packit c32a2d
				break;
Packit c32a2d
				case SINGLE_RIGHT:
Packit c32a2d
				{
Packit c32a2d
					register int i;
Packit c32a2d
					register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
Packit c32a2d
					for(i=0;i<SSLIMIT*(int)gr_info->maxb;i++)
Packit c32a2d
					*in0++ = *in1++;
Packit c32a2d
				}
Packit c32a2d
				break;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		for(ch=0;ch
Packit c32a2d
		{
Packit c32a2d
			struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
Packit c32a2d
			III_antialias(hybridIn[ch],gr_info);
Packit c32a2d
			III_hybrid(hybridIn[ch], hybridOut[ch], ch,gr_info, fr);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
#ifdef OPT_I486
Packit c32a2d
		if(single != SINGLE_STEREO || fr->af.encoding != MPG123_ENC_SIGNED_16 || fr->down_sample != 0)
Packit c32a2d
		{
Packit c32a2d
#endif
Packit c32a2d
		for(ss=0;ss
Packit c32a2d
		{
Packit c32a2d
			if(single != SINGLE_STEREO)
Packit c32a2d
			clip += (fr->synth_mono)(hybridOut[0][ss], fr);
Packit c32a2d
			else
Packit c32a2d
			clip += (fr->synth_stereo)(hybridOut[0][ss], hybridOut[1][ss], fr);
Packit c32a2d
Packit c32a2d
		}
Packit c32a2d
#ifdef OPT_I486
Packit c32a2d
		} else
Packit c32a2d
		{
Packit c32a2d
			/* Only stereo, 16 bits benefit from the 486 optimization. */
Packit c32a2d
			ss=0;
Packit c32a2d
			while(ss < SSLIMIT)
Packit c32a2d
			{
Packit c32a2d
				int n;
Packit c32a2d
				n=(fr->buffer.size - fr->buffer.fill) / (2*2*32);
Packit c32a2d
				if(n > (SSLIMIT-ss)) n=SSLIMIT-ss;
Packit c32a2d
Packit c32a2d
				/* Clip counting makes no sense with this function. */
Packit c32a2d
				absynth_1to1_i486(hybridOut[0][ss], 0, fr, n);
Packit c32a2d
				absynth_1to1_i486(hybridOut[1][ss], 1, fr, n);
Packit c32a2d
				ss+=n;
Packit c32a2d
				fr->buffer.fill+=(2*2*32)*n;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
#endif
Packit c32a2d
	}
Packit c32a2d
  
Packit c32a2d
	return clip;
Packit c32a2d
}