📄 layer3.c
字号:
static 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 *= 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;
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 = (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;
register 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;
register 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(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);
}
}
for(;sb<SBLIMIT;sb++,tspnt++) {
int i;
for(i=0;i<SSLIMIT;i++) {
tspnt[i*SBLIMIT] = *rawout1++;
*rawout2++ = 0.0;
}
}
}
/*
* main layer3 handler
*/
int do_layer3(struct frame *fr, unsigned char *pcm_sample, int *pcm_point)
{
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;
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) {
granules = 1;
if (III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single))
#ifdef BE_QUIET
return -1;
#else
;
#endif
}
else {
granules = 2;
#ifdef MPEG1
if (III_get_side_info_1(&sideinfo,stereo,ms_stereo,sfreq,single))
#ifdef BE_QUIET
return -1;
#else
;
#endif
#else
#ifndef BE_QUIET
fprintf(stderr,"Not supported\n");
#endif
#endif
}
if(set_pointer(sideinfo.main_data_begin) == MP3_ERR)
return 0;
for (gr=0;gr<granules;gr++)
{
static real hybridIn[2][SBLIMIT][SSLIMIT];
static real hybridOut[2][SSLIMIT][SBLIMIT];
{
struct gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]);
long part2bits;
if(fr->lsf)
part2bits = III_get_scale_factors_2(scalefacs[0],gr_info,0);
else {
#ifdef MPEG1
part2bits = III_get_scale_factors_1(scalefacs[0],gr_info);
#else
#ifndef BE_QUIET
fprintf(stderr,"Not supported\n");
#endif
#endif
}
#ifdef HAVEGTK
if (gtkflag) {
int i;
for (i=0; i<39; i++)
pinfo->sfb_s[gr][0][i]=scalefacs[0][i];
}
#endif
if(III_dequantize_sample(hybridIn[0], scalefacs[0],gr_info,sfreq,part2bits))
#ifndef BE_QUIET
return clip;
#else
return 0;
#endif
}
if(stereo == 2) {
struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]);
long part2bits;
if(fr->lsf)
part2bits = III_get_scale_factors_2(scalefacs[1],gr_info,i_stereo);
else {
#ifdef MPEG1
part2bits = III_get_scale_factors_1(scalefacs[1],gr_info);
#else
#ifndef BE_QUIET
fprintf(stderr,"Not supported\n");
#endif
#endif
}
#ifdef HAVEGTK
if (gtkflag) {
int i;
for (i=0; i<39; i++)
pinfo->sfb_s[gr][1][i]=scalefacs[1][i];
}
#endif
if(III_dequantize_sample(hybridIn[1],scalefacs[1],gr_info,sfreq,part2bits))
#ifndef BE_QUIET
return clip;
#else
return 0;
#endif
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_info,sfreq,ms_stereo,fr->lsf);
if(ms_stereo || i_stereo || (single == 3) ) {
if(gr_info->maxb > sideinfo.ch[0].gr[gr].maxb)
sideinfo.ch[0].gr[gr].maxb = gr_info->maxb;
else
gr_info->maxb = sideinfo.ch[0].gr[gr].maxb;
}
switch(single) {
case 3:
{
register int i;
register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
for(i=0;i<SSLIMIT*gr_info->maxb;i++,in0++)
*in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */
}
break;
case 1:
{
register int i;
register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
for(i=0;i<SSLIMIT*gr_info->maxb;i++)
*in0++ = *in1++;
}
break;
}
}
#ifdef HAVEGTK
if (gtkflag) {
extern int tabsel_123[2][3][16];
extern int pretab[21];
int i,j,sb;
float ifqstep;
for (ch=0;ch<stereo1;ch++) {
struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
ifqstep = ( pinfo->scalefac_scale[gr][ch] == 0 ) ? .5 : 1.0;
if (2==gr_info->block_type) {
for (i=0; i<3; i++) {
for (sb=0; sb<12; sb++) {
j = 3*sb+i;
/*
is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag];
*/
/* scalefac was copied into pinfo->sfb_s[] above */
pinfo->sfb_s[gr][ch][j] = -ifqstep*pinfo->sfb_s[gr][ch][j-gr_info->mixed_block_flag];
pinfo->sfb_s[gr][ch][j] -= 2*(pinfo->sub_gain[gr][ch][i]);
}
pinfo->sfb_s[gr][ch][3*sb+i] = - 2*(pinfo->sub_gain[gr][ch][i]);
}
}else{
for (sb=0; sb<21; sb++) {
/* scalefac was copied into pinfo->sfb[] above */
pinfo->sfb[gr][ch][sb] = pinfo->sfb_s[gr][ch][sb];
if (gr_info->preflag) pinfo->sfb[gr][ch][sb] += pretab[sb];
pinfo->sfb[gr][ch][sb] *= -ifqstep;
}
}
}
pinfo->bitrate =
tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index];
pinfo->sampfreq = freqs[sfreq];
pinfo->emph = fr->emphasis;
pinfo->crc = fr->error_protection;
pinfo->padding = fr->padding;
pinfo->stereo = fr->stereo;
pinfo->js = (fr->mode == MPG_MD_JOINT_STEREO);
pinfo->ms_stereo = ms_stereo;
pinfo->i_stereo = i_stereo;
pinfo->maindata = sideinfo.main_data_begin;
for(ch=0;ch<stereo1;ch++) {
struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
pinfo->mixed[gr][ch] = gr_info->mixed_block_flag;
pinfo->mpg123blocktype[gr][ch]=gr_info->block_type;
pinfo->mainbits[gr][ch] = gr_info->part2_3_length;
if (gr==1) pinfo->scfsi[ch] = gr_info->scfsi;
}
for(ch=0;ch<stereo1;ch++) {
int j=0;
for (sb=0;sb<SBLIMIT;sb++)
for(ss=0;ss<SSLIMIT;ss++,j++)
pinfo->mpg123xr[gr][ch][j]=hybridIn[ch][sb][ss];
}
}
#endif
for(ch=0;ch<stereo1;ch++) {
struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
III_antialias(hybridIn[ch],gr_info);
III_hybrid(hybridIn[ch], hybridOut[ch], ch,gr_info);
}
for(ss=0;ss<SSLIMIT;ss++) {
if(single >= 0) {
clip += synth_1to1_mono(hybridOut[0][ss],pcm_sample,pcm_point);
}
else {
int p1 = *pcm_point;
clip += synth_1to1(hybridOut[0][ss],0,pcm_sample,&p1);
clip += synth_1to1(hybridOut[1][ss],1,pcm_sample,pcm_point);
}
}
}
#ifndef BE_QUIET
return clip;
#else
return 0;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -