dyn_cross.c
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:50k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Multichannel Encoder
  4.  *
  5.  * $Id: dyn_cross.c 1.3 1996/02/12 07:13:35 rowlands Exp $
  6.  *
  7.  * $Log: dyn_cross.c $
  8.  * Revision 1.3  1996/02/12 07:13:35  rowlands
  9.  * Release following Munich meeting
  10.  *
  11.  **********************************************************************/
  12. #include "common.h"
  13. #include "encoder.h"
  14. /************************************************************************
  15.  *
  16.  * take_dyn_cross
  17.  *
  18.  * Version 1.0     94/10/24 Andreas Silzle, IRT
  19.  *
  20.  * Copy the sums, scf, scfsi, if required, in the normal positions.
  21.  *
  22.  ************************************************************************/
  23. /* #define LOW_SBGR 5 original value 960619 FdB */
  24. #define LOW_SBGR 0   /* lowest subbandgroup, in which dyn_cross is done.*/
  25.     /* All sb-groups under that boarder are not        */
  26.     /* affected by dyn_cross        */
  27. void take_dyn_cross (
  28. int dyn_cr,
  29. frame_params *fr_ps,       
  30.     /* out: int fr_ps->header->dyn_cross_on, 
  31.      *     int fr_ps->header->dyn_cross_LR, 
  32.           *     int fr_ps->header->dyn_cross[SBGRS],     
  33.      */     
  34. double sb_sample_sum[5][3][SCALE_BLOCK][SBLIMIT],      
  35.     /* in, T23, T24, T34, T234, T56 */
  36. unsigned int scalar_sum[][3][SBLIMIT],  /* in */ 
  37. unsigned int scfsi_sum[][SBLIMIT],   /* in */
  38. unsigned int scfsi_dyn[][SBLIMIT],   /* in */
  39. double sb_sample[CHANMAX3][3][SCALE_BLOCK][SBLIMIT], /* out */
  40. unsigned int scalar[][3][SBLIMIT],  /* out */ 
  41. unsigned int scfsi[][SBLIMIT])  /* out */
  42. {
  43.     int     sbgr, sb, sufr, smp, dyn_second_stereo = 0;
  44.     layer *info  = fr_ps->header;
  45.     int center   = info->center;
  46.     int surround = info->surround;
  47.     fr_ps->header->dyn_cross_on = 0;
  48.     if (fr_ps->header->dyn_cross_LR && (fr_ps->config == 302 || fr_ps->config == 202 || fr_ps->config == 102))
  49. dyn_second_stereo = 1;
  50. /*    printf ("dyn_cr: %2dn", dyn_cr); */
  51.     for (sbgr = LOW_SBGR; sbgr < SBGRS; sbgr++)
  52.     {
  53. /* signalization */
  54. if (dyn_cr == 0 && dyn_second_stereo == 0)
  55. {
  56.     fr_ps->header->dyn_cross[sbgr] = 0;
  57.     fr_ps->header->dyn_second_stereo[sbgr] = 0;
  58. }
  59. else
  60. {
  61.     fr_ps->header->dyn_cross_on = 1;
  62.     /* original value 960619 FdB */ 
  63.     /* fr_ps->header->dyn_cross[sbgr] = dyn_cr; */
  64.     /* systematic variation of dynamic crosstalk over all subbands */
  65.     if (dyn_cr == -1)
  66.     {
  67. switch (fr_ps->config)
  68. {
  69.     case 320: fr_ps->header->dyn_cross[sbgr] = rand () % 15;
  70. break;
  71.     case 310:
  72.     case 220: fr_ps->header->dyn_cross[sbgr] = rand () % 5;
  73. break;
  74.     case 300:
  75.     case 302:
  76.     case 210: fr_ps->header->dyn_cross[sbgr] = rand () % 2;
  77. break;
  78.     default: fr_ps->header->dyn_cross[sbgr] = 0;
  79. break;
  80. }
  81.     }
  82.     else
  83. fr_ps->header->dyn_cross[sbgr] = dyn_cr;
  84.     fr_ps->header->dyn_second_stereo[sbgr] = dyn_second_stereo;
  85. /*
  86.             printf ("sbgr: %2d dyn_cr: %2d dyn_2nd_st: %2dn",
  87.          sbgr, fr_ps->header->dyn_cross[sbgr],
  88.     fr_ps->header->dyn_second_stereo[sbgr]);
  89. */
  90.     /* copying sums, scf, scfsi */
  91.     
  92.     /* 960627 FdB DynX dependent on configuration */
  93.     if (fr_ps->config == 320)
  94.     {
  95. /* 3/2 */
  96. if(fr_ps->header->dyn_cross[sbgr] == 9 || fr_ps->header->dyn_cross[sbgr] == 11) {
  97.     T3from[sbgr] = T2[sbgr];
  98.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  99.     sb<=sb_groups[sbgr]; sb++) {
  100. scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb];
  101. for(sufr = 0; sufr<3; ++sufr) {
  102.     scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb];
  103.     for(smp = 0; smp<SCALE_BLOCK; ++smp) {
  104. sb_sample[T2[sbgr]][sufr][smp][sb] = 
  105.     sb_sample_sum[T23][sufr][smp][sb];
  106.     }   /* for(smp..) */
  107. }     /* for(sufr.). */
  108.     }     /* for(sb..) */
  109. else if(fr_ps->header->dyn_cross[sbgr] == 10 || fr_ps->header->dyn_cross[sbgr] == 12) {
  110.     T4from[sbgr] = T2[sbgr];
  111.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  112.     sb<=sb_groups[sbgr]; sb++) {
  113. scfsi[T2[sbgr]][sb] = scfsi_sum[T24][sb];
  114. for(sufr = 0; sufr<3; ++sufr) {
  115.     scalar[T2[sbgr]][sufr][sb] = scalar_sum[T24][sufr][sb];
  116.     for(smp = 0; smp<SCALE_BLOCK; ++smp) {
  117. sb_sample[T2[sbgr]][sufr][smp][sb] = 
  118.     sb_sample_sum[T24][sufr][smp][sb];
  119.     }   /* for(smp..) */
  120. }     /* for(sufr..) */
  121.     }     /* for(sb..) */
  122. else if(fr_ps->header->dyn_cross[sbgr] == 8 || fr_ps->header->dyn_cross[sbgr] == 13) {
  123.     T4from[sbgr] = T3[sbgr];
  124.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  125.     sb<=sb_groups[sbgr]; sb++) {
  126. scfsi[T3[sbgr]][sb] = scfsi_sum[T34][sb];
  127. for(sufr = 0; sufr<3; ++sufr) {
  128.     scalar[T3[sbgr]][sufr][sb] = scalar_sum[T34][sufr][sb];
  129.     for(smp = 0; smp<SCALE_BLOCK; ++smp) {
  130. sb_sample[T3[sbgr]][sufr][smp][sb] = 
  131.     sb_sample_sum[T34][sufr][smp][sb];
  132.     }   /* for(smp..) */
  133. }     /* for(sufr..) */
  134.     }     /* for(sb..) */
  135. else if(fr_ps->header->dyn_cross[sbgr] == 14) {
  136.     T3from[sbgr] = T4from[sbgr] = T2[sbgr];
  137.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  138.     sb<=sb_groups[sbgr]; sb++) {
  139. scfsi[T2[sbgr]][sb] = scfsi_sum[T234][sb];
  140. for(sufr = 0; sufr<3; ++sufr) {
  141.     scalar[T2[sbgr]][sufr][sb] = scalar_sum[T234][sufr][sb];
  142.     for(smp = 0; smp<SCALE_BLOCK; ++smp) {
  143. sb_sample[T2[sbgr]][sufr][smp][sb] = 
  144.     sb_sample_sum[T234][sufr][smp][sb];
  145.     }   /* for(smp..) */
  146. }     /* for(sufr..) */
  147.     }     /* for(sb..) */
  148. }     /* if(dyncr_do[sbgr]..) */
  149. /* scfsi_dyn in scfsi of L0 and R0 */
  150. /* T2 */
  151. switch(fr_ps->header->dyn_cross[sbgr]) {
  152.       case 3: case 5: case 6: case 7: case 13:
  153.     T2from[sbgr] = T2outof[sbgr];
  154.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  155.     sb<=sb_groups[sbgr]; sb++) 
  156. scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb];
  157.     break;     
  158. } /* switch(dyncr_do[sbgr]) */
  159. /* T3 */
  160. switch(fr_ps->header->dyn_cross[sbgr]) {
  161.       case 2: case 4: case 6: case 7: case 12:
  162.     T3from[sbgr] = T3outof[sbgr];
  163.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  164.     sb<=sb_groups[sbgr]; sb++) 
  165. scfsi[L0][sb] = scfsi_dyn[L0][sb];
  166.     break;     
  167. } /* switch(dyncr_do[sbgr]) */
  168. /* T4 */
  169. switch(fr_ps->header->dyn_cross[sbgr]) {
  170.       case 1: case 4: case 5: case 7: case 11:
  171.     T4from[sbgr] = T4outof[sbgr];
  172.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  173.     sb<=sb_groups[sbgr]; sb++) 
  174. scfsi[R0][sb] = scfsi_dyn[R0][sb];
  175.     break;     
  176. } /* switch(fr_ps->header->dyn_cross[sbgr]) */
  177.     }
  178.     else if (fr_ps->config == 310 || fr_ps->config == 220)
  179.     {
  180. /* 3/1 and 2/2 */
  181. if(fr_ps->header->dyn_cross[sbgr] == 4) {
  182.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  183.     sb<=sb_groups[sbgr]; sb++) {
  184. scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb];
  185. for(sufr = 0; sufr<3; ++sufr) {
  186.     scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb];
  187.     for(smp = 0; smp<SCALE_BLOCK; ++smp) {
  188. sb_sample[T2[sbgr]][sufr][smp][sb] = 
  189.     sb_sample_sum[T23][sufr][smp][sb];
  190.     }   /* for(smp..) */
  191. }     /* for(sufr.). */
  192.     }     /* for(sb..) */
  193.     
  194. /* scfsi_dyn in scfsi of L0 and R0 */
  195. /* T2 */
  196. switch(fr_ps->header->dyn_cross[sbgr]) {
  197.       case 2: case 3:
  198.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  199.     sb<=sb_groups[sbgr]; sb++) 
  200. scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb];
  201.     break;     
  202. } /* switch(dyncr_do[sbgr]) */
  203. /* T3 */
  204. switch(fr_ps->header->dyn_cross[sbgr]) {
  205.       case 1: case 3:
  206.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  207.     sb<=sb_groups[sbgr]; sb++) 
  208. scfsi[T3outof[sbgr]][sb] = scfsi_dyn[T3outof[sbgr]][sb];
  209.     break;     
  210. } /* switch(dyncr_do[sbgr]) */
  211.     }
  212.     else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
  213.     {
  214. /* 3/0 (+2/0) and 2/1 */
  215. /* scfsi_dyn in scfsi of L0 and R0 */
  216. /* T2 */
  217. switch(fr_ps->header->dyn_cross[sbgr]) {
  218.       case 1:
  219.     for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  220.     sb<=sb_groups[sbgr]; sb++) 
  221. scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb];
  222.     break;     
  223. } /* switch(dyncr_do[sbgr]) */
  224.     
  225. if (fr_ps->header->dyn_second_stereo[sbgr])
  226.     for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++)
  227.     {
  228. scfsi[T3[sbgr]][sb] = scfsi_sum[T23][sb];
  229. for (sufr = 0; sufr<3; ++sufr)
  230. {
  231.     scalar[T3[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb];
  232.     for (smp = 0; smp<SCALE_BLOCK; ++smp)
  233. sb_sample[T3[sbgr]][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb];
  234. }     /* for(sufr..) */
  235.     }     /* for(sb..) */
  236.     }
  237.     else if (fr_ps->config == 202)
  238.     {
  239. if (fr_ps->header->dyn_second_stereo[sbgr])
  240.     for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++)
  241.     {
  242. scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb];
  243. for (sufr = 0; sufr<3; ++sufr)
  244. {
  245.     scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb];
  246.     for (smp = 0; smp<SCALE_BLOCK; ++smp)
  247. sb_sample[T2[sbgr]][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb];
  248. }     /* for(sufr.). */
  249.     }     /* for(sb..) */
  250.     }
  251.     else if (fr_ps->config == 102)
  252.     {
  253. if (fr_ps->header->dyn_second_stereo[sbgr])
  254.     for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++)
  255.     {
  256. scfsi[1][sb] = scfsi_sum[T23][sb];
  257. for (sufr = 0; sufr<3; ++sufr)
  258. {
  259.     scalar[1][sufr][sb] = scalar_sum[T23][sufr][sb];
  260.     for (smp = 0; smp<SCALE_BLOCK; ++smp)
  261. sb_sample[1][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb];
  262. }     /* for(sufr.). */
  263.     }     /* for(sb..) */
  264.     }
  265. } /* if(fr_ps->header->dyn_cross[sbgr] == 0) */
  266.     } /* for(sbgr=0.. */
  267. }
  268. #ifdef Augmentation_7ch
  269. void take_dyn_cross_aug (
  270. int aug_dyn_cr,
  271. frame_params *fr_ps,       
  272.     /* out: int fr_ps->header->dyn_cross_on, 
  273.      *     int fr_ps->header->dyn_cross_LR, 
  274.           *     int fr_ps->header->dyn_cross[SBGRS],     
  275.      */     
  276. double sb_sample_sum[5][3][SCALE_BLOCK][SBLIMIT],      
  277.     /* in, T23, T24, T34, T234, T56 */
  278. unsigned int scalar_sum[][3][SBLIMIT],  /* in */ 
  279. unsigned int scfsi_sum[][SBLIMIT],   /* in */
  280. unsigned int scfsi_dyn[][SBLIMIT],   /* in */
  281. double sb_sample[CHANMAX3][3][SCALE_BLOCK][SBLIMIT], /* out */
  282. unsigned int scalar[][3][SBLIMIT],  /* out */ 
  283. unsigned int scfsi[][SBLIMIT])  /* out */
  284. {
  285.     int     sbgr, sb, sufr, smp;
  286.     layer *info  = fr_ps->header;
  287.     int center   = info->center;
  288.     int surround = info->surround;
  289.     fr_ps->header->aug_dyn_cross_on = 1;
  290.     for (sbgr = LOW_SBGR; sbgr < SBGRS; sbgr++)
  291.     {
  292. if (aug_dyn_cr == -1)
  293.     fr_ps->header->aug_dyn_cross[sbgr] = rand () % 19;
  294. else
  295.     fr_ps->header->aug_dyn_cross[sbgr] = aug_dyn_cr;
  296. /* copying sums, scf, scfsi */
  297. if (fr_ps->header->aug_dyn_cross[sbgr] == 4)
  298. {
  299.     for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  300.     sb <= sb_groups[sbgr]; sb++)
  301.     {
  302. scfsi[T5[sbgr]][sb] = scfsi_sum[T56][sb];
  303. for (sufr = 0; sufr < 3; ++sufr)
  304. {
  305.     scalar[T5[sbgr]][sufr][sb] = scalar_sum[T56][sufr][sb];
  306.     for (smp = 0; smp < SCALE_BLOCK; ++smp)
  307. sb_sample[T5[sbgr]][sufr][smp][sb] = 
  308.     sb_sample_sum[T56][sufr][smp][sb];
  309. }
  310.     }
  311. }
  312. /* scfsi_dyn in scfsi of MPEG2 channels */
  313. /* L0 */
  314. switch (fr_ps->header->aug_dyn_cross[sbgr])
  315. {
  316. case 5: case 6: case 7: case 8: case 9:
  317.       for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  318.       sb <= sb_groups[sbgr]; sb++) 
  319.   scfsi[L0][sb] = scfsi_dyn[L0][sb];
  320.       break;     
  321. }
  322. /* R0 */
  323. switch (fr_ps->header->aug_dyn_cross[sbgr])
  324. {
  325. case 1: case 6: case 11: case 15:
  326.       for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  327.       sb <= sb_groups[sbgr]; sb++) 
  328.   scfsi[R0][sb] = scfsi_dyn[R0][sb];
  329.       break;     
  330. }
  331. /* T2 */
  332. switch (fr_ps->header->aug_dyn_cross[sbgr])
  333. {
  334. case 2: case 7: case 10: case 11: case 12: case 13: case 16:
  335.       for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  336.       sb <= sb_groups[sbgr]; sb++) 
  337.   scfsi[T2[sbgr]][sb] = scfsi_dyn[T2[sbgr]][sb];
  338.       break;     
  339. }
  340. /* T3 */
  341. switch (fr_ps->header->aug_dyn_cross[sbgr])
  342. {
  343. case 14: case 15: case 16: case 17: case 18:
  344.       for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  345.       sb <= sb_groups[sbgr]; sb++) 
  346.   scfsi[T3[sbgr]][sb] = scfsi_dyn[T3[sbgr]][sb];
  347.       break;     
  348. }
  349. /* T4 */
  350. switch (fr_ps->header->aug_dyn_cross[sbgr])
  351. {
  352. case 3: case 8: case 13: case 17:
  353.       for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  354.       sb <= sb_groups[sbgr]; sb++) 
  355.   scfsi[T4[sbgr]][sb] = scfsi_dyn[T4[sbgr]][sb];
  356.       break;     
  357. }
  358.     }
  359. }
  360. #endif
  361. /************************************************************************
  362.  *
  363.  * trans_chan
  364.  *
  365.  * Version 1.0     94/06/27 Andreas Silzle, IRT
  366.  * Version 1.1     94/10/28 Andreas Silzle, IRT
  367.  *
  368.  * Which channels are in the transmission channels 
  369.  * T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof{SBGRS] per subband group.
  370.  * T2outof[] can be changed later by fr_ps->header->dyn_cross_LR.
  371.  *
  372.  ************************************************************************/
  373. void trans_chan (frame_params *fr_ps)      
  374.     /* in:  int fr_ps->header->tc_alloc[SBGRS], 
  375.           *     int fr_ps->numchan,     
  376.      *     int fr_ps->header->matrix,     0 normal -, 3 no matricing 
  377.      *     int fr_ps->header->dyn_cross_LR  0 out of L0, 1 out of R0
  378.      */     
  379. /*  global parameters
  380.  *  out:    T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS], T3outof[SBGRS], T4outof[SBGRS]
  381.  */
  382. {  
  383.     int sbgr;
  384.     for (sbgr = 0; sbgr < SBGRS; sbgr++)
  385.     {
  386. /* 960627 FdB tca dependent on configuration */
  387. if (fr_ps->config == 320)
  388. {
  389.     /* 3/2 */
  390.     switch(fr_ps->header->tc_alloc[sbgr]) {
  391.   case 0:
  392. T2[sbgr] = C; T3[sbgr] = LS; T4[sbgr] = RS;
  393. if(fr_ps->header->dyn_cross_LR == 0)
  394.     T2outof[sbgr] = L0;
  395. else
  396.     T2outof[sbgr] = R0;
  397. T3outof[sbgr] = L0;
  398. T4outof[sbgr] = R0;
  399. break;
  400.   case 1:
  401. T2[sbgr] = L; T3[sbgr] = LS; T4[sbgr] = RS;
  402. T2outof[sbgr] = L0;
  403. T3outof[sbgr] = L0;
  404. T4outof[sbgr] = R0;
  405. break;
  406.   case 2:
  407. T2[sbgr] = R; T3[sbgr] = LS; T4[sbgr] = RS;
  408. T2outof[sbgr] = R0;
  409. T3outof[sbgr] = L0;
  410. T4outof[sbgr] = R0;
  411. break;
  412.   case 3:
  413. T2[sbgr] = C; T3[sbgr] = L; T4[sbgr] = RS;
  414. if(fr_ps->header->dyn_cross_LR == 0)
  415.     T2outof[sbgr] = L0;
  416. else
  417.     T2outof[sbgr] = R0;
  418. T3outof[sbgr] = L0;
  419. T4outof[sbgr] = R0;
  420. break;
  421.   case 4:
  422. T2[sbgr] = C; T3[sbgr] = LS; T4[sbgr] = R;
  423. if(fr_ps->header->dyn_cross_LR == 0)
  424.     T2outof[sbgr] = L0;
  425. else
  426.     T2outof[sbgr] = R0;
  427. T3outof[sbgr] = L0;
  428. T4outof[sbgr] = R0;
  429. break;
  430.   case 5:
  431. T2[sbgr] = C; T3[sbgr] = L; T4[sbgr] = R;
  432. if(fr_ps->header->dyn_cross_LR == 0)
  433.     T2outof[sbgr] = L0;
  434. else
  435.     T2outof[sbgr] = R0;
  436. T3outof[sbgr] = L0;
  437. T4outof[sbgr] = R0;
  438. break;
  439.   case 6:
  440. T2[sbgr] = R; T3[sbgr] = L; T4[sbgr] = RS;
  441. T2outof[sbgr] = R0;
  442. T3outof[sbgr] = L0;
  443. T4outof[sbgr] = R0;
  444. break;
  445.   case 7:
  446. T2[sbgr] = L; T3[sbgr] = LS; T4[sbgr] = R;
  447. T2outof[sbgr] = L0;
  448. T3outof[sbgr] = L0;
  449. T4outof[sbgr] = R0;
  450. break;
  451.     } /* switch() */
  452. }
  453. else if (fr_ps->config == 310)
  454. {
  455.     /* 3/1 */
  456.     switch(fr_ps->header->tc_alloc[sbgr]) {
  457.   case 0:
  458. T2[sbgr] = 2;
  459. T3[sbgr] = 3;
  460. if(fr_ps->header->dyn_cross_LR == 0)
  461.     T2outof[sbgr] = T3outof[sbgr] = L0;
  462. else
  463.     T2outof[sbgr] = T3outof[sbgr] = R0;
  464. break;
  465.   case 1:
  466. T2[sbgr] = L;
  467. T3[sbgr] = 3;
  468. T2outof[sbgr] = L0;
  469. if(fr_ps->header->dyn_cross_LR == 0)
  470.     T3outof[sbgr] = L0;
  471. else
  472.     T3outof[sbgr] = R0;
  473. break;
  474.   case 2:
  475. T2[sbgr] = R;
  476. T3[sbgr] = 3;
  477. T2outof[sbgr] = R0;
  478. if(fr_ps->header->dyn_cross_LR == 0)
  479.     T3outof[sbgr] = L0;
  480. else
  481.     T3outof[sbgr] = R0;
  482. break;
  483.   case 3:
  484. T2[sbgr] = 2;
  485. T3[sbgr] = L;
  486. if(fr_ps->header->dyn_cross_LR == 0)
  487.     T2outof[sbgr] = L0;
  488. else
  489.     T2outof[sbgr] = R0;
  490. T3outof[sbgr] = L0;
  491. break;
  492.   case 4:
  493. T2[sbgr] = 2;
  494. T3[sbgr] = R;
  495. if(fr_ps->header->dyn_cross_LR == 0)
  496.     T2outof[sbgr] = L0;
  497. else
  498.     T2outof[sbgr] = R0;
  499. T3outof[sbgr] = R0;
  500. break;
  501.   case 5:
  502. T2[sbgr] = L;
  503. T3[sbgr] = R;
  504. T2outof[sbgr] = L0;
  505. T3outof[sbgr] = R0;
  506. break;
  507.     } /* switch() */
  508. }
  509. else if (fr_ps->config == 220)
  510. {
  511.     /* 2/2 */
  512.     switch(fr_ps->header->tc_alloc[sbgr]) {
  513.   case 0:
  514. T2[sbgr] = 2; T3[sbgr] = 3;
  515. break;
  516.   case 1:
  517. T2[sbgr] = L; T3[sbgr] = 3;
  518. break;
  519.   case 2:
  520. T2[sbgr] = 2; T3[sbgr] = R;
  521. break;
  522.   case 3:
  523. T2[sbgr] = L; T3[sbgr] = R;
  524. break;
  525.     } /* switch() */
  526.     T2outof[sbgr] = L0;
  527.     T3outof[sbgr] = R0;
  528. }
  529. else if (fr_ps->config == 300 || fr_ps->config == 302)
  530. {
  531.     /* 3/0 (+ 2/0) */
  532.     switch(fr_ps->header->tc_alloc[sbgr]) {
  533.   case 0:
  534. T2[sbgr] = 2;
  535. if(fr_ps->header->dyn_cross_LR == 0)
  536.     T2outof[sbgr] = L0;
  537. else
  538.     T2outof[sbgr] = R0;
  539. break;
  540.   case 1:
  541. T2[sbgr] = L;
  542. T2outof[sbgr] = L0;
  543. break;
  544.   case 2:
  545. T2[sbgr] = R;
  546. T2outof[sbgr] = R0;
  547. break;
  548.     } /* switch() */
  549. }
  550. else if (fr_ps->config == 210)
  551. {
  552.     /* 2/1 */
  553.     switch(fr_ps->header->tc_alloc[sbgr]) {
  554.   case 0:
  555. T2[sbgr] = 2;
  556. if(fr_ps->header->dyn_cross_LR == 0)
  557.     T2outof[sbgr] = L0;
  558. else
  559.     T2outof[sbgr] = R0;
  560. break;
  561.   case 1:
  562. T2[sbgr] = L;
  563. T2outof[sbgr] = L0;
  564. break;
  565.   case 2:
  566. T2[sbgr] = R;
  567. T2outof[sbgr] = R0;
  568. break;
  569.     } /* switch() */
  570. }
  571. if (fr_ps->config == 302)
  572. {
  573.     /* 3/0 + 2/0 */
  574.     T3[sbgr] = 3; 
  575.     T4[sbgr] = 4; 
  576.     T4outof[sbgr] = 3;
  577. }
  578. else if (fr_ps->config == 202)
  579. {
  580.     /* 2/0 + 2/0 */
  581.     T2[sbgr] = 2; 
  582.     T3[sbgr] = 3; 
  583.     T3outof[sbgr] = 2;
  584. }
  585. else if (fr_ps->config == 102)
  586. {
  587.     /* 1/0 + 2/0 */
  588.     T2[sbgr] = 2; 
  589.     T2outof[sbgr] = 1;
  590. }
  591.     } /* for(sbgr.. */
  592. }
  593. #ifdef Augmentation_7ch
  594. void trans_chan_aug (frame_params *fr_ps)      
  595.     /* in:  int fr_ps->header->tc_alloc[SBGRS], 
  596.           *     int fr_ps->numchan,     
  597.      *     int fr_ps->header->matrix,     0 normal -, 3 no matricing 
  598.      *     int fr_ps->header->dyn_cross_LR  0 out of L0, 1 out of R0
  599.      */     
  600. /*  global parameters
  601.  *  out:    T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS], T3outof[SBGRS], T4outof[SBGRS]
  602.  */
  603. {  
  604.     int sbgr;
  605.     for (sbgr = 0; sbgr < SBGRS; sbgr++)
  606.     {
  607. /* 5/2 */
  608. switch (fr_ps->header->aug_tc_alloc[sbgr])
  609. {
  610. case 0:
  611.       T5[sbgr] = LC;
  612.       T6[sbgr] = RC;
  613.       break;
  614. case 1:
  615.       T5[sbgr] = L7;
  616.       T6[sbgr] = RC;
  617.       break;
  618. case 2:
  619.       T5[sbgr] = LC;
  620.       T6[sbgr] = R7;
  621.       break;
  622. case 3:
  623.       T5[sbgr] = L7;
  624.       T6[sbgr] = R7;
  625.       break;
  626. case 4:
  627.       T5[sbgr] = LC;
  628.       T6[sbgr] = C7;
  629.       break;
  630. case 5:
  631.       T5[sbgr] = L7;
  632.       T6[sbgr] = C7;
  633.       break;
  634. case 6:
  635.       T5[sbgr] = C7;
  636.       T6[sbgr] = RC;
  637.       break;
  638. case 7:
  639.       T5[sbgr] = C7;
  640.       T6[sbgr] = R7;
  641.       break;
  642. } /* switch() */
  643.     }
  644. }
  645. #endif
  646. /************************************************************************
  647.  *
  648.  * combine
  649.  *
  650.  * Version 1.0     94/06/27 Andreas Silzle, IRT
  651.  *
  652.  * Add two channels into a mono channel to use it in dynamic crosstalk.
  653.  *
  654.  ************************************************************************/
  655. void combine ( 
  656. frame_params *fr_ps,      
  657.     /* in:  int fr_ps->header->tc_alloc[SBGRS], 
  658.      *     int fr_ps->sblimit,
  659.      */
  660. double sb_sample[CHANMAX3][3][SCALE_BLOCK][SBLIMIT], /* in */
  661. double sb_sample_sum[5][3][SCALE_BLOCK][SBLIMIT]) 
  662.     /* out; T23, T24, T34, T234, T56 */
  663. {  
  664. /*  global parameters
  665.  *  in: T2[SBGRS], T3[SBGRS], T4[SBGRS]
  666.  *      sb_groups[SBGRS]
  667.  */
  668.     int sb, sbgr, smp, sufr;
  669.     for (sbgr=0; sbgr < SBGRS; sbgr++)
  670.     {
  671. for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  672. sb <= sb_groups[sbgr]; sb++)
  673. {
  674.     for (smp = 0; smp < SCALE_BLOCK; smp++)
  675.     {
  676. for (sufr = 0; sufr < 3; ++sufr)
  677. {
  678.     if (fr_ps->config == 320 || fr_ps->config == 310 || fr_ps->config == 220 || fr_ps->config == 202)
  679. sb_sample_sum[T23][sufr][smp][sb] = 
  680.     .5 * (sb_sample[T2[sbgr]][sufr][smp][sb]
  681. + sb_sample[T3[sbgr]][sufr][smp][sb]);
  682.     else if (fr_ps->config == 102)
  683. sb_sample_sum[T23][sufr][smp][sb] = 
  684.     .5 * (sb_sample[1       ][sufr][smp][sb]
  685. + sb_sample[T2[sbgr]][sufr][smp][sb]);
  686.     else if (fr_ps->config == 302)
  687. sb_sample_sum[T23][sufr][smp][sb] = 
  688.     .5 * (sb_sample[T3[sbgr]][sufr][smp][sb]
  689. + sb_sample[T4[sbgr]][sufr][smp][sb]);
  690.     if (fr_ps->config == 320)
  691.     {
  692. sb_sample_sum[T24][sufr][smp][sb] = 
  693.     .5 * (sb_sample[T2[sbgr]][sufr][smp][sb]
  694. + sb_sample[T4[sbgr]][sufr][smp][sb]);
  695. sb_sample_sum[T34][sufr][smp][sb] = 
  696.     .5 * (sb_sample[T3[sbgr]][sufr][smp][sb]
  697. + sb_sample[T4[sbgr]][sufr][smp][sb]);
  698. sb_sample_sum[T234][sufr][smp][sb] = 
  699.     .333333 * (sb_sample[T2[sbgr]][sufr][smp][sb]
  700. + sb_sample[T3[sbgr]][sufr][smp][sb]
  701. + sb_sample[T4[sbgr]][sufr][smp][sb]);
  702.     }
  703. }   /* for(sufr.. */
  704.     }     /* for(smp.. */
  705. }     /* for(sb.. */
  706.     }     /* for(sbgr.. */
  707. }
  708. #ifdef Augmentation_7ch
  709. void combine_aug ( 
  710. frame_params *fr_ps,      
  711.     /* in:  int fr_ps->header->tc_alloc[SBGRS], 
  712.      *     int fr_ps->sblimit,
  713.      */
  714. double sb_sample[CHANMAX3][3][SCALE_BLOCK][SBLIMIT], /* in */
  715. double sb_sample_sum[5][3][SCALE_BLOCK][SBLIMIT]) 
  716.     /* out; T23, T24, T34, T234, T56 */
  717. {  
  718. /*  global parameters
  719.  *  in: T2[SBGRS], T3[SBGRS], T4[SBGRS]
  720.  *      sb_groups[SBGRS]
  721.  */
  722.     int sb, sbgr, smp, sufr;
  723.     for (sbgr = 0; sbgr < SBGRS; sbgr++)
  724.     {
  725. for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
  726. sb <= sb_groups[sbgr]; sb++)
  727. {
  728.     for (smp = 0; smp < SCALE_BLOCK; smp++)
  729.     {
  730. for (sufr = 0; sufr < 3; ++sufr)
  731. {
  732.     sb_sample_sum[T56][sufr][smp][sb] = 
  733. .5 * (sb_sample[T5[sbgr]][sufr][smp][sb]
  734.     + sb_sample[T6[sbgr]][sufr][smp][sb]);
  735. }   /* for (sufr.. */
  736.     }     /* for (smp.. */
  737. }     /* for (sb.. */
  738.     }     /* for (sbgr.. */
  739. }
  740. #endif
  741. /****************************************************************************
  742.  *
  743.  *  void dyn_bal
  744.  *
  745.  *  Add the bits for scf and scfsi of the channel with dynamic crosstalk
  746.  *  in the case of min_ch is L0 and R0.
  747.  *
  748.  *  07/94 Susanne Ritscher
  749.  *  94/10/28 Andreas Silzle     little remake
  750.  *
  751.  *****************************************************************************/
  752. void dyn_bal (
  753. unsigned int scfsi[CHANMAX3][SBLIMIT],   /* in */ 
  754. int sbgr,     /* in */
  755. frame_params *fr_ps,
  756.     /* in:  fr_ps->header->dyn_cross[sbgr] */
  757. int min_ch,     /* in */
  758. int min_sb,     /* in */
  759. int *seli,     /* in, out */
  760. int *scale)     /* in, out */
  761. {
  762. /*  global parameters
  763.  *  in: T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS], T3outof[SBGRS], T4outof[SBGRS]
  764.  */
  765.     static int sfsPerScfsi[] = { 3,2,1,2 };    /* lookup # sfs per scfsi */
  766.     layer *info  = fr_ps->header;
  767.     int center   = info->center;
  768.     int surround = info->surround;
  769.     /* 960627 FdB DynX dependent on configuration */
  770.     if (fr_ps->config == 320)
  771.     {
  772. /* 3/2 */
  773. switch (fr_ps->header->dyn_cross[sbgr]) {
  774.       case 0:
  775.     break;     /* no additional scf and scfsi */
  776.       case 1:  
  777.     if (min_ch == R0) {
  778. *seli += 2;
  779. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  780.     }
  781.     break;
  782.       case 2:  
  783.     if (min_ch == L0) {
  784. *seli += 2;
  785. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  786.     }
  787.     break;
  788.       case 3: 
  789.     if (min_ch == T2outof[sbgr] && (center != 3 || sbgr < 10)) {
  790. *seli += 2;
  791. *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  792.     }
  793.     break;
  794.       case 4: 
  795.     if (min_ch == L0) {
  796. *seli += 2;
  797. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  798.     }
  799.     if (min_ch == R0) {
  800. *seli += 2;
  801. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  802.     }
  803.     break;
  804.       case 5:  
  805.     if (min_ch == T2outof[sbgr] && (center != 3 || sbgr < 10)) {
  806. *seli += 2;
  807. *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  808.     }
  809.     if (min_ch == R0) {
  810. *seli += 2;
  811. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  812.     }
  813.     break;
  814.       case 6: 
  815.     if (min_ch == T2outof[sbgr] && (center != 3 || sbgr < 10)) {
  816. *seli += 2;
  817. *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  818.     }
  819.     if (min_ch == L0) {
  820. *seli += 2;
  821. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  822.     }
  823.     break;
  824.       case 7: 
  825.     if (min_ch == T2outof[sbgr] && (center != 3 || sbgr < 10)) {
  826. *seli += 2;
  827. *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  828.     }
  829.     if (min_ch == L0) {
  830. *seli += 2;
  831. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  832.     }
  833.     if (min_ch == R0) {
  834. *seli += 2;
  835. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  836.     }
  837.     break;
  838.       case 8:
  839.     if (min_ch == T3[sbgr]) {
  840. *seli += 2;
  841. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  842.     }
  843.     break;
  844.       case 9:  
  845.     if (min_ch == T2[sbgr]) {
  846. *seli += 2;
  847. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  848.     }
  849.     break;
  850.       case 10:  
  851.     if (min_ch == T2[sbgr]) {
  852. *seli += 2;
  853. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  854.     }
  855.     break;
  856.       case 11:  
  857.     if (min_ch == T2[sbgr]) {
  858. *seli += 2;
  859. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  860.     }
  861.     if (min_ch == R0) {
  862. *seli += 2;
  863. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  864.     }
  865.     break;
  866.       case 12:  
  867.     if (min_ch == T2[sbgr]) {
  868. *seli += 2;
  869. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  870.     }
  871.     if (min_ch == L0) {
  872. *seli += 2;
  873. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  874.     }
  875.     break;
  876.       case 13:  
  877.     if (min_ch == T2outof[sbgr] && (center != 3 || sbgr < 10)) {
  878. *seli += 2;
  879. *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  880.     }
  881.     if (min_ch == T3[sbgr]) {
  882. *seli += 2;
  883. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  884.     }
  885.     break;
  886.       case 14:  
  887.     if (min_ch == T2[sbgr]) {
  888. *seli += 4;
  889. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  890. *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  891.     }
  892.     break;
  893.       case 15: 
  894.     fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!n");
  895.     fflush(stderr);
  896.     exit(0);
  897.     break;
  898. }     /* switch.. */
  899.     }
  900.     else if (fr_ps->config == 310 || fr_ps->config == 220)
  901.     {
  902. /* 3/1 and 2/2 */
  903. switch (fr_ps->header->dyn_cross[sbgr]) {
  904.       case 0:
  905.     break;     /* no additional scf and scfsi */
  906.       case 1:  
  907.     if (min_ch == T3outof[sbgr]) {
  908. *seli += 2;
  909. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  910.     }
  911.     break;
  912.       case 2:  
  913.     if (min_ch == T2outof[sbgr] && (center != 3 || sbgr < 10)) {
  914. *seli += 2;
  915. *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  916.     }
  917.     break;
  918.       case 3: 
  919.     if (min_ch == T2outof[sbgr] && (center != 3 || sbgr < 10)) {
  920. *seli += 2;
  921. *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  922.     }
  923.     if (min_ch == T3outof[sbgr]) {
  924. *seli += 2;
  925. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  926.     }
  927.     break;
  928.       case 4:  
  929.     if (min_ch == T2[sbgr]) {
  930. *seli += 2;
  931. *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  932.     }
  933.     break;
  934.       default: 
  935.     fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!n");
  936.     fflush(stderr);
  937.     exit(0);
  938.     break;
  939. }     /* switch.. */
  940.     }
  941.     else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
  942.     {
  943. /* 3/0 (+2/0) and 2/1 */
  944. switch(fr_ps->header->dyn_cross[sbgr]) {
  945.       case 0:
  946.     break;     /* no additional scf and scfsi */
  947.       case 1:  
  948.     if (min_ch == T2outof[sbgr] && (center != 3 || sbgr < 10)) {
  949. *seli += 2;
  950. *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  951.     }
  952.     break;
  953.       default: 
  954.     fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!n");
  955.     fflush(stderr);
  956.     exit(0);
  957.     break;
  958. }     /* switch.. */
  959.     
  960. if (fr_ps->config == 302 && info->dyn_second_stereo[sbgr] && min_ch == T4outof[sbgr])
  961. {
  962.     *seli += 2;
  963.     *scale += 6 * sfsPerScfsi[scfsi[T4[sbgr]][min_sb]];
  964. }
  965.     }
  966.     else if (fr_ps->config == 202 && info->dyn_second_stereo[sbgr] && min_ch == T3outof[sbgr])
  967.     {
  968.     *seli += 2;
  969.     *scale += 6 * sfsPerScfsi[scfsi[T3[sbgr]][min_sb]];
  970.     }
  971.     else if (fr_ps->config == 102 && info->dyn_second_stereo[sbgr] && min_ch == T2outof[sbgr])
  972.     {
  973.     *seli += 2;
  974.     *scale += 6 * sfsPerScfsi[scfsi[T2[sbgr]][min_sb]];
  975.     }
  976. }
  977. #ifdef Augmentation_7ch
  978. void dyn_bal_aug (
  979. unsigned int scfsi[CHANMAX3][SBLIMIT],   /* in */ 
  980. int sbgr,     /* in */
  981. frame_params *fr_ps,     /* in:  fr_ps->header->dyn_cross[sbgr] */
  982. int min_ch,     /* in */
  983. int min_sb,     /* in */
  984. int *seli,     /* in, out */
  985. int *scale)     /* in, out */
  986. {
  987. /*  global parameters
  988.  *  in: T2[SBGRS], T3[SBGRS], T4[SBGRS], T5[SBGRS]
  989.  */
  990.     static int sfsPerScfsi[] = { 3,2,1,2 };    /* lookup # sfs per scfsi */
  991.     int dynx_T2 = !dyn_ch (fr_ps, sbgr, 2);
  992.     int dynx_T3 = !dyn_ch (fr_ps, sbgr, 3);
  993.     int dynx_T4 = !dyn_ch (fr_ps, sbgr, 4);
  994.     int T5T0 = L0, T6T0 = L0, T6T1 = R0;
  995.     
  996.     if (fr_ps->header->aug_tc_alloc[sbgr] == 4 || fr_ps->header->aug_tc_alloc[sbgr] == 5)
  997.      if (fr_ps->header->dyn_cross_LR == 0)
  998.     T6T1 = L0;
  999. else
  1000.     T6T0 = R0;
  1001.     else if (fr_ps->header->aug_tc_alloc[sbgr] == 6 || fr_ps->header->aug_tc_alloc[sbgr] == 7)
  1002.         if (fr_ps->header->dyn_cross_LR)
  1003.     T5T0 = R0;
  1004.     /* 5/2 */
  1005.     switch (fr_ps->header->aug_dyn_cross[sbgr])
  1006.     {
  1007.     case  0:
  1008. break;     /* no additional scf and scfsi */
  1009.     case  1:
  1010. if (min_ch == T6T1)
  1011. {
  1012.     *seli += 2;
  1013.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1014. }
  1015. break;
  1016.     case  2:
  1017. if (min_ch == T2[sbgr] || (dynx_T2 && min_ch == T2from[sbgr]))
  1018. {
  1019.     *seli += 2;
  1020.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1021. }
  1022. break;
  1023.     case  3:
  1024. if (min_ch == T4[sbgr] || (dynx_T4 && min_ch == T4from[sbgr]))
  1025. {
  1026.     *seli += 2;
  1027.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1028. }
  1029. break;
  1030.     case  4:
  1031. if (min_ch == T5[sbgr])
  1032. {
  1033.     *seli += 2;
  1034.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1035. }
  1036. break;
  1037.     case  5:
  1038. if (min_ch == T5T0)
  1039. {
  1040.     *seli += 2;
  1041.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1042. }
  1043. break;
  1044.     case  6:
  1045. if (min_ch == T5T0)
  1046. {
  1047.     *seli += 2;
  1048.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1049. }
  1050. else if (min_ch == T6T1)
  1051. {
  1052.     *seli += 2;
  1053.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1054. }
  1055. break;
  1056.     case  7:
  1057. if (min_ch == T5T0)
  1058. {
  1059.     *seli += 2;
  1060.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1061. }
  1062. if (min_ch == T2[sbgr] || (dynx_T2 && min_ch == T2from[sbgr]))
  1063. {
  1064.     *seli += 2;
  1065.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1066. }
  1067. break;
  1068.     case  8:
  1069. if (min_ch == T5T0)
  1070. {
  1071.     *seli += 2;
  1072.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1073. }
  1074. if (min_ch == T4[sbgr] || (dynx_T4 && min_ch == T4from[sbgr]))
  1075. {
  1076.     *seli += 2;
  1077.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1078. }
  1079. break;
  1080.     case  9:
  1081. if (min_ch == T5T0)
  1082. {
  1083.     *seli += 2;
  1084.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1085. }
  1086. if (min_ch == T6T0)
  1087. {
  1088.     *seli += 2;
  1089.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1090. }
  1091. break;
  1092.     case 10:
  1093. if (min_ch == T2[sbgr] || (dynx_T2 && min_ch == T2from[sbgr]))
  1094. {
  1095.     *seli += 2;
  1096.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1097. }
  1098. break;
  1099.     case 11:
  1100. if (min_ch == T2[sbgr] || (dynx_T2 && min_ch == T2from[sbgr]))
  1101. {
  1102.     *seli += 2;
  1103.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1104. }
  1105. if (min_ch == T6T1)
  1106. {
  1107.     *seli += 2;
  1108.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1109. }
  1110. break;
  1111.     case 12:
  1112. if (min_ch == T2[sbgr] || (dynx_T2 && min_ch == T2from[sbgr]))
  1113. {
  1114.     *seli += 4;
  1115.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1116.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1117. }
  1118. break;
  1119.     case 13:
  1120. if (min_ch == T2[sbgr] || (dynx_T2 && min_ch == T2from[sbgr]))
  1121. {
  1122.     *seli += 2;
  1123.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1124. }
  1125. if (min_ch == T4[sbgr] || (dynx_T4 && min_ch == T4from[sbgr]))
  1126. {
  1127.     *seli += 2;
  1128.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1129. }
  1130. break;
  1131.     case 14:
  1132. if (min_ch == T3[sbgr] || (dynx_T3 && min_ch == T3from[sbgr]))
  1133. {
  1134.     *seli += 2;
  1135.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1136. }
  1137. break;
  1138.     case 15:
  1139. if (min_ch == T3[sbgr] || (dynx_T3 && min_ch == T3from[sbgr]))
  1140. {
  1141.     *seli += 2;
  1142.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1143. }
  1144. if (min_ch == T6T1)
  1145. {
  1146.     *seli += 2;
  1147.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1148. }
  1149. break;
  1150.     case 16:
  1151. if (min_ch == T3[sbgr] || (dynx_T3 && min_ch == T3from[sbgr]))
  1152. {
  1153.     *seli += 2;
  1154.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1155. }
  1156. if (min_ch == T2[sbgr] || (dynx_T2 && min_ch == T2from[sbgr]))
  1157. {
  1158.     *seli += 2;
  1159.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1160. }
  1161. break;
  1162.     case 17:
  1163. if (min_ch == T3[sbgr] || (dynx_T3 && min_ch == T3from[sbgr]))
  1164. {
  1165.     *seli += 2;
  1166.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1167. }
  1168. if (min_ch == T4[sbgr] || (dynx_T4 && min_ch == T4from[sbgr]))
  1169. {
  1170.     *seli += 2;
  1171.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1172. }
  1173. break;
  1174.     case 18:
  1175. if (min_ch == T3[sbgr] || (dynx_T3 && min_ch == T3from[sbgr]))
  1176. {
  1177.     *seli += 4;
  1178.     *scale += 6 * sfsPerScfsi[scfsi[T5[sbgr]][min_sb]];
  1179.     *scale += 6 * sfsPerScfsi[scfsi[T6[sbgr]][min_sb]];
  1180. }
  1181. break;
  1182.   default: 
  1183. fprintf (stderr, "FORBIDDEN AUG_DYN_CROSS!!!!!n");
  1184. fflush (stderr);
  1185. exit (1);
  1186. break;
  1187.     }
  1188. }
  1189. #endif
  1190. /****************************************************************************
  1191.  *
  1192.  *  void choose_dyn
  1193.  *
  1194.  *  bit_alloc of the dynamic crosstalk channels must be have a value; 
  1195.  *  only for sending scf in datastream.
  1196.  *
  1197.  *  07/94 Susanne Ritscher
  1198.  *  94/10/31 Andreas Silzle     little remake
  1199.  *  94/12/30 Andreas Silzle     
  1200.  *     fill only up to that subband of the basic channel
  1201.  *     which is unequal zero.
  1202.  *
  1203.  *****************************************************************************/
  1204. void choose_dyn (
  1205. frame_params *fr_ps, 
  1206.     /* in:  fr_ps->header->dyn_cross[sbgr] 
  1207.      *     fr_ps->alloc
  1208.      */
  1209. int min_ch, /* in */
  1210. int min_sb, /* in */
  1211. int sbgr,  /* in */
  1212. unsigned int bit_alloc[CHANMAX3][SBLIMIT]) /* out */
  1213. {
  1214. /*  global parameters
  1215.  *  in: T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS]
  1216.  */
  1217.     layer *info  = fr_ps->header;
  1218.     int center   = info->center;
  1219.     int surround = info->surround;
  1220. /* 960627 FdB DynX dependent on configuration */
  1221. if (fr_ps->config == 320)
  1222. {
  1223.     /* 3/2 */
  1224.     switch(fr_ps->header->dyn_cross[sbgr]) {
  1225.   case 0:
  1226. break;
  1227.   case 1: 
  1228. if(min_ch == R0 && bit_alloc[R0][min_sb] != 0)
  1229.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1230. break;
  1231.   case 2: 
  1232. if(min_ch == L0 && bit_alloc[L0][min_sb] != 0)
  1233.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1234. break;
  1235.   case 3: 
  1236. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0)
  1237.        bit_alloc[T2[sbgr]][min_sb] = 1;
  1238. break;
  1239.   case 4: 
  1240. if(min_ch == R0 && bit_alloc[R0][min_sb] != 0)
  1241.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1242. if(min_ch == L0 && bit_alloc[L0][min_sb] != 0)
  1243.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1244. break;
  1245.   case 5: 
  1246. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) 
  1247.     bit_alloc[T2[sbgr]][min_sb] = 1;
  1248. if(min_ch == R0 && bit_alloc[R0][min_sb] != 0) 
  1249.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1250. break;
  1251.   case 6: 
  1252. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) 
  1253.     bit_alloc[T2[sbgr]][min_sb] = 1;
  1254. if(min_ch == L0 && bit_alloc[L0][min_sb] != 0) 
  1255.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1256. break;
  1257.   case 7: 
  1258. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) 
  1259.     bit_alloc[T2[sbgr]][min_sb] = 1;
  1260. if(min_ch == L0 && bit_alloc[L0][min_sb] != 0) 
  1261.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1262. if(min_ch == R0 && bit_alloc[R0][min_sb] != 0) 
  1263.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1264. break;
  1265.   case 8: 
  1266. if(min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0)
  1267.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1268. break;
  1269.   case 9: 
  1270. if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
  1271.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1272. break;
  1273.  case 10: 
  1274. if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
  1275.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1276. break;
  1277.  case 11: 
  1278. if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
  1279.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1280. if(min_ch == R0 && bit_alloc[R0][min_sb] != 0)
  1281.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1282. break;
  1283.  case 12: 
  1284. if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
  1285.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1286. if(min_ch == L0 && bit_alloc[L0][min_sb] != 0)
  1287.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1288. break;
  1289.  case 13: 
  1290. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) 
  1291.     bit_alloc[T2[sbgr]][min_sb] = 1;
  1292. if(min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0)
  1293.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1294. break;
  1295.  case 14: 
  1296. if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) {
  1297.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1298.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1299. }
  1300. break;
  1301.  case 15: 
  1302. fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!n");
  1303. fflush(stderr);
  1304. exit(0);
  1305. break;
  1306.     }     /* switch.. */
  1307. }
  1308. else if (fr_ps->config == 310 || fr_ps->config == 220)
  1309. {
  1310.     /* 3/1 and 2/2 */
  1311.     switch(fr_ps->header->dyn_cross[sbgr]) {
  1312.   case 0:
  1313. break;
  1314.   case 1: 
  1315. if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0)
  1316.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1317. break;
  1318.   case 2: 
  1319. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0)
  1320.     bit_alloc[T2[sbgr]][min_sb] = 1;
  1321. break;
  1322.   case 3: 
  1323. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) 
  1324.     bit_alloc[T2[sbgr]][min_sb] = 1;
  1325. if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0) 
  1326.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1327. break;
  1328.   case 4: 
  1329. if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
  1330.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1331. break;
  1332.  default: 
  1333. fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!n");
  1334. fflush(stderr);
  1335. exit(0);
  1336. break;
  1337.     }     /* switch.. */
  1338. }
  1339. else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
  1340. {
  1341.     /* 3/0 (+2/0) and 2/1 */
  1342.     switch(fr_ps->header->dyn_cross[sbgr]) {
  1343.   case 0:
  1344. break;
  1345.   case 1: 
  1346. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0)
  1347.     bit_alloc[T2[sbgr]][min_sb] = 1;
  1348. break;
  1349.  default: 
  1350. fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!n");
  1351. fflush(stderr);
  1352. exit(0);
  1353. break;
  1354.     }     /* switch.. */
  1355.     if (fr_ps->header->dyn_second_stereo[sbgr])
  1356. if(min_ch == T4outof[sbgr] && bit_alloc[T4outof[sbgr]][min_sb] != 0)
  1357.     bit_alloc[T4[sbgr]][min_sb] = 1;
  1358. }
  1359. else if (fr_ps->config == 202)
  1360. {
  1361.     if (fr_ps->header->dyn_second_stereo[sbgr])
  1362. if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0)
  1363.     bit_alloc[T3[sbgr]][min_sb] = 1;
  1364. }
  1365. else if (fr_ps->config == 102)
  1366. {
  1367.     if (fr_ps->header->dyn_second_stereo[sbgr])
  1368. if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0)
  1369.     bit_alloc[T2[sbgr]][min_sb] = 1;
  1370. }
  1371. }
  1372. #ifdef Augmentation_7ch
  1373. void choose_dyn_aug (
  1374. frame_params *fr_ps, 
  1375.     /* in:  fr_ps->header->dyn_cross[sbgr] 
  1376.      *     fr_ps->alloc
  1377.      */
  1378. int min_ch, /* in */
  1379. int min_sb, /* in */
  1380. int sbgr,  /* in */
  1381. unsigned int bit_alloc[CHANMAX3][SBLIMIT]) /* out */
  1382. {
  1383. /*  global parameters
  1384.  *  in: T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS]
  1385.  */
  1386.     layer *info  = fr_ps->header;
  1387.     int dynx_T2 = !dyn_ch (fr_ps, sbgr, 2);
  1388.     int dynx_T3 = !dyn_ch (fr_ps, sbgr, 3);
  1389.     int dynx_T4 = !dyn_ch (fr_ps, sbgr, 4);
  1390.     int T5T0 = L0, T6T0 = L0, T6T1 = R0;
  1391.     
  1392.     if (info->aug_tc_alloc[sbgr] == 4 || info->aug_tc_alloc[sbgr] == 5)
  1393.      if (fr_ps->header->dyn_cross_LR == 0)
  1394.     T6T1 = L0;
  1395. else
  1396.     T6T0 = R0;
  1397.     else if (info->aug_tc_alloc[sbgr] == 6 || info->aug_tc_alloc[sbgr] == 7)
  1398.         if (info->dyn_cross_LR)
  1399.     T5T0 = R0;
  1400.     /* 5/2 */
  1401.     switch (fr_ps->header->aug_dyn_cross[sbgr])
  1402.     {
  1403.     case 0:
  1404.   break;
  1405.     case 1: 
  1406.   if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0)
  1407.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1408.   break;
  1409.     case 2: 
  1410.   if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
  1411.       (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
  1412.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1413.   break;
  1414.     case 3: 
  1415.   if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) ||
  1416.       (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0))
  1417.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1418.   break;
  1419.     case 4: 
  1420.   if (min_ch == T5[sbgr] && bit_alloc[T5[sbgr]][min_sb] != 0)
  1421.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1422.   break;
  1423.     case 5: 
  1424.   if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) 
  1425.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1426.   break;
  1427.     case 6: 
  1428.   if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) 
  1429.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1430.   if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0) 
  1431.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1432.   break;
  1433.     case 7: 
  1434.   if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) 
  1435.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1436.   if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
  1437.       (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
  1438.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1439.   break;
  1440.     case 8: 
  1441.   if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) 
  1442.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1443.   if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) ||
  1444.       (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0))
  1445.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1446.   break;
  1447.     case 9: 
  1448.   if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0)
  1449.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1450.   if (min_ch == T6T0 && bit_alloc[T6T0][min_sb] != 0)
  1451.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1452.   break;
  1453.    case 10: 
  1454.   if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
  1455.       (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
  1456.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1457.   break;
  1458.    case 11: 
  1459.   if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
  1460.       (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
  1461.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1462.   if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0)
  1463.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1464.   break;
  1465.    case 12: 
  1466.   if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
  1467.       (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
  1468.       bit_alloc[T5[sbgr]][min_sb] = bit_alloc[T6[sbgr]][min_sb] = 1;
  1469.   break;
  1470.    case 13: 
  1471.   if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
  1472.       (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
  1473.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1474.   if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) ||
  1475.       (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0))
  1476.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1477.   break;
  1478.    case 14: 
  1479.   if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
  1480.       (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
  1481.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1482.   break;
  1483.    case 15: 
  1484.   if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
  1485.       (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
  1486.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1487.   if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0)
  1488.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1489.   break;
  1490.    case 16: 
  1491.   if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
  1492.       (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
  1493.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1494.   if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
  1495.       (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
  1496.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1497.   break;
  1498.    case 17: 
  1499.   if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
  1500.       (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
  1501.       bit_alloc[T5[sbgr]][min_sb] = 1;
  1502.   if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) ||
  1503.       (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0))
  1504.       bit_alloc[T6[sbgr]][min_sb] = 1;
  1505.   break;
  1506.    case 18:
  1507.   if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
  1508.       (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
  1509.       bit_alloc[T5[sbgr]][min_sb] = bit_alloc[T6[sbgr]][min_sb] = 1;
  1510.   break;
  1511.    default: 
  1512.   fprintf (stderr, "FORBIDDEN AUG_DYN_CROSS!!!!!n");
  1513.   fflush (stderr);
  1514.   exit (1);
  1515.   break;
  1516.     }
  1517. }
  1518. #endif
  1519. /************************************************************************
  1520.  *
  1521.  * scfsi_calc_dyn    
  1522.  *
  1523.  * Version 1.0     94/07/07 Andreas Silzle, IRT
  1524.  *
  1525.  * Calculating the scale factor select information of one channel 
  1526.  * without changing the scale factors.
  1527.  *
  1528.  ************************************************************************/
  1529. void scfsi_calc_dyn (
  1530. unsigned int scalar_dyn[][3][SBLIMIT],   /* in/out */
  1531. int ch,      /* in */
  1532. int sblimit,     /* in */ 
  1533. unsigned int scfsi_dyn[][SBLIMIT])      /* out */
  1534. {
  1535.     int     sb;
  1536.     
  1537.     for (sb = 0; sb < sblimit; sb++)
  1538.     {
  1539. /* If the subbands are coded only with SCF's, they must be accurate. */
  1540. /* 1993-02-19 and 1994-03-17 shn */
  1541. /* 4 patterns are possible: 0: ABC, 1: AAB, 2: AAA, 3: ABB */
  1542. if ((scalar_dyn[ch][0][sb] != scalar_dyn[ch][1][sb]) &&
  1543.     (scalar_dyn[ch][1][sb] != scalar_dyn[ch][2][sb]))
  1544.     scfsi_dyn[ch][sb] = 0;
  1545. else
  1546. if ((scalar_dyn[ch][0][sb] == scalar_dyn[ch][1][sb]) &&
  1547.     (scalar_dyn[ch][1][sb] != scalar_dyn[ch][2][sb]))
  1548.     scfsi_dyn[ch][sb] = 1;
  1549. else
  1550. if ((scalar_dyn[ch][0][sb] == scalar_dyn[ch][1][sb]) &&
  1551.     (scalar_dyn[ch][1][sb] == scalar_dyn[ch][2][sb]))
  1552.     scfsi_dyn[ch][sb] = 2;
  1553. else
  1554.     scfsi_dyn[ch][sb] = 3;
  1555.     } /* for (sb.. */
  1556. }
  1557. /************************************************************************
  1558.  *
  1559.  * scfsi_calc    
  1560.  *
  1561.  * Version 1.0     94/07/07 Andreas Silzle, IRT
  1562.  *
  1563.  * Calculating the scale factor select information of one channel. 
  1564.  *
  1565.  * route: II_transmission_pattern (Layer II only)
  1566.  *
  1567.  * PURPOSE:For a given subband, determines whether to send 1, 2, or
  1568.  * all 3 of the scalefactors, and fills in the scalefactor
  1569.  * select information accordingly
  1570.  *
  1571.  * SEMANTICS:  The subbands and channels are classified based on how much
  1572.  * the scalefactors changes over its three values (corresponding
  1573.  * to the 3 sets of 12 samples per subband).  The classification
  1574.  * will send 1 or 2 scalefactors instead of three if the scalefactors
  1575.  * do not change much.  The scalefactor select information,
  1576.  * #scfsi#, is filled in accordingly.
  1577.  *
  1578.  ************************************************************************/
  1579. void scfsi_calc (
  1580. unsigned int scalar[][3][SBLIMIT],  /* in/out */
  1581. int ch,  /* in */
  1582. int sblimit, /* in */ 
  1583. unsigned int scfsi[][SBLIMIT])  /* out */
  1584. {
  1585.     int dscf[2];
  1586.     int class[2], sb, j;
  1587.     static int pattern[5][5] = {
  1588. 0x123, 0x122, 0x122, 0x133, 0x123,
  1589. 0x113, 0x111, 0x111, 0x444, 0x113,
  1590. 0x111, 0x111, 0x111, 0x333, 0x113,
  1591. 0x222, 0x222, 0x222, 0x333, 0x123,
  1592. 0x123, 0x122, 0x122, 0x133, 0x123    };
  1593.     for (sb = 0; sb < sblimit; sb++)
  1594.     {
  1595. dscf[0] = (scalar[ch][0][sb] - scalar[ch][1][sb]);
  1596. dscf[1] = (scalar[ch][1][sb] - scalar[ch][2][sb]);
  1597. for (j=0; j<2; j++)
  1598. {
  1599.     if (dscf[j] <= -3)
  1600. class[j] = 0;
  1601.     else if (dscf[j] > -3 && dscf[j] < 0)
  1602. class[j] = 1;
  1603.     else if (dscf[j] == 0)
  1604. class[j] = 2;
  1605.     else if (dscf[j] > 0 && dscf[j] < 3)
  1606. class[j] = 3;
  1607.     else 
  1608. class[j] = 4;
  1609. }
  1610. switch (pattern[class[0]][class[1]])
  1611. {
  1612. case 0x123 :
  1613.     scfsi[ch][sb] = 0;
  1614.     break;
  1615. case 0x122 :
  1616.     scfsi[ch][sb] = 3;
  1617.     scalar[ch][2][sb] = scalar[ch][1][sb];
  1618.     break;
  1619. case 0x133 :
  1620.     scfsi[ch][sb] = 3;
  1621.     scalar[ch][1][sb] = scalar[ch][2][sb];
  1622.     break;
  1623. case 0x113 :
  1624.     scfsi[ch][sb] = 1;
  1625.     scalar[ch][1][sb] = scalar[ch][0][sb];
  1626.     break;
  1627. case 0x111 :
  1628.     scfsi[ch][sb] = 2;
  1629.     scalar[ch][1][sb] = scalar[ch][2][sb] = scalar[ch][0][sb];
  1630.     break;
  1631. case 0x222 :
  1632.     scfsi[ch][sb] = 2;
  1633.     scalar[ch][0][sb] = scalar[ch][2][sb] = scalar[ch][1][sb];
  1634.     break;
  1635. case 0x333 :
  1636.     scfsi[ch][sb] = 2;
  1637.     scalar[ch][0][sb] = scalar[ch][1][sb] = scalar[ch][2][sb];
  1638.     break;
  1639. case 0x444 :
  1640.     scfsi[ch][sb] = 2;
  1641.     if (scalar[ch][0][sb] > scalar[ch][2][sb])
  1642. scalar[ch][0][sb] = scalar[ch][2][sb];
  1643.     scalar[ch][1][sb] = scalar[ch][2][sb] = scalar[ch][0][sb];
  1644. } /* switch */
  1645.     } /* for (sb.. */
  1646. }
  1647. /************************************************************************
  1648.  *
  1649.  * scf_calc    
  1650.  *
  1651.  * Calculating the scale factor for one channel.
  1652.  *
  1653.  * Version 1.0     94/07/07 Andreas Silzle, IRT
  1654.  *
  1655.  * route: II_scale_factor_calc() 
  1656.  *
  1657.  * PURPOSE:For each subband, calculate the scale factor for each set
  1658.  * of the 12 subband samples
  1659.  *
  1660.  * SEMANTICS:  Pick the scalefactor #multiple[]# just larger than the
  1661.  * absolute value of the peak subband sample of 12 samples,
  1662.  * and store the corresponding scalefactor index in #scalar#.
  1663.  *
  1664.  * Layer II has three sets of 12-subband samples for a given
  1665.  * subband.
  1666.  *
  1667.  ************************************************************************/
  1668. void scf_calc (
  1669. double sample[][3][SCALE_BLOCK][SBLIMIT], /* in */
  1670. int sblimit, /* in */
  1671. int ch, /* in */
  1672. unsigned int scf[][3][SBLIMIT]) /* out */ 
  1673. {
  1674. /* global variables: 
  1675.  * double multiple[64] 
  1676.  */
  1677.     int     sb, smp, sufr, r;
  1678.     double  s[SBLIMIT];
  1679.     for (sufr=0; sufr<3; sufr++)
  1680.     {
  1681. for (sb=0; sb<sblimit; sb++)
  1682.     for (smp=1, s[sb] = mod(sample[ch][sufr][0][sb]); 
  1683.     smp<SCALE_BLOCK; smp++)
  1684. if (mod(sample[ch][sufr][smp][sb]) > s[sb])
  1685.     s[sb] = mod(sample[ch][sufr][smp][sb]);
  1686. for (sb=0; sb<sblimit; sb++)
  1687.     for (r=SCALE_RANGE-1, scf[ch][sufr][sb]=0; r>=0; r--)
  1688. if (s[sb] < multiple[r])
  1689. {                       /* <= changed to <, 1992-11-06 shn*/
  1690.     scf[ch][sufr][sb] = r;
  1691.     break;
  1692. }
  1693.     }   /* for (sufr.. */
  1694. }