📄 dyn_cross.c
字号:
/********************************************************************** * ISO MPEG Audio Subgroup Software Simulation Group (1996) * ISO 13818-3 MPEG-2 Audio Multichannel Encoder * * $Id: dyn_cross.c 1.3 1996/02/12 07:13:35 rowlands Exp $ * * $Log: dyn_cross.c $ * Revision 1.3 1996/02/12 07:13:35 rowlands * Release following Munich meeting * **********************************************************************/#include "common.h"#include "encoder.h"/************************************************************************ * * take_dyn_cross * * Version 1.0 94/10/24 Andreas Silzle, IRT * * Copy the sums, scf, scfsi, if required, in the normal positions. * ************************************************************************//* #define LOW_SBGR 5 original value 960619 FdB */#define LOW_SBGR 0 /* lowest subbandgroup, in which dyn_cross is done.*/ /* All sb-groups under that boarder are not */ /* affected by dyn_cross */void take_dyn_cross ( int dyn_cr, frame_params *fr_ps, /* out: int fr_ps->header->dyn_cross_on, * int fr_ps->header->dyn_cross_LR, * int fr_ps->header->dyn_cross[SBGRS], */ double sb_sample_sum[5][3][SCALE_BLOCK][SBLIMIT], /* in, T23, T24, T34, T234, T56 */ unsigned int scalar_sum[][3][SBLIMIT], /* in */ unsigned int scfsi_sum[][SBLIMIT], /* in */ unsigned int scfsi_dyn[][SBLIMIT], /* in */ double sb_sample[CHANMAX3][3][SCALE_BLOCK][SBLIMIT], /* out */ unsigned int scalar[][3][SBLIMIT], /* out */ unsigned int scfsi[][SBLIMIT]) /* out */{ int sbgr, sb, sufr, smp, dyn_second_stereo = 0; layer *info = fr_ps->header; int center = info->center; int surround = info->surround; fr_ps->header->dyn_cross_on = 0; if (fr_ps->header->dyn_cross_LR && (fr_ps->config == 302 || fr_ps->config == 202 || fr_ps->config == 102)) dyn_second_stereo = 1;/* printf ("dyn_cr: %2d\n", dyn_cr); */ for (sbgr = LOW_SBGR; sbgr < SBGRS; sbgr++) { /* signalization */ if (dyn_cr == 0 && dyn_second_stereo == 0) { fr_ps->header->dyn_cross[sbgr] = 0; fr_ps->header->dyn_second_stereo[sbgr] = 0; } else { fr_ps->header->dyn_cross_on = 1; /* original value 960619 FdB */ /* fr_ps->header->dyn_cross[sbgr] = dyn_cr; */ /* systematic variation of dynamic crosstalk over all subbands */ if (dyn_cr == -1) { switch (fr_ps->config) { case 320: fr_ps->header->dyn_cross[sbgr] = rand () % 15; break; case 310: case 220: fr_ps->header->dyn_cross[sbgr] = rand () % 5; break; case 300: case 302: case 210: fr_ps->header->dyn_cross[sbgr] = rand () % 2; break; default: fr_ps->header->dyn_cross[sbgr] = 0; break; } } else fr_ps->header->dyn_cross[sbgr] = dyn_cr; fr_ps->header->dyn_second_stereo[sbgr] = dyn_second_stereo;/* printf ("sbgr: %2d dyn_cr: %2d dyn_2nd_st: %2d\n", sbgr, fr_ps->header->dyn_cross[sbgr], fr_ps->header->dyn_second_stereo[sbgr]);*/ /* copying sums, scf, scfsi */ /* 960627 FdB DynX dependent on configuration */ if (fr_ps->config == 320) { /* 3/2 */ if(fr_ps->header->dyn_cross[sbgr] == 9 || fr_ps->header->dyn_cross[sbgr] == 11) { T3from[sbgr] = T2[sbgr]; for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) { scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb]; for(sufr = 0; sufr<3; ++sufr) { scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb]; for(smp = 0; smp<SCALE_BLOCK; ++smp) { sb_sample[T2[sbgr]][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb]; } /* for(smp..) */ } /* for(sufr.). */ } /* for(sb..) */ } else if(fr_ps->header->dyn_cross[sbgr] == 10 || fr_ps->header->dyn_cross[sbgr] == 12) { T4from[sbgr] = T2[sbgr]; for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) { scfsi[T2[sbgr]][sb] = scfsi_sum[T24][sb]; for(sufr = 0; sufr<3; ++sufr) { scalar[T2[sbgr]][sufr][sb] = scalar_sum[T24][sufr][sb]; for(smp = 0; smp<SCALE_BLOCK; ++smp) { sb_sample[T2[sbgr]][sufr][smp][sb] = sb_sample_sum[T24][sufr][smp][sb]; } /* for(smp..) */ } /* for(sufr..) */ } /* for(sb..) */ } else if(fr_ps->header->dyn_cross[sbgr] == 8 || fr_ps->header->dyn_cross[sbgr] == 13) { T4from[sbgr] = T3[sbgr]; for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) { scfsi[T3[sbgr]][sb] = scfsi_sum[T34][sb]; for(sufr = 0; sufr<3; ++sufr) { scalar[T3[sbgr]][sufr][sb] = scalar_sum[T34][sufr][sb]; for(smp = 0; smp<SCALE_BLOCK; ++smp) { sb_sample[T3[sbgr]][sufr][smp][sb] = sb_sample_sum[T34][sufr][smp][sb]; } /* for(smp..) */ } /* for(sufr..) */ } /* for(sb..) */ } else if(fr_ps->header->dyn_cross[sbgr] == 14) { T3from[sbgr] = T4from[sbgr] = T2[sbgr]; for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) { scfsi[T2[sbgr]][sb] = scfsi_sum[T234][sb]; for(sufr = 0; sufr<3; ++sufr) { scalar[T2[sbgr]][sufr][sb] = scalar_sum[T234][sufr][sb]; for(smp = 0; smp<SCALE_BLOCK; ++smp) { sb_sample[T2[sbgr]][sufr][smp][sb] = sb_sample_sum[T234][sufr][smp][sb]; } /* for(smp..) */ } /* for(sufr..) */ } /* for(sb..) */ } /* if(dyncr_do[sbgr]..) */ /* scfsi_dyn in scfsi of L0 and R0 */ /* T2 */ switch(fr_ps->header->dyn_cross[sbgr]) { case 3: case 5: case 6: case 7: case 13: T2from[sbgr] = T2outof[sbgr]; for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb]; break; } /* switch(dyncr_do[sbgr]) */ /* T3 */ switch(fr_ps->header->dyn_cross[sbgr]) { case 2: case 4: case 6: case 7: case 12: T3from[sbgr] = T3outof[sbgr]; for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) scfsi[L0][sb] = scfsi_dyn[L0][sb]; break; } /* switch(dyncr_do[sbgr]) */ /* T4 */ switch(fr_ps->header->dyn_cross[sbgr]) { case 1: case 4: case 5: case 7: case 11: T4from[sbgr] = T4outof[sbgr]; for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) scfsi[R0][sb] = scfsi_dyn[R0][sb]; break; } /* switch(fr_ps->header->dyn_cross[sbgr]) */ } else if (fr_ps->config == 310 || fr_ps->config == 220) { /* 3/1 and 2/2 */ if(fr_ps->header->dyn_cross[sbgr] == 4) { for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) { scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb]; for(sufr = 0; sufr<3; ++sufr) { scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb]; for(smp = 0; smp<SCALE_BLOCK; ++smp) { sb_sample[T2[sbgr]][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb]; } /* for(smp..) */ } /* for(sufr.). */ } /* for(sb..) */ } /* scfsi_dyn in scfsi of L0 and R0 */ /* T2 */ switch(fr_ps->header->dyn_cross[sbgr]) { case 2: case 3: for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb]; break; } /* switch(dyncr_do[sbgr]) */ /* T3 */ switch(fr_ps->header->dyn_cross[sbgr]) { case 1: case 3: for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) scfsi[T3outof[sbgr]][sb] = scfsi_dyn[T3outof[sbgr]][sb]; break; } /* switch(dyncr_do[sbgr]) */ } else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210) { /* 3/0 (+2/0) and 2/1 */ /* scfsi_dyn in scfsi of L0 and R0 */ /* T2 */ switch(fr_ps->header->dyn_cross[sbgr]) { case 1: for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb]; break; } /* switch(dyncr_do[sbgr]) */ if (fr_ps->header->dyn_second_stereo[sbgr]) for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) { scfsi[T3[sbgr]][sb] = scfsi_sum[T23][sb]; for (sufr = 0; sufr<3; ++sufr) { scalar[T3[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb]; for (smp = 0; smp<SCALE_BLOCK; ++smp) sb_sample[T3[sbgr]][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb]; } /* for(sufr..) */ } /* for(sb..) */ } else if (fr_ps->config == 202) { if (fr_ps->header->dyn_second_stereo[sbgr]) for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) { scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb]; for (sufr = 0; sufr<3; ++sufr) { scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb]; for (smp = 0; smp<SCALE_BLOCK; ++smp) sb_sample[T2[sbgr]][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb]; } /* for(sufr.). */ } /* for(sb..) */ } else if (fr_ps->config == 102) { if (fr_ps->header->dyn_second_stereo[sbgr]) for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++) { scfsi[1][sb] = scfsi_sum[T23][sb]; for (sufr = 0; sufr<3; ++sufr) { scalar[1][sufr][sb] = scalar_sum[T23][sufr][sb]; for (smp = 0; smp<SCALE_BLOCK; ++smp) sb_sample[1][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb]; } /* for(sufr.). */ } /* for(sb..) */ } } /* if(fr_ps->header->dyn_cross[sbgr] == 0) */ } /* for(sbgr=0.. */}#ifdef Augmentation_7chvoid take_dyn_cross_aug ( int aug_dyn_cr, frame_params *fr_ps, /* out: int fr_ps->header->dyn_cross_on, * int fr_ps->header->dyn_cross_LR, * int fr_ps->header->dyn_cross[SBGRS], */ double sb_sample_sum[5][3][SCALE_BLOCK][SBLIMIT], /* in, T23, T24, T34, T234, T56 */ unsigned int scalar_sum[][3][SBLIMIT], /* in */ unsigned int scfsi_sum[][SBLIMIT], /* in */ unsigned int scfsi_dyn[][SBLIMIT], /* in */ double sb_sample[CHANMAX3][3][SCALE_BLOCK][SBLIMIT], /* out */ unsigned int scalar[][3][SBLIMIT], /* out */ unsigned int scfsi[][SBLIMIT]) /* out */{ int sbgr, sb, sufr, smp; layer *info = fr_ps->header; int center = info->center; int surround = info->surround; fr_ps->header->aug_dyn_cross_on = 1; for (sbgr = LOW_SBGR; sbgr < SBGRS; sbgr++) { if (aug_dyn_cr == -1) fr_ps->header->aug_dyn_cross[sbgr] = rand () % 19; else fr_ps->header->aug_dyn_cross[sbgr] = aug_dyn_cr; /* copying sums, scf, scfsi */ if (fr_ps->header->aug_dyn_cross[sbgr] == 4) { for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb <= sb_groups[sbgr]; sb++) { scfsi[T5[sbgr]][sb] = scfsi_sum[T56][sb]; for (sufr = 0; sufr < 3; ++sufr) { scalar[T5[sbgr]][sufr][sb] = scalar_sum[T56][sufr][sb]; for (smp = 0; smp < SCALE_BLOCK; ++smp) sb_sample[T5[sbgr]][sufr][smp][sb] = sb_sample_sum[T56][sufr][smp][sb]; } } } /* scfsi_dyn in scfsi of MPEG2 channels */ /* L0 */ switch (fr_ps->header->aug_dyn_cross[sbgr]) { case 5: case 6: case 7: case 8: case 9: for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb <= sb_groups[sbgr]; sb++) scfsi[L0][sb] = scfsi_dyn[L0][sb]; break; } /* R0 */ switch (fr_ps->header->aug_dyn_cross[sbgr]) { case 1: case 6: case 11: case 15: for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb <= sb_groups[sbgr]; sb++) scfsi[R0][sb] = scfsi_dyn[R0][sb]; break; } /* T2 */ switch (fr_ps->header->aug_dyn_cross[sbgr]) { case 2: case 7: case 10: case 11: case 12: case 13: case 16: for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb <= sb_groups[sbgr]; sb++) scfsi[T2[sbgr]][sb] = scfsi_dyn[T2[sbgr]][sb]; break; } /* T3 */ switch (fr_ps->header->aug_dyn_cross[sbgr]) { case 14: case 15: case 16: case 17: case 18: for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb <= sb_groups[sbgr]; sb++) scfsi[T3[sbgr]][sb] = scfsi_dyn[T3[sbgr]][sb]; break; } /* T4 */ switch (fr_ps->header->aug_dyn_cross[sbgr]) { case 3: case 8: case 13: case 17: for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb <= sb_groups[sbgr]; sb++) scfsi[T4[sbgr]][sb] = scfsi_dyn[T4[sbgr]][sb]; break; } }}#endif/************************************************************************ * * trans_chan * * Version 1.0 94/06/27 Andreas Silzle, IRT * Version 1.1 94/10/28 Andreas Silzle, IRT * * Which channels are in the transmission channels * T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof{SBGRS] per subband group. * T2outof[] can be changed later by fr_ps->header->dyn_cross_LR. * ************************************************************************/void trans_chan (frame_params *fr_ps) /* in: int fr_ps->header->tc_alloc[SBGRS], * int fr_ps->numchan, * int fr_ps->header->matrix, 0 normal -, 3 no matricing * int fr_ps->header->dyn_cross_LR 0 out of L0, 1 out of R0 */ /* global parameters * out: T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS], T3outof[SBGRS], T4outof[SBGRS] */{ int sbgr; for (sbgr = 0; sbgr < SBGRS; sbgr++) { /* 960627 FdB tca dependent on configuration */ if (fr_ps->config == 320) { /* 3/2 */ switch(fr_ps->header->tc_alloc[sbgr]) { case 0: T2[sbgr] = C; T3[sbgr] = LS; T4[sbgr] = RS; if(fr_ps->header->dyn_cross_LR == 0) T2outof[sbgr] = L0; else T2outof[sbgr] = R0; T3outof[sbgr] = L0; T4outof[sbgr] = R0; break; case 1: T2[sbgr] = L; T3[sbgr] = LS; T4[sbgr] = RS; T2outof[sbgr] = L0; T3outof[sbgr] = L0; T4outof[sbgr] = R0; break; case 2: T2[sbgr] = R; T3[sbgr] = LS; T4[sbgr] = RS; T2outof[sbgr] = R0; T3outof[sbgr] = L0; T4outof[sbgr] = R0; break; case 3: T2[sbgr] = C; T3[sbgr] = L; T4[sbgr] = RS; if(fr_ps->header->dyn_cross_LR == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -