📄 layer3.c
字号:
int i,max = -1; int cb = 0; int *m = map[sfreq][2]; real v = 0.0; int mc = 0; /* * long hash table values */ for(i=0;i<3;i++) { int lp = l[i]; struct newhuff *h = (struct newhuff *)(ht+gr_infos->table_select[i]); for(;lp;lp--,mc--) { int x,y; if(!mc) { mc = *m++; v = gr_infos->pow2gain[((*scf++) + (*pretab++)) << shift]; cb = *m++; } { short *val = (short *)h->table; while((y=*val++)<0) { if (get1bit(mp)) val -= y; part2remain--; } x = y >> 4; y &= 0xf; } if (x == 15) { max = cb; part2remain -= h->linbits+1; x += getbits(mp,(int)h->linbits); if(get1bit(mp)) *xrpnt++ = -ispow[x] * v; else *xrpnt++ = ispow[x] * v; } else if(x) { max = cb; if(get1bit(mp)) *xrpnt++ = -ispow[x] * v; else *xrpnt++ = ispow[x] * v; part2remain--; } else *xrpnt++ = 0.0; if (y == 15) { max = cb; part2remain -= h->linbits+1; y += getbits(mp,(int)h->linbits); if(get1bit(mp)) *xrpnt++ = -ispow[y] * v; else *xrpnt++ = ispow[y] * v; } else if(y) { max = cb; if(get1bit(mp)) *xrpnt++ = -ispow[y] * v; else *xrpnt++ = ispow[y] * v; part2remain--; } else *xrpnt++ = 0.0; } } /* * short (count1table) values */ for(;l3 && (part2remain > 0);l3--) { struct newhuff *h = (struct newhuff *)(htc+gr_infos->count1table_select); short *val = (short *)h->table,a; while((a=*val++)<0) { part2remain--; if(part2remain < 0) { part2remain++; a = 0; break; } if (get1bit(mp)) val -= a; } for(i=0;i<4;i++) { if(!(i & 1)) { if(!mc) { mc = *m++; cb = *m++; v = gr_infos->pow2gain[((*scf++) + (*pretab++)) << shift]; } mc--; } if ( (a & (0x8>>i)) ) { max = cb; part2remain--; if(part2remain < 0) { part2remain++; break; } if(get1bit(mp)) *xrpnt++ = -v; else *xrpnt++ = v; } else *xrpnt++ = 0.0; } } /* * zero part */ for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) { *xrpnt++ = 0.0; *xrpnt++ = 0.0; } gr_infos->maxbandl = max+1; gr_infos->maxb = longLimit[sfreq][gr_infos->maxbandl]; } while( part2remain > 16 ) { getbits(mp,16); /* Dismiss stuffing Bits */ part2remain -= 16; } if(part2remain > 0) getbits(mp,part2remain); else if(part2remain < 0) { fprintf(stderr,"mpg123: Can't rewind stream by %d bits!\n",-part2remain); return 1; /* -> error */ } return 0;}/* * III_stereo: calculate real channel values for Joint-I-Stereo-mode */static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac, struct gr_info_s *gr_infos,int sfreq,int ms_stereo,int lsf){ real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf; struct bandInfoStruct *bi = (struct bandInfoStruct *)&bandInfo[sfreq]; real *tabl1,*tabl2; if(lsf) { int p = gr_infos->scalefac_compress & 0x1; if(ms_stereo) { tabl1 = pow1_2[p]; tabl2 = pow2_2[p]; } else { tabl1 = pow1_1[p]; tabl2 = pow2_1[p]; } } else { if(ms_stereo) { tabl1 = tan1_2; tabl2 = tan2_2; } else { tabl1 = tan1_1; tabl2 = tan2_1; } } if (gr_infos->block_type == 2) { int lwin,do_l = 0; if( gr_infos->mixed_block_flag ) do_l = 1; for (lwin=0;lwin<3;lwin++) /* process each window */ { /* get first band with zero values */ int is_p,sb,idx,sfb = gr_infos->maxband[lwin]; /* sfb is minimal 3 for mixed mode */ if(sfb > 3) do_l = 0; for(;sfb<12;sfb++) { is_p = scalefac[sfb*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */ if(is_p != 7) { real t1,t2; sb = bi->shortDiff[sfb]; idx = bi->shortIdx[sfb] + lwin; t1 = tabl1[is_p]; t2 = tabl2[is_p]; for (; sb > 0; sb--,idx+=3) { real v = xr[0][idx]; xr[0][idx] = v * t1; xr[1][idx] = v * t2; } } }#if 1/* in the original: copy 10 to 11 , here: copy 11 to 12 maybe still wrong??? (copy 12 to 13?) */ is_p = scalefac[11*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */ sb = bi->shortDiff[12]; idx = bi->shortIdx[12] + lwin;#else is_p = scalefac[10*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */ sb = bi->shortDiff[11]; idx = bi->shortIdx[11] + lwin;#endif if(is_p != 7) { real t1,t2; t1 = tabl1[is_p]; t2 = tabl2[is_p]; for ( ; sb > 0; sb--,idx+=3 ) { real v = xr[0][idx]; xr[0][idx] = v * t1; xr[1][idx] = v * t2; } } } /* end for(lwin; .. ; . ) */ if (do_l) {/* also check l-part, if ALL bands in the three windows are 'empty' * and mode = mixed_mode */ int sfb = gr_infos->maxbandl; int idx = bi->longIdx[sfb]; for ( ; sfb<8; sfb++ ) { int sb = bi->longDiff[sfb]; int is_p = scalefac[sfb]; /* scale: 0-15 */ if(is_p != 7) { real t1,t2; t1 = tabl1[is_p]; t2 = tabl2[is_p]; for ( ; sb > 0; sb--,idx++) { real v = xr[0][idx]; xr[0][idx] = v * t1; xr[1][idx] = v * t2; } } else idx += sb; } } } else /* ((gr_infos->block_type != 2)) */ { int sfb = gr_infos->maxbandl; int is_p,idx = bi->longIdx[sfb]; for ( ; sfb<21; sfb++) { int sb = bi->longDiff[sfb]; is_p = scalefac[sfb]; /* scale: 0-15 */ if(is_p != 7) { real t1,t2; t1 = tabl1[is_p]; t2 = tabl2[is_p]; for ( ; sb > 0; sb--,idx++) { real v = xr[0][idx]; xr[0][idx] = v * t1; xr[1][idx] = v * t2; } } else idx += sb; } is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */ if(is_p != 7) { int sb; real t1 = tabl1[is_p],t2 = tabl2[is_p]; for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ ) { real v = xr[0][idx]; xr[0][idx] = v * t1; xr[1][idx] = v * t2; } } } /* ... */}static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_infos){ int sblim; if(gr_infos->block_type == 2) { if(!gr_infos->mixed_block_flag) return; sblim = 1; } else { sblim = gr_infos->maxb-1; } /* 31 alias-reduction operations between each pair of sub-bands */ /* with 8 butterflies between each pair */ { int sb; real *xr1=(real *) xr[1]; for(sb=sblim;sb;sb--,xr1+=10) { int ss; real *cs=aa_cs,*ca=aa_ca; real *xr2 = xr1; for(ss=7;ss>=0;ss--) { /* upper and lower butterfly inputs */ real bu = *--xr2,bd = *xr1; *xr2 = (bu * (*cs) ) - (bd * (*ca) ); *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) ); } } }}/* DCT insipired by Jeff Tsay's DCT from the maplay package this is an optimized version with manual unroll. References: [1] S. Winograd: "On Computing the Discrete Fourier Transform", Mathematics of Computation, Volume 32, Number 141, January 1978, Pages 175-199*/static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf){ { real *in = inbuf; in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11]; in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8]; in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5]; in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; in[2] +=in[1]; in[1] +=in[0]; in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9]; in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1]; {#define MACRO0(v) { \ real tmp; \ out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \ out2[8-(v)] = tmp * w[26-(v)]; } \ sum0 -= sum1; \ ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \ ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; #define MACRO1(v) { \ real sum0,sum1; \ sum0 = tmp1a + tmp2a; \ sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \ MACRO0(v); }#define MACRO2(v) { \ real sum0,sum1; \ sum0 = tmp2a - tmp1a; \ sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \ MACRO0(v); } const real *c = COS9; real *out2 = o2; real *w = wintab; real *out1 = o1; real *ts = tsbuf; real ta33,ta66,tb33,tb66; ta33 = in[2*3+0] * c[3]; ta66 = in[2*6+0] * c[6]; tb33 = in[2*3+1] * c[3]; tb66 = in[2*6+1] * c[6]; { real tmp1a,tmp2a,tmp1b,tmp2b; tmp1a = in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7]; tmp1b = in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7]; tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8]; tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8]; MACRO1(0); MACRO2(8); } { real tmp1a,tmp2a,tmp1b,tmp2b; tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3]; tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3]; tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0]; tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1]; MACRO1(1); MACRO2(7); } { real tmp1a,tmp2a,tmp1b,tmp2b; tmp1a = in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1]; tmp1b = in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1]; tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4]; tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4]; MACRO1(2); MACRO2(6); } { real tmp1a,tmp2a,tmp1b,tmp2b; tmp1a = in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5]; tmp1b = in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5]; tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2]; tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2]; MACRO1(3); MACRO2(5); } { real sum0,sum1; sum0 = in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0]; sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4]; MACRO0(4); } } }}/* * new DCT12 */static void dct12(real *in,real *rawout1,real *rawout2,real *wi,real *ts){#define DCT12_PART1 \ in5 = in[5*3]; \ in5 += (in4 = in[4*3]); \ in4 += (in3 = in[3*3]); \ in3 += (in2 = in[2*3]); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -