📄 layer3.c
字号:
in2 += (in1 = in[1*3]); \ in1 += (in0 = in[0*3]); \ \ in5 += in3; in3 += in1; \ \ in2 *= COS6_1; \ in3 *= COS6_1; \#define DCT12_PART2 \ in0 += in4 * COS6_2; \ \ in4 = in0 + in2; \ in0 -= in2; \ \ in1 += in5 * COS6_2; \ \ in5 = (in1 + in3) * tfcos12[0]; \ in1 = (in1 - in3) * tfcos12[2]; \ \ in3 = in4 + in5; \ in4 -= in5; \ \ in2 = in0 + in1; \ in0 -= in1; { real in0,in1,in2,in3,in4,in5; 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 = (in1 - in5) * tfcos12[1]; tmp0 = tmp1 + tmp2; tmp1 -= tmp2; } ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1]; ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1]; ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1]; ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1]; } DCT12_PART2 ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0]; ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0]; ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2]; ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2]; ts[(6+0)*SBLIMIT] = out1[6+0] + in0 * wi[0]; ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0]; ts[(6+2)*SBLIMIT] = out1[6+2] + in4 * wi[2]; ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2]; } in++; { real in0,in1,in2,in3,in4,in5; real *out2 = rawout2; DCT12_PART1 { real tmp0,tmp1 = (in0 - in4); { real tmp2 = (in1 - in5) * tfcos12[1]; tmp0 = tmp1 + tmp2; tmp1 -= tmp2; } out2[5-1] = tmp0 * wi[11-1]; out2[0+1] = tmp0 * wi[6+1]; ts[(12+1)*SBLIMIT] += tmp1 * wi[1]; ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1]; } DCT12_PART2 out2[5-0] = in2 * wi[11-0]; out2[0+0] = in2 * wi[6+0]; out2[0+2] = in3 * wi[6+2]; out2[5-2] = in3 * wi[11-2]; ts[(12+0)*SBLIMIT] += in0 * wi[0]; ts[(17-0)*SBLIMIT] += in0 * wi[5-0]; ts[(12+2)*SBLIMIT] += in4 * wi[2]; ts[(17-2)*SBLIMIT] += in4 * wi[5-2]; } in++; { real in0,in1,in2,in3,in4,in5; real *out2 = rawout2; out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0; DCT12_PART1 { real tmp0,tmp1 = (in0 - in4); { real tmp2 = (in1 - in5) * tfcos12[1]; tmp0 = tmp1 + tmp2; tmp1 -= tmp2; } out2[11-1] = tmp0 * wi[11-1]; out2[6 +1] = tmp0 * wi[6+1]; out2[0+1] += tmp1 * wi[1]; out2[5-1] += tmp1 * wi[5-1]; } DCT12_PART2 out2[11-0] = in2 * wi[11-0]; out2[6 +0] = in2 * wi[6+0]; out2[6 +2] = in3 * wi[6+2]; out2[11-2] = in3 * wi[11-2]; out2[0+0] += in0 * wi[0]; out2[5-0] += in0 * wi[5-0]; out2[0+2] += in4 * wi[2]; out2[5-2] += in4 * wi[5-2]; }}/* * III_hybrid */static void III_hybrid( PMPSTR mp, real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT], int ch,struct gr_info_s *gr_infos){ real *tspnt = (real *) tsOut; real (*block)[2][SBLIMIT*SSLIMIT] = mp->hybrid_block; int *blc = mp->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_infos->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_infos->block_type; if(bt == 2) { for (; sb<(int)gr_infos->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<(int)gr_infos->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); } } for(;sb<SBLIMIT;sb++,tspnt++) { int i; for(i=0;i<SSLIMIT;i++) { tspnt[i*SBLIMIT] = *rawout1++; *rawout2++ = 0.0; } }}/* * main layer3 handler */struct III_sideinfo sideinfo;int do_layer3_sideinfo(PMPSTR mp){ struct frame *fr = &mp->fr; int stereo = fr->stereo; int single = fr->single; int ms_stereo; int sfreq = fr->sampling_frequency; int granules; int ch,gr,databits; if(stereo == 1) { /* stream is mono */ single = 0; } if(fr->mode == MPG_MD_JOINT_STEREO) { ms_stereo = fr->mode_ext & 0x2; } else ms_stereo = 0; if(fr->lsf) { granules = 1; III_get_side_info_2(mp,&sideinfo,stereo,ms_stereo,sfreq,single); } else { granules = 2; III_get_side_info_1(mp,&sideinfo,stereo,ms_stereo,sfreq,single); } databits=0; for (gr=0 ; gr < granules ; ++gr) { for (ch=0; ch < stereo ; ++ch) { struct gr_info_s *gr_infos = &(sideinfo.ch[ch].gr[gr]); databits += gr_infos->part2_3_length; } } return databits-8*sideinfo.main_data_begin;}int do_layer3( PMPSTR mp,unsigned char *pcm_sample,int *pcm_point, int (*synth_1to1_mono_ptr)(PMPSTR,real *,unsigned char *,int *), int (*synth_1to1_ptr)(PMPSTR,real *,int,unsigned char *, int *) ){ int gr, ch, ss,clip=0; int scalefacs[2][39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */ /* struct III_sideinfo sideinfo; */ struct frame *fr=&(mp->fr); int stereo = fr->stereo; int single = fr->single; int ms_stereo,i_stereo; int sfreq = fr->sampling_frequency; int stereo1,granules; if(set_pointer(mp, (int)sideinfo.main_data_begin) == MP3_ERR) return 0; 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) { granules = 1; } else { granules = 2; } for (gr=0;gr<granules;gr++) { static real hybridIn[2][SBLIMIT][SSLIMIT]; static real hybridOut[2][SSLIMIT][SBLIMIT]; { struct gr_info_s *gr_infos = &(sideinfo.ch[0].gr[gr]); long part2bits; if(fr->lsf) part2bits = III_get_scale_factors_2(mp,scalefacs[0],gr_infos,0); else { part2bits = III_get_scale_factors_1(mp,scalefacs[0],gr_infos); }#ifndef NOANALYSIS if (mpg123_pinfo!=NULL) { int i; mpg123_pinfo->sfbits[gr][0] = part2bits; for (i=0; i<39; i++) mpg123_pinfo->sfb_s[gr][0][i]=scalefacs[0][i]; }#endif if(III_dequantize_sample(mp, hybridIn[0], scalefacs[0],gr_infos,sfreq,part2bits)) return clip; } if(stereo == 2) { struct gr_info_s *gr_infos = &(sideinfo.ch[1].gr[gr]); long part2bits; if(fr->lsf) part2bits = III_get_scale_factors_2(mp,scalefacs[1],gr_infos,i_stereo); else { part2bits = III_get_scale_factors_1(mp,scalefacs[1],gr_infos); }#ifndef NOANALYSIS if (mpg123_pinfo!=NULL) { int i; mpg123_pinfo->sfbits[gr][1] = part2bits; for (i=0; i<39; i++) mpg123_pinfo->sfb_s[gr][1][i]=scalefacs[1][i]; }#endif if(III_dequantize_sample(mp, hybridIn[1],scalefacs[1],gr_infos,sfreq,part2bits)) return clip; if(ms_stereo) { int i; for(i=0;i<SBLIMIT*SSLIMIT;i++) { real tmp0,tmp1; tmp0 = ((real *) hybridIn[0])[i]; tmp1 = ((real *) hybridIn[1])[i]; ((real *) hybridIn[1])[i] = tmp0 - tmp1; ((real *) hybridIn[0])[i] = tmp0 + tmp1; } } if(i_stereo) III_i_stereo(hybridIn,scalefacs[1],gr_infos,sfreq,ms_stereo,fr->lsf); if(ms_stereo || i_stereo || (single == 3) ) { if(gr_infos->maxb > sideinfo.ch[0].gr[gr].maxb) sideinfo.ch[0].gr[gr].maxb = gr_infos->maxb; else gr_infos->maxb = sideinfo.ch[0].gr[gr].maxb; } switch(single) { case 3: { int i; real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1]; for(i=0;i<(int)(SSLIMIT*gr_infos->maxb);i++,in0++) *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */ } break; case 1: { int i; real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1]; for(i=0;i<(int)(SSLIMIT*gr_infos->maxb);i++) *in0++ = *in1++; } break; } }#ifndef NOANALYSIS if (mpg123_pinfo!=NULL) { int i,sb; float ifqstep; mpg123_pinfo->bitrate = tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index]; mpg123_pinfo->sampfreq = freqs[sfreq]; mpg123_pinfo->emph = fr->emphasis; mpg123_pinfo->crc = fr->error_protection; mpg123_pinfo->padding = fr->padding; mpg123_pinfo->stereo = fr->stereo; mpg123_pinfo->js = (fr->mode == MPG_MD_JOINT_STEREO); mpg123_pinfo->ms_stereo = ms_stereo; mpg123_pinfo->i_stereo = i_stereo; mpg123_pinfo->maindata = sideinfo.main_data_begin; for(ch=0;ch<stereo1;ch++) { struct gr_info_s *gr_infos = &(sideinfo.ch[ch].gr[gr]); mpg123_pinfo->big_values[gr][ch]=gr_infos->big_values; mpg123_pinfo->scalefac_scale[gr][ch]=gr_infos->scalefac_scale; mpg123_pinfo->mixed[gr][ch] = gr_infos->mixed_block_flag; mpg123_pinfo->mpg123blocktype[gr][ch]=gr_infos->block_type; mpg123_pinfo->mainbits[gr][ch] = gr_infos->part2_3_length; mpg123_pinfo->preflag[gr][ch] = gr_infos->preflag; if (gr==1) mpg123_pinfo->scfsi[ch] = gr_infos->scfsi; } for (ch=0;ch<stereo1;ch++) { struct gr_info_s *gr_infos = &(sideinfo.ch[ch].gr[gr]); ifqstep = ( mpg123_pinfo->scalefac_scale[gr][ch] == 0 ) ? .5 : 1.0; if (2==gr_infos->block_type) { for (i=0; i<3; i++) { for (sb=0; sb<12; sb++) { int j = 3*sb+i; /* is_p = scalefac[sfb*3+lwin-gr_infos->mixed_block_flag]; */ /* scalefac was copied into mpg123_pinfo->sfb_s[] above */ mpg123_pinfo->sfb_s[gr][ch][j] = -ifqstep*mpg123_pinfo->sfb_s[gr][ch][j-gr_infos->mixed_block_flag]; mpg123_pinfo->sfb_s[gr][ch][j] -= 2*(mpg123_pinfo->sub_gain[gr][ch][i]); } mpg123_pinfo->sfb_s[gr][ch][3*sb+i] = - 2*(mpg123_pinfo->sub_gain[gr][ch][i]); } }else{ for (sb=0; sb<21; sb++) { /* scalefac was copied into mpg123_pinfo->sfb[] above */ mpg123_pinfo->sfb[gr][ch][sb] = mpg123_pinfo->sfb_s[gr][ch][sb]; if (gr_infos->preflag) mpg123_pinfo->sfb[gr][ch][sb] += pretab1[sb]; mpg123_pinfo->sfb[gr][ch][sb] *= -ifqstep; } mpg123_pinfo->sfb[gr][ch][21]=0; } } for(ch=0;ch<stereo1;ch++) { int j=0; for (sb=0;sb<SBLIMIT;sb++) for(ss=0;ss<SSLIMIT;ss++,j++) mpg123_pinfo->mpg123xr[gr][ch][j]=hybridIn[ch][sb][ss]; } }#endif for(ch=0;ch<stereo1;ch++) { struct gr_info_s *gr_infos = &(sideinfo.ch[ch].gr[gr]); III_antialias(hybridIn[ch],gr_infos); III_hybrid(mp, hybridIn[ch], hybridOut[ch], ch,gr_infos); } for(ss=0;ss<SSLIMIT;ss++) { if(single >= 0) { clip += (*synth_1to1_mono_ptr)(mp, hybridOut[0][ss],pcm_sample,pcm_point); } else { int p1 = *pcm_point; clip += (*synth_1to1_ptr)(mp, hybridOut[0][ss],0,pcm_sample,&p1); clip += (*synth_1to1_ptr)(mp, hybridOut[1][ss],1,pcm_sample,pcm_point); } } } return clip;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -