📄 layer3.c
字号:
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];
//int register i;
/*register real *out = inbuf + 17;
//for(i=0;i<18;i++,out--)
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);out--;
*out += *(out-1);*/
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 *out = inbuf + 17;
*out += *(out-2);out--;out--;
*out += *(out-2);out--;out--;
*out += *(out-2);out--;out--;
*out += *(out-2);out--;out--;
*out += *(out-2);out--;out--;
*out += *(out-2);out--;out--;
*out += *(out-2);out--;out--;
*out += *(out-2);*/
{
#define MACRO0(v) { \
real tmp = sum0 + sum1; \
out2[9+(v)] = MUL24(tmp, w[27+(v)]); \
out2[8-(v)] = MUL24(tmp, w[26-(v)]); } \
sum0 -= sum1; \
ts[SBLIMIT*(8-(v))] = out1[8-(v)] + MUL24(sum0, w[8-(v)]); \
ts[SBLIMIT*(9+(v))] = out1[9+(v)] + MUL24(sum0, w[9+(v)]);
/*#define MACRO0(v) { \
real tmp = sum0 + sum1; \
*(out2_9 + v) = MUL24(tmp, *(w27 + v)); \
*(out2_8 - v) = MUL24(tmp, *(w26 - v)); } \
sum0 -= sum1; \
ts[SBLIMIT*(8-(v))] = *(out1_8 - v) + MUL24(sum0, *(w8 - v)); \
ts[SBLIMIT*(9+(v))] = *(out1_9 + v) + MUL24(sum0, *(w9 + v));*/
#define MACRO1(v) { \
real sum0,sum1; \
sum0 = tmp1a + tmp2a; \
sum1 = MUL24((tmp1b + tmp2b), tfcos36[(v)]); \
MACRO0(v); }
#define MACRO2(v) { \
real sum0,sum1; \
sum0 = tmp2a - tmp1a; \
sum1 = MUL24((tmp2b - tmp1b), tfcos36[(v)]); \
MACRO0(v); }
/*register real *w27 = wintab + 27;
register real *w26 = w27--;
register real *w9 = wintab + 9;
register real *w8 = w9--;
register real *out2_9 = o2 + 9;
register real *out2_8 = out2_9--;
register real *out1_9 = o1 + 9;
register real *out1_8 = out1_9--;*/
register real *c = COS9;
register real *out2 = o2;
register real *w = wintab;
register real *out1 = o1;
register real *ts = tsbuf;
real ta33,ta66,tb33,tb66;
ta33 = MUL24(in[2*3+0], c[3]);
ta66 = MUL24(in[2*6+0], c[6]);
tb33 = MUL24(in[2*3+1], c[3]);
tb66 = MUL24(in[2*6+1], c[6]);
{
real tmp1a,tmp2a,tmp1b,tmp2b;
tmp1a = MUL24(in[2*1+0], c[1]) + MUL24(in[2*5+0], c[5]) + MUL24(in[2*7+0], c[7]) + ta33 ;
tmp1b = MUL24(in[2*1+1], c[1]) + MUL24(in[2*5+1], c[5]) + MUL24(in[2*7+1], c[7]) + tb33;
tmp2a = in[2*0+0] + MUL24(in[2*2+0], c[2]) + MUL24(in[2*4+0], c[4]) + MUL24(in[2*8+0], c[8]) + ta66;
tmp2b = in[2*0+1] + MUL24(in[2*2+1], c[2]) + MUL24(in[2*4+1], c[4]) + MUL24(in[2*8+1], c[8]) + tb66;
MACRO1(0);
MACRO2(8);
}
{
real tmp1a,tmp2a,tmp1b,tmp2b;
tmp1a = MUL24(( in[2*1+0] - in[2*5+0] - in[2*7+0] ), c[3]);
tmp1b = MUL24(( in[2*1+1] - in[2*5+1] - in[2*7+1] ), c[3]);
tmp2a = MUL24(( in[2*2+0] - in[2*4+0] - in[2*8+0] ), c[6]) - in[2*6+0] + in[2*0+0];
tmp2b = MUL24(( 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 = MUL24(in[2*1+0], c[5]) - MUL24(in[2*5+0], c[7]) + MUL24(in[2*7+0], c[1]) - ta33;
tmp1b = MUL24(in[2*1+1], c[5]) - MUL24(in[2*5+1], c[7]) + MUL24(in[2*7+1], c[1]) - tb33;
tmp2a = in[2*0+0] - MUL24(in[2*2+0], c[8]) - MUL24(in[2*4+0], c[2]) + MUL24(in[2*8+0], c[4]) + ta66;
tmp2b = in[2*0+1] - MUL24(in[2*2+1], c[8]) - MUL24(in[2*4+1], c[2]) + MUL24(in[2*8+1], c[4]) + tb66;
MACRO1(2);
MACRO2(6);
}
{
real tmp1a,tmp2a,tmp1b,tmp2b;
tmp1a = MUL24(in[2*1+0], c[7]) + MUL24(in[2*5+0], c[1]) - MUL24(in[2*7+0], c[5]) - ta33;
tmp1b = MUL24(in[2*1+1], c[7]) + MUL24(in[2*5+1], c[1]) - MUL24(in[2*7+1], c[5]) - tb33;
tmp2a = in[2*0+0] - MUL24(in[2*2+0], c[4]) + MUL24(in[2*4+0], c[8]) - MUL24(in[2*8+0], c[2]) + ta66;
tmp2b = in[2*0+1] - MUL24(in[2*2+1], c[4]) + MUL24(in[2*4+1], c[8]) - MUL24(in[2*8+1], c[2]) + tb66;
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 = MUL24((in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ), tfcos36[4]);
MACRO0(4);
}
}
}
}
#endif
//void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts);
/*
* new DCT12
*/
#if 0
void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts)
{
#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 = MUL24(in2, COS6_1); \
in3 = MUL24(in3, COS6_1); \
#define DCT12_PART2 \
in0 += MUL24(in4, COS6_2); \
\
in4 = in0 + in2; \
in0 -= in2; \
\
in1 += MUL24(in5, COS6_2); \
\
in5 = MUL24((in1 + in3), tfcos12[0]); \
in1 = MUL24((in1 - in3), tfcos12[2]); \
\
in3 = in4 + in5; \
in4 -= in5; \
\
in2 = in0 + in1; \
in0 -= in1;
{
real in0,in1,in2,in3,in4,in5;
register real *out1 = rawout1;
ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2];
ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5];
DCT12_PART1
{
real tmp0,tmp1 = (in0 - in4);
{
real tmp2 = MUL24((in1 - in5), tfcos12[1]);
tmp0 = tmp1 + tmp2;
tmp1 -= tmp2;
}
ts[(17-1)*SBLIMIT] = out1[17-1] + MUL24(tmp0, wi[11-1]);
ts[(12+1)*SBLIMIT] = out1[12+1] + MUL24(tmp0, wi[6+1]);
ts[(6 +1)*SBLIMIT] = out1[6 +1] + MUL24(tmp1, wi[1]);
ts[(11-1)*SBLIMIT] = out1[11-1] + MUL24(tmp1, wi[5-1]);
}
DCT12_PART2
ts[(17-0)*SBLIMIT] = out1[17-0] + MUL24(in2, wi[11-0]);
ts[(12+0)*SBLIMIT] = out1[12+0] + MUL24(in2, wi[6+0]);
ts[(12+2)*SBLIMIT] = out1[12+2] + MUL24(in3, wi[6+2]);
ts[(17-2)*SBLIMIT] = out1[17-2] + MUL24(in3, wi[11-2]);
ts[(6+0)*SBLIMIT] = out1[6+0] + MUL24(in0, wi[0]);
ts[(11-0)*SBLIMIT] = out1[11-0] + MUL24(in0, wi[5-0]);
ts[(6+2)*SBLIMIT] = out1[6+2] + MUL24(in4, wi[2]);
ts[(11-2)*SBLIMIT] = out1[11-2] + MUL24(in4, wi[5-2]);
}
in++;
{
real in0,in1,in2,in3,in4,in5;
register real *out2 = rawout2;
DCT12_PART1
{
real tmp0,tmp1 = (in0 - in4);
{
real tmp2 = MUL24((in1 - in5), tfcos12[1]);
tmp0 = tmp1 + tmp2;
tmp1 -= tmp2;
}
out2[5-1] = MUL24(tmp0, wi[11-1]);
out2[0+1] = MUL24(tmp0, wi[6+1]);
ts[(12+1)*SBLIMIT] += MUL24(tmp1, wi[1]);
ts[(17-1)*SBLIMIT] += MUL24(tmp1, wi[5-1]);
}
DCT12_PART2
out2[5-0] = MUL24(in2, wi[11-0]);
out2[0+0] = MUL24(in2, wi[6+0]);
out2[0+2] = MUL24(in3, wi[6+2]);
out2[5-2] = MUL24(in3, wi[11-2]);
ts[(12+0)*SBLIMIT] += MUL24(in0, wi[0]);
ts[(17-0)*SBLIMIT] += MUL24(in0, wi[5-0]);
ts[(12+2)*SBLIMIT] += MUL24(in4, wi[2]);
ts[(17-2)*SBLIMIT] += MUL24(in4, wi[5-2]);
}
in++;
{
real in0,in1,in2,in3,in4,in5;
register real *out2 = rawout2;
out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0;
DCT12_PART1
{
real tmp0,tmp1 = (in0 - in4);
{
real tmp2 = MUL24((in1 - in5), tfcos12[1]);
tmp0 = tmp1 + tmp2;
tmp1 -= tmp2;
}
out2[11-1] = MUL24(tmp0, wi[11-1]);
out2[6 +1] = MUL24(tmp0, wi[6+1]);
out2[0+1] += MUL24(tmp1, wi[1]);
out2[5-1] += MUL24(tmp1, wi[5-1]);
}
DCT12_PART2
out2[11-0] = MUL24(in2, wi[11-0]);
out2[6 +0] = MUL24(in2, wi[6+0]);
out2[6 +2] = MUL24(in3, wi[6+2]);
out2[11-2] = MUL24(in3, wi[11-2]);
out2[0+0] += MUL24(in0, wi[0]);
out2[5-0] += MUL24(in0, wi[5-0]);
out2[0+2] += MUL24(in4, wi[2]);
out2[5-2] += MUL24(in4, wi[5-2]);
}
}
#endif
/*void III_hybrid(real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],
int ch,struct gr_info_s *gr_info);*/
/*
* III_hybrid
*/
#if 0
void III_hybrid(real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],
int ch,struct gr_info_s *gr_info)
{
real *tspnt = (real *) tsOut;
real (*block)[2][SBLIMIT*SSLIMIT] = gmp.hybrid_block;
int *blc = gmp.hybrid_blc;
real *rawout1,*rawout2;
int bt;
int sb = 0;
{
int b = blc[ch];
rawout1=block[b][ch];
b=-b+1;
rawout2=block[b][ch];
blc[ch] = b;
}
if(gr_info->mixed_block_flag) {
sb = 2;
dct36(fsIn[0],rawout1,rawout2,win[0],tspnt);
dct36(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1);
rawout1 += 36; rawout2 += 36; tspnt += 2;
}
bt = gr_info->block_type;
if(bt == 2) {
for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
dct12(fsIn[sb],rawout1,rawout2,win[2],tspnt);
dct12(fsIn[sb+1],rawout1+18,rawout2+18,win1[2],tspnt+1);
}
}
else {
for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
dct36(fsIn[sb],rawout1,rawout2,win[bt],tspnt);
dct36(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1);
}
}
/*
* Modified by DSA 2003.10.31 ok
*/
/*for(;sb<SBLIMIT;sb++,tspnt++) {
int i;
for(i=0;i<SSLIMIT;i++) {
tspnt[i*SBLIMIT] = *rawout1++;
*rawout2++ = 0;
}
}*/
for(;sb<SBLIMIT;sb++,tspnt++) {
tspnt[0*SBLIMIT] = *rawout1++;
tspnt[1*SBLIMIT] = *rawout1++;
tspnt[2*SBLIMIT] = *rawout1++;
tspnt[3*SBLIMIT] = *rawout1++;
tspnt[4*SBLIMIT] = *rawout1++;
tspnt[5*SBLIMIT] = *rawout1++;
tspnt[6*SBLIMIT] = *rawout1++;
tspnt[7*SBLIMIT] = *rawout1++;
tspnt[8*SBLIMIT] = *rawout1++;
tspnt[9*SBLIMIT] = *rawout1++;
tspnt[10*SBLIMIT] = *rawout1++;
tspnt[11*SBLIMIT] = *rawout1++;
tspnt[12*SBLIMIT] = *rawout1++;
tspnt[13*SBLIMIT] = *rawout1++;
tspnt[14*SBLIMIT] = *rawout1++;
tspnt[15*SBLIMIT] = *rawout1++;
tspnt[16*SBLIMIT] = *rawout1++;
tspnt[17*SBLIMIT] = *rawout1++;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
*rawout2++ = 0;
}
}
#endif
/*
* main layer3 handler
*/
real hybridOut[2][SSLIMIT][SBLIMIT];
int do_layer3(struct frame *fr,unsigned char *pcm_sample,int *pcm_point)
{
int gr, ch, clip=0;
int scalefacs[39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
int stereo = fr->stereo;
int single = fr->single;
int ms_stereo,i_stereo;
int sfreq = fr->sampling_frequency;
int stereo1,granules;
if(stereo == 1) { /* stream is mono */
stereo1 = 1;
single = 0;
}
else if(single >= 0) /* stream is stereo, but force to mono */
stereo1 = 1;
else
stereo1 = 2;
if(fr->mode == MPG_MD_JOINT_STEREO) {
ms_stereo = fr->mode_ext & 0x2;
i_stereo = fr->mode_ext & 0x1;
}
else
ms_stereo = i_stereo = 0;
if(fr->lsf) {
#if (defined MPEG2||defined MPEG25)
granules = 1;
III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -