📄 dyn_cross.c
字号:
break; case 10: if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) bit_alloc[T4[sbgr]][min_sb] = 1; break; case 11: if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) bit_alloc[T3[sbgr]][min_sb] = 1; if(min_ch == R0 && bit_alloc[R0][min_sb] != 0) bit_alloc[T4[sbgr]][min_sb] = 1; break; case 12: if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) bit_alloc[T4[sbgr]][min_sb] = 1; if(min_ch == L0 && bit_alloc[L0][min_sb] != 0) bit_alloc[T3[sbgr]][min_sb] = 1; break; case 13: if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) bit_alloc[T2[sbgr]][min_sb] = 1; if(min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) bit_alloc[T4[sbgr]][min_sb] = 1; break; case 14: if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) { bit_alloc[T3[sbgr]][min_sb] = 1; bit_alloc[T4[sbgr]][min_sb] = 1; } break; case 15: fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!\n"); fflush(stderr); exit(0); break; } /* switch.. */}else if (fr_ps->config == 310 || fr_ps->config == 220){ /* 3/1 and 2/2 */ switch(fr_ps->header->dyn_cross[sbgr]) { case 0: break; case 1: if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0) bit_alloc[T3[sbgr]][min_sb] = 1; break; case 2: if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) bit_alloc[T2[sbgr]][min_sb] = 1; break; case 3: if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) bit_alloc[T2[sbgr]][min_sb] = 1; if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0) bit_alloc[T3[sbgr]][min_sb] = 1; break; case 4: if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) bit_alloc[T3[sbgr]][min_sb] = 1; break; default: fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!\n"); fflush(stderr); exit(0); break; } /* switch.. */}else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210){ /* 3/0 (+2/0) and 2/1 */ switch(fr_ps->header->dyn_cross[sbgr]) { case 0: break; case 1: if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) bit_alloc[T2[sbgr]][min_sb] = 1; break; default: fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!\n"); fflush(stderr); exit(0); break; } /* switch.. */ if (fr_ps->header->dyn_second_stereo[sbgr]) if(min_ch == T4outof[sbgr] && bit_alloc[T4outof[sbgr]][min_sb] != 0) bit_alloc[T4[sbgr]][min_sb] = 1;}else if (fr_ps->config == 202){ if (fr_ps->header->dyn_second_stereo[sbgr]) if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0) bit_alloc[T3[sbgr]][min_sb] = 1;}else if (fr_ps->config == 102){ if (fr_ps->header->dyn_second_stereo[sbgr]) if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) bit_alloc[T2[sbgr]][min_sb] = 1;}}#ifdef Augmentation_7chvoid choose_dyn_aug ( frame_params *fr_ps, /* in: fr_ps->header->dyn_cross[sbgr] * fr_ps->alloc */ int min_ch, /* in */ int min_sb, /* in */ int sbgr, /* in */ unsigned int bit_alloc[CHANMAX3][SBLIMIT]) /* out */{/* global parameters * in: T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS] */ layer *info = fr_ps->header; int dynx_T2 = !dyn_ch (fr_ps, sbgr, 2); int dynx_T3 = !dyn_ch (fr_ps, sbgr, 3); int dynx_T4 = !dyn_ch (fr_ps, sbgr, 4); int T5T0 = L0, T6T0 = L0, T6T1 = R0; if (info->aug_tc_alloc[sbgr] == 4 || info->aug_tc_alloc[sbgr] == 5) if (fr_ps->header->dyn_cross_LR == 0) T6T1 = L0; else T6T0 = R0; else if (info->aug_tc_alloc[sbgr] == 6 || info->aug_tc_alloc[sbgr] == 7) if (info->dyn_cross_LR) T5T0 = R0; /* 5/2 */ switch (fr_ps->header->aug_dyn_cross[sbgr]) { case 0: break; case 1: if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 2: if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) || (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0)) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 3: if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) || (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0)) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 4: if (min_ch == T5[sbgr] && bit_alloc[T5[sbgr]][min_sb] != 0) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 5: if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) bit_alloc[T5[sbgr]][min_sb] = 1; break; case 6: if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) bit_alloc[T5[sbgr]][min_sb] = 1; if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 7: if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) bit_alloc[T5[sbgr]][min_sb] = 1; if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) || (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0)) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 8: if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) bit_alloc[T5[sbgr]][min_sb] = 1; if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) || (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0)) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 9: if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) bit_alloc[T5[sbgr]][min_sb] = 1; if (min_ch == T6T0 && bit_alloc[T6T0][min_sb] != 0) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 10: if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) || (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = 1; break; case 11: if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) || (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = 1; if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 12: if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) || (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = bit_alloc[T6[sbgr]][min_sb] = 1; break; case 13: if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) || (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = 1; if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) || (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0)) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 14: if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) || (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = 1; break; case 15: if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) || (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = 1; if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 16: if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) || (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = 1; if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) || (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0)) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 17: if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) || (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = 1; if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) || (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0)) bit_alloc[T6[sbgr]][min_sb] = 1; break; case 18: if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) || (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0)) bit_alloc[T5[sbgr]][min_sb] = bit_alloc[T6[sbgr]][min_sb] = 1; break; default: fprintf (stderr, "FORBIDDEN AUG_DYN_CROSS!!!!!\n"); fflush (stderr); exit (1); break; }}#endif/************************************************************************ * * scfsi_calc_dyn * * Version 1.0 94/07/07 Andreas Silzle, IRT * * Calculating the scale factor select information of one channel * without changing the scale factors. * ************************************************************************/void scfsi_calc_dyn ( unsigned int scalar_dyn[][3][SBLIMIT], /* in/out */ int ch, /* in */ int sblimit, /* in */ unsigned int scfsi_dyn[][SBLIMIT]) /* out */{ int sb; for (sb = 0; sb < sblimit; sb++) { /* If the subbands are coded only with SCF's, they must be accurate. */ /* 1993-02-19 and 1994-03-17 shn */ /* 4 patterns are possible: 0: ABC, 1: AAB, 2: AAA, 3: ABB */ if ((scalar_dyn[ch][0][sb] != scalar_dyn[ch][1][sb]) && (scalar_dyn[ch][1][sb] != scalar_dyn[ch][2][sb])) scfsi_dyn[ch][sb] = 0; else if ((scalar_dyn[ch][0][sb] == scalar_dyn[ch][1][sb]) && (scalar_dyn[ch][1][sb] != scalar_dyn[ch][2][sb])) scfsi_dyn[ch][sb] = 1; else if ((scalar_dyn[ch][0][sb] == scalar_dyn[ch][1][sb]) && (scalar_dyn[ch][1][sb] == scalar_dyn[ch][2][sb])) scfsi_dyn[ch][sb] = 2; else scfsi_dyn[ch][sb] = 3; } /* for (sb.. */}/************************************************************************ * * scfsi_calc * * Version 1.0 94/07/07 Andreas Silzle, IRT * * Calculating the scale factor select information of one channel. * * route: II_transmission_pattern (Layer II only) * * PURPOSE:For a given subband, determines whether to send 1, 2, or * all 3 of the scalefactors, and fills in the scalefactor * select information accordingly * * SEMANTICS: The subbands and channels are classified based on how much * the scalefactors changes over its three values (corresponding * to the 3 sets of 12 samples per subband). The classification * will send 1 or 2 scalefactors instead of three if the scalefactors * do not change much. The scalefactor select information, * #scfsi#, is filled in accordingly. * ************************************************************************/void scfsi_calc ( unsigned int scalar[][3][SBLIMIT], /* in/out */ int ch, /* in */ int sblimit, /* in */ unsigned int scfsi[][SBLIMIT]) /* out */{ int dscf[2]; int class[2], sb, j; static int pattern[5][5] = { 0x123, 0x122, 0x122, 0x133, 0x123, 0x113, 0x111, 0x111, 0x444, 0x113, 0x111, 0x111, 0x111, 0x333, 0x113, 0x222, 0x222, 0x222, 0x333, 0x123, 0x123, 0x122, 0x122, 0x133, 0x123 }; for (sb = 0; sb < sblimit; sb++) { dscf[0] = (scalar[ch][0][sb] - scalar[ch][1][sb]); dscf[1] = (scalar[ch][1][sb] - scalar[ch][2][sb]); for (j=0; j<2; j++) { if (dscf[j] <= -3) class[j] = 0; else if (dscf[j] > -3 && dscf[j] < 0) class[j] = 1; else if (dscf[j] == 0) class[j] = 2; else if (dscf[j] > 0 && dscf[j] < 3) class[j] = 3; else class[j] = 4; } switch (pattern[class[0]][class[1]]) { case 0x123 : scfsi[ch][sb] = 0; break; case 0x122 : scfsi[ch][sb] = 3; scalar[ch][2][sb] = scalar[ch][1][sb]; break; case 0x133 : scfsi[ch][sb] = 3; scalar[ch][1][sb] = scalar[ch][2][sb]; break; case 0x113 : scfsi[ch][sb] = 1; scalar[ch][1][sb] = scalar[ch][0][sb]; break; case 0x111 : scfsi[ch][sb] = 2; scalar[ch][1][sb] = scalar[ch][2][sb] = scalar[ch][0][sb]; break; case 0x222 : scfsi[ch][sb] = 2; scalar[ch][0][sb] = scalar[ch][2][sb] = scalar[ch][1][sb]; break; case 0x333 : scfsi[ch][sb] = 2; scalar[ch][0][sb] = scalar[ch][1][sb] = scalar[ch][2][sb]; break; case 0x444 : scfsi[ch][sb] = 2; if (scalar[ch][0][sb] > scalar[ch][2][sb]) scalar[ch][0][sb] = scalar[ch][2][sb]; scalar[ch][1][sb] = scalar[ch][2][sb] = scalar[ch][0][sb]; } /* switch */ } /* for (sb.. */}/************************************************************************ * * scf_calc * * Calculating the scale factor for one channel. * * Version 1.0 94/07/07 Andreas Silzle, IRT * * route: II_scale_factor_calc() * * PURPOSE:For each subband, calculate the scale factor for each set * of the 12 subband samples * * SEMANTICS: Pick the scalefactor #multiple[]# just larger than the * absolute value of the peak subband sample of 12 samples, * and store the corresponding scalefactor index in #scalar#. * * Layer II has three sets of 12-subband samples for a given * subband. * ************************************************************************/void scf_calc ( double sample[][3][SCALE_BLOCK][SBLIMIT], /* in */ int sblimit, /* in */ int ch, /* in */ unsigned int scf[][3][SBLIMIT]) /* out */ {/* global variables: * double multiple[64] */ int sb, smp, sufr, r; double s[SBLIMIT]; for (sufr=0; sufr<3; sufr++) { for (sb=0; sb<sblimit; sb++) for (smp=1, s[sb] = mod(sample[ch][sufr][0][sb]); smp<SCALE_BLOCK; smp++) if (mod(sample[ch][sufr][smp][sb]) > s[sb]) s[sb] = mod(sample[ch][sufr][smp][sb]); for (sb=0; sb<sblimit; sb++) for (r=SCALE_RANGE-1, scf[ch][sufr][sb]=0; r>=0; r--) if (s[sb] < multiple[r]) { /* <= changed to <, 1992-11-06 shn*/ scf[ch][sufr][sb] = r; break; } } /* for (sufr.. */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -