📄 mpeglayer3.cpp
字号:
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])*hsec_36[4];
MACRO0(4);
}
}
}
}
static void dct12(REAL *in,REAL *prevblk1,REAL *prevblk2,register REAL *wi,register REAL *out)
{
#define DCT12_PART1 \
in5=in[5*3]; \
in5+=(in4=in[4*3]); \
in4+=(in3=in[3*3]); \
in3+=(in2=in[2*3]); \
in2+=(in1=in[1*3]); \
in1+=(in0=in[0*3]); \
\
in5+=in3;in3+=in1; \
\
in2*=cos1_6; \
in3*=cos1_6;
#define DCT12_PART2 \
in0+=in4*cos2_6; \
\
in4=in0+in2; \
in0-=in2; \
\
in1+=in5*cos2_6; \
\
in5=(in1+in3)*hsec_12[0]; \
in1=(in1-in3)*hsec_12[2]; \
\
in3=in4+in5; \
in4-=in5; \
\
in2=in0+in1; \
in0-=in1;
{
REAL in0,in1,in2,in3,in4,in5;
register REAL *pb1=prevblk1;
out[SBLIMIT*0]=pb1[0];out[SBLIMIT*1]=pb1[1];out[SBLIMIT*2]=pb1[2];
out[SBLIMIT*3]=pb1[3];out[SBLIMIT*4]=pb1[4];out[SBLIMIT*5]=pb1[5];
DCT12_PART1;
{
REAL tmp0,tmp1=(in0-in4);
{
register REAL tmp2=(in1-in5)*hsec_12[1];
tmp0=tmp1+tmp2;
tmp1-=tmp2;
}
out[(17-1)*SBLIMIT]=pb1[17-1]+tmp0*wi[11-1];
out[(12+1)*SBLIMIT]=pb1[12+1]+tmp0*wi[ 6+1];
out[(6 +1)*SBLIMIT]=pb1[6 +1]+tmp1*wi[ 1 ];
out[(11-1)*SBLIMIT]=pb1[11-1]+tmp1*wi[ 5-1];
}
DCT12_PART2;
out[(17-0)*SBLIMIT]=pb1[17-0]+in2*wi[11-0];
out[(12+0)*SBLIMIT]=pb1[12+0]+in2*wi[ 6+0];
out[(12+2)*SBLIMIT]=pb1[12+2]+in3*wi[ 6+2];
out[(17-2)*SBLIMIT]=pb1[17-2]+in3*wi[11-2];
out[( 6+0)*SBLIMIT]=pb1[ 6+0]+in0*wi[0];
out[(11-0)*SBLIMIT]=pb1[11-0]+in0*wi[5-0];
out[( 6+2)*SBLIMIT]=pb1[ 6+2]+in4*wi[2];
out[(11-2)*SBLIMIT]=pb1[11-2]+in4*wi[5-2];
}
in++;
{
REAL in0,in1,in2,in3,in4,in5;
register REAL *pb2 = prevblk2;
DCT12_PART1;
{
REAL tmp0,tmp1=(in0-in4);
{
REAL tmp2=(in1-in5)*hsec_12[1];
tmp0=tmp1+tmp2;
tmp1-=tmp2;
}
pb2[5-1]=tmp0*wi[11-1];
pb2[0+1]=tmp0*wi[6+1];
out[(12+1)*SBLIMIT]+=tmp1*wi[1];
out[(17-1)*SBLIMIT]+=tmp1*wi[5-1];
}
DCT12_PART2;
pb2[5-0]=in2*wi[11-0];
pb2[0+0]=in2*wi[6+0];
pb2[0+2]=in3*wi[6+2];
pb2[5-2]=in3*wi[11-2];
out[(12+0)*SBLIMIT]+=in0*wi[0];
out[(17-0)*SBLIMIT]+=in0*wi[5-0];
out[(12+2)*SBLIMIT]+=in4*wi[2];
out[(17-2)*SBLIMIT]+=in4*wi[5-2];
}
in++;
{
REAL in0,in1,in2,in3,in4,in5;
register REAL *pb2 = prevblk2;
pb2[12]=pb2[13]=pb2[14]=pb2[15]=pb2[16]=pb2[17]=0.0;
DCT12_PART1;
{
REAL tmp0,tmp1=(in0-in4);
{
REAL tmp2=(in1-in5)*hsec_12[1];
tmp0=tmp1+tmp2;
tmp1-=tmp2;
}
pb2[11-1]=tmp0*wi[11-1];
pb2[ 6+1]=tmp0*wi[6+1];
pb2[ 0+1]+=tmp1*wi[1];
pb2[ 5-1]+=tmp1*wi[5-1];
}
DCT12_PART2;
pb2[11-0]=in2*wi[11-0];
pb2[ 6+0]=in2*wi[ 6+0];
pb2[ 6+2]=in3*wi[ 6+2];
pb2[11-2]=in3*wi[11-2];
pb2[ 0+0]+=in0*wi[0 ];
pb2[ 5-0]+=in0*wi[5-0];
pb2[ 0+2]+=in4*wi[2 ];
pb2[ 5-2]+=in4*wi[5-2];
}
}
void MPEGaudio::layer3hybrid(int ch,int gr,REAL in[SBLIMIT][SSLIMIT],
REAL out[SSLIMIT][SBLIMIT])
{
layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]);
int bt1,bt2;
REAL *prev1,*prev2;
prev1=prevblck[ch][currentprevblock][0];
prev2=prevblck[ch][currentprevblock^1][0];
bt1 = gi->mixed_block_flag ? 0 : gi->block_type;
bt2 = gi->block_type;
{
REAL *ci=(REAL *)in,
*co=(REAL *)out;
int i;
if(downfrequency)i=(SBLIMIT/2)-2;
else i=SBLIMIT-2;
if(bt2==2)
{
if(!bt1)
{
dct36(ci,prev1,prev2,win[0],co);
ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
dct36(ci,prev1,prev2,win[0],co);
}
else
{
dct12(ci,prev1,prev2,win[2],co);
ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
dct12(ci,prev1,prev2,win[2],co);
}
do{
ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
dct12(ci,prev1,prev2,win[2],co);
}while(--i);
}
else
{
dct36(ci,prev1,prev2,win[bt1],co);
ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
dct36(ci,prev1,prev2,win[bt1],co);
do
{
ci+=SSLIMIT;prev1+=SSLIMIT;prev2+=SSLIMIT;co++;
dct36(ci,prev1,prev2,win[bt2],co);
}while(--i);
}
}
}
#define NEG(a) (a)=-(a)
void MPEGaudio::extractlayer3(void)
{
if(version)
{
extractlayer3_2();
return;
}
{
int main_data_end,flush_main;
int bytes_to_discard;
layer3getsideinfo();
if(issync())
{
for(register int i=layer3slots;i>0;i--) // read main data.
bitwindow.putbyte(getbyte());
}
else
{
for(register int i=layer3slots;i>0;i--) // read main data.
bitwindow.putbyte(getbits8());
}
main_data_end=bitwindow.gettotalbit()>>3;// of previous frame
if (main_data_end < 0) // Fix from Michael Vogt
{
return;
}
if((flush_main=(bitwindow.gettotalbit() & 0x7)))
{
bitwindow.forward(8-flush_main);
main_data_end++;
}
bytes_to_discard=layer3framestart-(main_data_end+sideinfo.main_data_begin);
if(main_data_end>WINDOWSIZE)
{
layer3framestart-=WINDOWSIZE;
bitwindow.rewind(WINDOWSIZE*8);
}
layer3framestart+=layer3slots;
bitwindow.wrap();
if(bytes_to_discard<0)return;
bitwindow.forward(bytes_to_discard<<3);
}
for(int gr=0;gr<2;gr++)
{
union
{
int is [SBLIMIT][SSLIMIT];
REAL hin [2][SBLIMIT][SSLIMIT];
}b1;
union
{
REAL ro [2][SBLIMIT][SSLIMIT];
REAL lr [2][SBLIMIT][SSLIMIT];
REAL hout [2][SSLIMIT][SBLIMIT];
}b2;
layer3part2start=bitwindow.gettotalbit();
layer3getscalefactors (LS,gr);
layer3huffmandecode (LS,gr ,b1.is);
layer3dequantizesample(LS,gr,b1.is,b2.ro[LS]);
if(inputstereo)
{
layer3part2start=bitwindow.gettotalbit();
layer3getscalefactors (RS,gr);
layer3huffmandecode (RS,gr ,b1.is);
layer3dequantizesample(RS,gr,b1.is,b2.ro[RS]);
}
layer3fixtostereo(gr,b2.ro); // b2.ro -> b2.lr
currentprevblock^=1;
layer3reorderandantialias(LS,gr,b2.lr[LS],b1.hin[LS]);
layer3hybrid (LS,gr,b1.hin[LS],b2.hout[LS]);
if(outputstereo)
{
layer3reorderandantialias(RS,gr,b2.lr[RS],b1.hin[RS]);
layer3hybrid (RS,gr,b1.hin[RS],b2.hout[RS]);
register int i=2*SSLIMIT*SBLIMIT-1;
do{
NEG(b2.hout[0][0][i ]);NEG(b2.hout[0][0][i- 2]);
NEG(b2.hout[0][0][i- 4]);NEG(b2.hout[0][0][i- 6]);
NEG(b2.hout[0][0][i- 8]);NEG(b2.hout[0][0][i-10]);
NEG(b2.hout[0][0][i-12]);NEG(b2.hout[0][0][i-14]);
NEG(b2.hout[0][0][i-16]);NEG(b2.hout[0][0][i-18]);
NEG(b2.hout[0][0][i-20]);NEG(b2.hout[0][0][i-22]);
NEG(b2.hout[0][0][i-24]);NEG(b2.hout[0][0][i-26]);
NEG(b2.hout[0][0][i-28]);NEG(b2.hout[0][0][i-30]);
}while((i-=2*SBLIMIT)>0);
}
else
{
register int i=SSLIMIT*SBLIMIT-1;
do{
NEG(b2.hout[0][0][i ]);NEG(b2.hout[0][0][i- 2]);
NEG(b2.hout[0][0][i- 4]);NEG(b2.hout[0][0][i- 6]);
NEG(b2.hout[0][0][i- 8]);NEG(b2.hout[0][0][i-10]);
NEG(b2.hout[0][0][i-12]);NEG(b2.hout[0][0][i-14]);
NEG(b2.hout[0][0][i-16]);NEG(b2.hout[0][0][i-18]);
NEG(b2.hout[0][0][i-20]);NEG(b2.hout[0][0][i-22]);
NEG(b2.hout[0][0][i-24]);NEG(b2.hout[0][0][i-26]);
NEG(b2.hout[0][0][i-28]);NEG(b2.hout[0][0][i-30]);
}while((i-=2*SBLIMIT)>0);
}
for(int ss=0;ss<SSLIMIT;ss++)
subbandsynthesis(b2.hout[LS][ss],b2.hout[RS][ss]);
}
}
void MPEGaudio::extractlayer3_2(void)
{
{
int main_data_end,flush_main;
int bytes_to_discard;
layer3getsideinfo_2();
if(issync())
{
for(register int i=layer3slots;i>0;i--) // read main data.
bitwindow.putbyte(getbyte());
}
else
{
for(register int i=layer3slots;i>0;i--) // read main data.
bitwindow.putbyte(getbits8());
}
bitwindow.wrap();
main_data_end=bitwindow.gettotalbit()>>3;// of previous frame
if((flush_main=(bitwindow.gettotalbit() & 0x7)))
{
bitwindow.forward(8-flush_main);
main_data_end++;
}
bytes_to_discard=layer3framestart-main_data_end-sideinfo.main_data_begin;
if(main_data_end>WINDOWSIZE)
{
layer3framestart-=WINDOWSIZE;
bitwindow.rewind(WINDOWSIZE*8);
}
layer3framestart+=layer3slots;
if(bytes_to_discard<0) return;
bitwindow.forward(bytes_to_discard<<3);
}
// for(int gr=0;gr<2;gr++)
{
union
{
int is [SBLIMIT][SSLIMIT];
REAL hin [2][SBLIMIT][SSLIMIT];
}b1;
union
{
REAL ro [2][SBLIMIT][SSLIMIT];
REAL lr [2][SBLIMIT][SSLIMIT];
REAL hout [2][SSLIMIT][SBLIMIT];
}b2;
layer3part2start=bitwindow.gettotalbit();
layer3getscalefactors_2(LS);
layer3huffmandecode (LS,0 ,b1.is);
layer3dequantizesample (LS,0,b1.is,b2.ro[LS]);
if(inputstereo)
{
layer3part2start=bitwindow.gettotalbit();
layer3getscalefactors_2(RS);
layer3huffmandecode (RS,0 ,b1.is);
layer3dequantizesample (RS,0,b1.is,b2.ro[RS]);
}
layer3fixtostereo(0,b2.ro); // b2.ro -> b2.lr
currentprevblock^=1;
layer3reorderandantialias(LS,0,b2.lr[LS],b1.hin[LS]);
layer3hybrid (LS,0,b1.hin[LS],b2.hout[LS]);
if(outputstereo)
{
layer3reorderandantialias(RS,0,b2.lr[RS],b1.hin[RS]);
layer3hybrid (RS,0,b1.hin[RS],b2.hout[RS]);
register int i=2*SSLIMIT*SBLIMIT-1;
do{
NEG(b2.hout[0][0][i-16]);NEG(b2.hout[0][0][i-18]);
NEG(b2.hout[0][0][i-20]);NEG(b2.hout[0][0][i-22]);
NEG(b2.hout[0][0][i-24]);NEG(b2.hout[0][0][i-26]);
NEG(b2.hout[0][0][i-28]);NEG(b2.hout[0][0][i-30]);
}while((i-=2*SBLIMIT)>0);
}
else
{
register int i=SSLIMIT*SBLIMIT-1;
do{
NEG(b2.hout[0][0][i-16]);NEG(b2.hout[0][0][i-18]);
NEG(b2.hout[0][0][i-20]);NEG(b2.hout[0][0][i-22]);
NEG(b2.hout[0][0][i-24]);NEG(b2.hout[0][0][i-26]);
NEG(b2.hout[0][0][i-28]);NEG(b2.hout[0][0][i-30]);
}while((i-=2*SBLIMIT)>0);
}
for(int ss=0;ss<SSLIMIT;ss++)
subbandsynthesis(b2.hout[LS][ss],b2.hout[RS][ss]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -