📄 mpeglayer3.cpp
字号:
cb_width=sfBandIndex->s[cb+1]-cb_begin; cb_begin=MUL3(cb_begin); } } { int t_index=(index-cb_begin)/cb_width; out[0][index]*=layer3twopow2_1(gi->subblock_gain[t_index], gi->scalefac_scale, scalefactors[ch].s[t_index][cb]); } } }}void MPEGaudio::layer3fixtostereo(int gr,REAL in[2][SBLIMIT][SSLIMIT]){ layer3grinfo *gi=&(sideinfo.ch[0].gr[gr]); SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]); int ms_stereo=(mode==joint) && (extendedmode & 0x2); int i_stereo =(mode==joint) && (extendedmode & 0x1); if(!inputstereo) { /* mono , bypass xr[0][][] to lr[0][][]*/ // memcpy(out[0][0],in[0][0],ARRAYSIZE*REALSIZE); return; } if(i_stereo) { int i; int is_pos[ARRAYSIZE]; RATIOS is_ratio[ARRAYSIZE]; RATIOS *ratios; if(version)ratios=rat_2[gi->scalefac_compress%2]; else ratios=rat_1; /* initialization */ for(i=0;i<ARRAYSIZE;i+=2)is_pos[i]=is_pos[i+1]=7; if(gi->generalflag) { if(gi->mixed_block_flag) // Part I { int max_sfb=0; for(int j=0;j<3;j++) { int sfb,sfbcnt=2; for(sfb=12;sfb>=3;sfb--) { int lines; i=sfBandIndex->s[sfb]; lines=sfBandIndex->s[sfb+1]-i; i=MUL3(i)+(j+1)*lines-1; for(;lines>0;lines--,i--) if(in[1][0][i]!=0.0f) { sfbcnt=sfb; sfb=0;break; // quit loop } } sfb=sfbcnt+1; if(sfb>max_sfb)max_sfb=sfb; for(;sfb<12;sfb++) { int k,t; t=sfBandIndex->s[sfb]; k=sfBandIndex->s[sfb+1]-t; i=MUL3(t)+j*k; t=scalefactors[1].s[j][sfb]; if(t!=7) { RATIOS r=ratios[t]; for(;k>0;k--,i++){ is_pos[i]=t;is_ratio[i]=r;} } else for(;k>0;k--,i++)is_pos[i]=t; } sfb=sfBandIndex->s[10]; sfb=MUL3(sfb)+j*(sfBandIndex->s[11]-sfb); { int k,t; t=sfBandIndex->s[11]; k=sfBandIndex->s[12]-t; i=MUL3(t)+j*k; t=is_pos[sfb]; if(t!=7) { RATIOS r=is_ratio[sfb]; for(;k>0;k--,i++){ is_pos[i]=t;is_ratio[i]=r;} } else for(;k>0;k--,i++)is_pos[i]=t; } } if(max_sfb<=3) { { REAL temp; int k; temp=in[1][0][0];in[1][0][0]=1.0; for(k=3*SSLIMIT-1;in[1][0][k]==0.0;k--); in[1][0][0]=temp; for(i=0;sfBandIndex->l[i]<=k;i++); } { int sfb=i; i=sfBandIndex->l[i]; for(;sfb<8;sfb++) { int t=scalefactors[1].l[sfb]; int k=sfBandIndex->l[sfb+1]-sfBandIndex->l[sfb]; if(t!=7) { RATIOS r=ratios[t]; for(;k>0;k--,i++){ is_pos[i]=t;is_ratio[i]=r;} } else for(;k>0;k--,i++)is_pos[i]=t; } } } } else // Part II { for(int j=0;j<3;j++) { int sfb; int sfbcnt=-1; for(sfb=12;sfb>=0;sfb--) { int lines; { int t; t=sfBandIndex->s[sfb]; lines=sfBandIndex->s[sfb+1]-t; i=MUL3(t)+(j+1)*lines-1; } for(;lines>0;lines--,i--) if(in[1][0][i]!=0.0f) { sfbcnt=sfb; sfb=0;break; // quit loop } } for(sfb=sfbcnt+1;sfb<12;sfb++) { int k,t; t=sfBandIndex->s[sfb]; k=sfBandIndex->s[sfb+1]-t; i=MUL3(t)+j*k; t=scalefactors[1].s[j][sfb]; if(t!=7) { RATIOS r=ratios[t]; for(;k>0;k--,i++){ is_pos[i]=t;is_ratio[i]=r;} } else for(;k>0;k--,i++)is_pos[i]=t; } { int t1=sfBandIndex->s[10], t2=sfBandIndex->s[11]; int k,tt; tt=MUL3(t1)+j*(t2-t1); k =sfBandIndex->s[12]-t2; if(is_pos[tt]!=7) { RATIOS r=is_ratio[tt]; int t=is_pos[tt]; i =MUL3(t1)+j*k; for(;k>0;k--,i++){ is_pos[i]=t;is_ratio[i]=r;} } else for(;k>0;k--,i++)is_pos[i]=7; } } } } else // ms-stereo (Part III) { { REAL temp; int k; temp=in[1][0][0];in[1][0][0]=1.0; for(k=ARRAYSIZE-1;in[1][0][k]==0.0;k--); in[1][0][0]=temp; for(i=0;sfBandIndex->l[i]<=k;i++); } { int sfb; sfb=i; i=sfBandIndex->l[i]; for(;sfb<21;sfb++) { int k,t; k=sfBandIndex->l[sfb+1]-sfBandIndex->l[sfb]; t=scalefactors[1].l[sfb]; if(t!=7) { RATIOS r=ratios[t]; for(;k>0;k--,i++){ is_pos[i]=t;is_ratio[i]=r;} } else for(;k>0;k--,i++)is_pos[i]=t; } } if (i <= sfBandIndex->l[21]) { int k,t,tt; tt=sfBandIndex->l[20]; k=576-sfBandIndex->l[21]; t=is_pos[tt]; if(t!=7) { RATIOS r=is_ratio[tt]; for(;k>0;k--,i++){ is_pos[i]=t;is_ratio[i]=r;} } else for(;k>0;k--,i++)is_pos[i]=t; } } if(ms_stereo) { i=ARRAYSIZE-1; do{ if(is_pos[i]==7) { register REAL t=in[LS][0][i]; in[LS][0][i]=(t+in[RS][0][i])*0.7071068f; in[RS][0][i]=(t-in[RS][0][i])*0.7071068f; } else { in[RS][0][i]=in[LS][0][i]*is_ratio[i].r; in[LS][0][i]*=is_ratio[i].l; } }while(i--); } else { i=ARRAYSIZE-1; do{ if(is_pos[i]!=7) { in[RS][0][i]=in[LS][0][i]*is_ratio[i].r; in[LS][0][i]*=is_ratio[i].l; } }while(i--); } } else { if(ms_stereo) { int i=ARRAYSIZE-1; do{ register REAL t=in[LS][0][i]; in[LS][0][i]=(t+in[RS][0][i])*0.7071068f; in[RS][0][i]=(t-in[RS][0][i])*0.7071068f; }while(i--); } } // channels==2}inline void layer3reorder_1(int version,int frequency, REAL in[SBLIMIT][SSLIMIT], REAL out[SBLIMIT][SSLIMIT]){ SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]); int sfb,sfb_start,sfb_lines; /* NO REORDER FOR LOW 2 SUBBANDS */ out[0][ 0]=in[0][ 0];out[0][ 1]=in[0][ 1];out[0][ 2]=in[0][ 2]; out[0][ 3]=in[0][ 3];out[0][ 4]=in[0][ 4];out[0][ 5]=in[0][ 5]; out[0][ 6]=in[0][ 6];out[0][ 7]=in[0][ 7];out[0][ 8]=in[0][ 8]; out[0][ 9]=in[0][ 9];out[0][10]=in[0][10];out[0][11]=in[0][11]; out[0][12]=in[0][12];out[0][13]=in[0][13];out[0][14]=in[0][14]; out[0][15]=in[0][15];out[0][16]=in[0][16];out[0][17]=in[0][17]; out[1][ 0]=in[1][ 0];out[1][ 1]=in[1][ 1];out[1][ 2]=in[1][ 2]; out[1][ 3]=in[1][ 3];out[1][ 4]=in[1][ 4];out[1][ 5]=in[1][ 5]; out[1][ 6]=in[1][ 6];out[1][ 7]=in[1][ 7];out[1][ 8]=in[1][ 8]; out[1][ 9]=in[1][ 9];out[1][10]=in[1][10];out[1][11]=in[1][11]; out[1][12]=in[1][12];out[1][13]=in[1][13];out[1][14]=in[1][14]; out[1][15]=in[1][15];out[1][16]=in[1][16];out[1][17]=in[1][17]; /* REORDERING FOR REST SWITCHED SHORT */ for(sfb=3,sfb_start=sfBandIndex->s[3], sfb_lines=sfBandIndex->s[4]-sfb_start; sfb<13; sfb++,sfb_start=sfBandIndex->s[sfb], (sfb_lines=sfBandIndex->s[sfb+1]-sfb_start)) { for(int freq=0;freq<sfb_lines;freq++) { int src_line=sfb_start+(sfb_start<<1)+freq; int des_line=src_line+(freq<<1); out[0][des_line ]=in[0][src_line ]; out[0][des_line+1]=in[0][src_line+sfb_lines ]; out[0][des_line+2]=in[0][src_line+(sfb_lines<<1)]; } }}inline void layer3reorder_2(int version,int frequency,REAL in[SBLIMIT][SSLIMIT], REAL out[SBLIMIT][SSLIMIT]){ SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]); int sfb,sfb_start,sfb_lines; for(sfb=0,sfb_start=0,sfb_lines=sfBandIndex->s[1]; sfb<13; sfb++,sfb_start=sfBandIndex->s[sfb], (sfb_lines=sfBandIndex->s[sfb+1]-sfb_start)) { for(int freq=0;freq<sfb_lines;freq++) { int src_line=sfb_start+(sfb_start<<1)+freq; int des_line=src_line+(freq<<1); out[0][des_line ]=in[0][src_line ]; out[0][des_line+1]=in[0][src_line+sfb_lines ]; out[0][des_line+2]=in[0][src_line+(sfb_lines<<1)]; } }}inline void layer3antialias_1(REAL in[SBLIMIT][SSLIMIT]){ for(int ss=0;ss<8;ss++) { REAL bu,bd; /* upper and lower butterfly inputs */ bu=in[0][17-ss];bd=in[1][ss]; in[0][17-ss]=(bu*cs[ss])-(bd*ca[ss]); in[1][ss] =(bd*cs[ss])+(bu*ca[ss]); }}inlinevoid layer3antialias_2(REAL in[SBLIMIT][SSLIMIT], REAL out[SBLIMIT][SSLIMIT]){ out[0][0]=in[0][0];out[0][1]=in[0][1]; out[0][2]=in[0][2];out[0][3]=in[0][3]; out[0][4]=in[0][4];out[0][5]=in[0][5]; out[0][6]=in[0][6];out[0][7]=in[0][7]; for(int index=SSLIMIT;index<=(SBLIMIT-1)*SSLIMIT;index+=SSLIMIT) { for(int n=0;n<8;n++) { REAL bu,bd; bu=in[0][index-n-1];bd=in[0][index+n]; out[0][index-n-1]=(bu*cs[n])-(bd*ca[n]); out[0][index+n ]=(bd*cs[n])+(bu*ca[n]); } out[0][index-SSLIMIT+8]=in[0][index-SSLIMIT+8]; out[0][index-SSLIMIT+9]=in[0][index-SSLIMIT+9]; } out[31][ 8]=in[31][ 8];out[31][ 9]=in[31][ 9]; out[31][10]=in[31][10];out[31][11]=in[31][11]; out[31][12]=in[31][12];out[31][13]=in[31][13]; out[31][14]=in[31][14];out[31][15]=in[31][15]; out[31][16]=in[31][16];out[31][17]=in[31][17];}void MPEGaudio::layer3reorderandantialias(int ch,int gr, REAL in[SBLIMIT][SSLIMIT], REAL out[SBLIMIT][SSLIMIT]){ register layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]); if(gi->generalflag) { if(gi->mixed_block_flag) { fprintf(stderr,"Notchecked!"); layer3reorder_1 (version,frequency,in,out); // Not checked... layer3antialias_1(out); } else layer3reorder_2(version,frequency,in,out); } else layer3antialias_2(in,out);}static void dct36(REAL *inbuf,REAL *prevblk1,REAL *prevblk2,REAL *wi,REAL *out){#define MACRO0(v) { \ REAL tmp; \ out2[9+(v)]=(tmp=sum0+sum1)*wi[27+(v)]; \ out2[8-(v)]=tmp * wi[26-(v)]; } \ sum0-=sum1; \ ts[SBLIMIT*(8-(v))]=out1[8-(v)]+sum0*wi[8-(v)]; \ ts[SBLIMIT*(9+(v))]=out1[9+(v)]+sum0*wi[9+(v)]; #define MACRO1(v) { \ REAL sum0,sum1; \ sum0=tmp1a+tmp2a; \ sum1=(tmp1b+tmp2b)*hsec_36[(v)]; \ MACRO0(v); }#define MACRO2(v) { \ REAL sum0,sum1; \ sum0=tmp2a-tmp1a; \ sum1=(tmp2b-tmp1b) * hsec_36[(v)]; \ MACRO0(v); } { register 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]; { register REAL *c = cos_18; register REAL *out2 = prevblk2; register REAL *out1 = prevblk1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -