📄 mpeglayer3.cc
字号:
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 sfbcnt = -1; for (int 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 (int 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; } } { 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) { 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 { 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 voidlayer3reorder_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 voidlayer3reorder_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 voidlayer3antialias_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]); }}inline voidlayer3antialias_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];}voidMpegtoraw::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 voiddct36(REAL * inbuf, REAL * prevblk1, REAL * prevblk2, const 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 const REAL *c = cos_18; register REAL *out2 = prevblk2; register REAL *out1 = prevblk1; register REAL *ts = out; 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 voiddct12(REAL * in, REAL * prevblk1, REAL * prevblk2, register const 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; \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -