www.pudn.com > MyPlayerbylqh.rar > Layer2.cpp


 
 
#include "mpg123.h" 
#include "l2tables.h" 
 
static int grp_3tab[32 * 3] = { 0, };    
static int grp_5tab[128 * 3] = { 0, };   
static int grp_9tab[1024 * 3] = { 0, };  
 
real muls[27][64];	 
 
 
/** 
 * 
 **/ 
 
void init_layer2(void) 
{ 
	static double mulmul[27] = { 
		0.0 , -2.0/3.0 , 2.0/3.0 , 
		2.0/7.0 , 2.0/15.0 , 2.0/31.0, 2.0/63.0 , 2.0/127.0 , 2.0/255.0 , 
		2.0/511.0 , 2.0/1023.0 , 2.0/2047.0 , 2.0/4095.0 , 2.0/8191.0 , 
		2.0/16383.0 , 2.0/32767.0 , 2.0/65535.0 , 
		-4.0/5.0 , -2.0/5.0 , 2.0/5.0, 4.0/5.0 , 
		-8.0/9.0 , -4.0/9.0 , -2.0/9.0 , 2.0/9.0 , 4.0/9.0 , 8.0/9.0 }; 
	static int base[3][9] = { 
		{ 1 , 0, 2 , } , 
		{ 17, 18, 0 , 19, 20 , } , 
		{ 21, 1, 22, 23, 0, 24, 25, 2, 26 } }; 
	int i,j,k,l,len; 
	real *table; 
	static int tablen[3] = { 3 , 5 , 9 }; 
	static int *itable,*tables[3] = { grp_3tab , grp_5tab , grp_9tab }; 
 
	for(i=0;i<3;i++) { 
		itable = tables[i]; 
		len = tablen[i]; 
 
		for(j=0;jstereo-1; 
	int sblimit = fr->II_sblimit; 
	int jsbound = fr->jsbound; 
	int sblimit2 = fr->II_sblimit<alloc; 
	int i; 
	static unsigned int scfsi_buf[64]; 
	unsigned int *scfsi,*bita; 
	int sc,step; 
 
	bita = bit_alloc; 
 
	if (stereo) { 
		for (i=jsbound;i;i--,alloc1+=(1<bits); 
			*bita++ = (char) getbits(step); 
		} 
 
		for (i=sblimit-jsbound;i;i--,alloc1+=(1<bits); 
			bita[1] = bita[0]; 
			bita+=2; 
		} 
 
		bita = bit_alloc; 
		scfsi=scfsi_buf; 
		for (i=sblimit2;i;i--) 
			if (*bita++) 
				*scfsi++ = (char) getbits_fast(2); 
		} else { /* mono */ 
			for (i=sblimit;i;i--,alloc1+=(1<bits); 
			bita = bit_alloc; 
			scfsi=scfsi_buf; 
			for (i=sblimit;i;i--) 
				if (*bita++) 
					*scfsi++ = (char) getbits_fast(2); 
		} 
 
		bita = bit_alloc; 
		scfsi=scfsi_buf; 
		for (i=sblimit2;i;i--) { 
			if (*bita++) { 
				switch (*scfsi++) { 
				case 0:  
					*scale++ = getbits_fast(6); 
					*scale++ = getbits_fast(6); 
					*scale++ = getbits_fast(6); 
					break; 
				case 1 :  
					*scale++ = sc = getbits_fast(6); 
					*scale++ = sc; 
					*scale++ = getbits_fast(6); 
					break; 
				case 2:  
					*scale++ = sc = getbits_fast(6); 
					*scale++ = sc; 
					*scale++ = sc; 
					break; 
				case 3: 
          			default: 
					*scale++ = getbits_fast(6); 
					*scale++ = sc = getbits_fast(6); 
					*scale++ = sc; 
					break; 
			} 
		} 
        } 
} 
 
 
/** 
 * 
 **/ 
 
static void II_step_two (unsigned int *bit_alloc,real fraction[2][4][SBLIMIT],int *scale,struct frame *fr,int x1) 
{ 
	int i,j,k,ba; 
	int stereo = fr->stereo; 
	int sblimit = fr->II_sblimit; 
	int jsbound = fr->jsbound; 
	struct al_table *alloc2,*alloc1 = (struct al_table *) fr->alloc; 
	unsigned int *bita=bit_alloc; 
	int d1,step; 
 
	for (i=0;ibits; 
		for (j=0;jbits; 
				if( (d1=alloc2->d) < 0) { 
					real cm=muls[k][scale[x1]]; 
					fraction[j][0][i] = ((real) ((int)getbits(k) + d1)) * cm; 
					fraction[j][1][i] = ((real) ((int)getbits(k) + d1)) * cm; 
					fraction[j][2][i] = ((real) ((int)getbits(k) + d1)) * cm; 
				} else { 
					static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab }; 
					unsigned int idx,*tab,m=scale[x1]; 
					idx = (unsigned int) getbits(k); 
					tab = (unsigned int *) (table[d1] + idx + idx + idx); 
					fraction[j][0][i] = muls[*tab++][m]; 
					fraction[j][1][i] = muls[*tab++][m]; 
					fraction[j][2][i] = muls[*tab][m];   
				} 
				scale+=3; 
			} else 
				fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0; 
		} 
	} 
 
	for (i=jsbound;ibits; 
		bita++;	 
 
		if ((ba=*bita++)) { 
			k=(alloc2 = alloc1+ba)->bits; 
			if( (d1=alloc2->d) < 0) { 
				real cm; 
				cm=muls[k][scale[x1+3]]; 
				fraction[1][0][i] = (fraction[0][0][i] = (real) ((int)getbits(k) + d1) ) * cm; 
				fraction[1][1][i] = (fraction[0][1][i] = (real) ((int)getbits(k) + d1) ) * cm; 
				fraction[1][2][i] = (fraction[0][2][i] = (real) ((int)getbits(k) + d1) ) * cm; 
				cm=muls[k][scale[x1]]; 
				fraction[0][0][i] *= cm; fraction[0][1][i] *= cm; fraction[0][2][i] *= cm; 
			} else { 
				static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab }; 
				unsigned int idx,*tab,m1,m2; 
				m1 = scale[x1]; m2 = scale[x1+3]; 
				idx = (unsigned int) getbits(k); 
				tab = (unsigned int *) (table[d1] + idx + idx + idx); 
				fraction[0][0][i] = muls[*tab][m1]; fraction[1][0][i] = muls[*tab++][m2]; 
				fraction[0][1][i] = muls[*tab][m1]; fraction[1][1][i] = muls[*tab++][m2]; 
				fraction[0][2][i] = muls[*tab][m1]; fraction[1][2][i] = muls[*tab][m2]; 
			} 
			scale+=6; 
		} else 
			fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] = fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0.0; 
 
	} 
 
	for(i=sblimit;ilsf) 
		table = 4; 
	else 
		table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index]; 
	sblim = sblims[table]; 
 
	fr->alloc      = tables[table]; 
	fr->II_sblimit = sblim; 
} 
 
 
/** 
 * 
 **/ 
 
int do_layer2 (struct frame *fr,unsigned char *pcm_sample,int *pcm_point) 
{ 
	int clip=0; 
	int i,j; 
	int stereo = fr->stereo; 
	real fraction[2][4][SBLIMIT];  
	unsigned int bit_alloc[64]; 
	int scale[192]; 
	int single = fr->single; 
 
	II_select_table(fr); 
	fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? 
     		(fr->mode_ext<<2)+4 : fr->II_sblimit; 
 
	if(stereo == 1 || single == 3) 
    		single = 0; 
 
	II_step_one(bit_alloc, scale, fr); 
 
	if(single >= 0) { 
		for (i=0;i>2); 
		 
			for (j=0;j<3;j++) 
				clip += synth_1to1_mono(fraction[0][j],pcm_sample,pcm_point); 
		} 
	} else { 
		for (i=0;i>2); 
 
			for (j=0;j<3;j++) { 
				int p1 = *pcm_point; 
				clip += synth_1to1(fraction[0][j],0,pcm_sample,&p1); 
				clip += synth_1to1(fraction[1][j],1,pcm_sample,pcm_point); 
			} 
		} 
	} 
 
	return clip; 
}