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

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: encode.c 1.9 1996/02/12 07:13:35 rowlands Exp $
  6.  *
  7.  * $Log: encode.c $
  8.  * Revision 1.9  1996/02/12 07:13:35  rowlands
  9.  * Release following Munich meeting
  10.  *
  11.  * Revision 1.6.2.1  1995/11/06  04:19:12  rowlands
  12.  * Received from Uwe Felderhoff (IRT)
  13.  *
  14.  * Revision 1.8  1995/08/14  07:53:28  tenkate
  15.  * ML-LSF added Warner ten Kate 7/8/95 (Philips)
  16.  * variables "alloc" and "sblimit" changed into "alloc_ml" and
  17.  * "sblimit_ml" where appropriate.
  18.  * sample loops adapted to 12 or 6 depending on full or half fs.
  19.  * II_a_bit_allocation separate summing for ML.
  20.  *
  21.  * Revision 1.7  1995/07/31  07:48:55  tenkate
  22.  * addition of phantom coding, in void matricing(), 25/07/95 WtK
  23.  *
  24.  * Revision 1.4.3.1  1995/06/16  08:25:11  rowlands
  25.  * Input from Sang Wook Kim (Samsung AIT)
  26.  *
  27.  * Revision 1.4.2.1  1995/06/16  03:46:42  rowlands
  28.  * Input from Susanne Ritscher (IRT)
  29.  *
  30.  * Revision 1.4.1.6  1995/06/16  02:41:51  rowlands
  31.  * Added dematrix procedure 2, corrected dematrixing values.
  32.  *
  33.  * Added support for dematrix procedure 2, without predistortion.
  34.  * To implement predistortion will require a delay in the encoder
  35.  * to be able to calculate the predistorted filtered surround signal
  36.  * subband samples.
  37.  *
  38.  * Modified procedure matricing() to reuse the compatible stereo
  39.  * channel signals computed by matricing_fft(). This was needed to
  40.  * avoid calculating the low-pass-filtered surround signal in the
  41.  * subband domain. The main function of procedure matricing() now
  42.  * is to weight the multichannels. These channels are unweighted
  43.  * prior to this for the benefit of the psycho model.
  44.  *
  45.  * Corrected weighting values for dematrixing procedures.
  46.  * Deleted matrixing on multilingual channels.
  47.  * In the quantization procedures, made quantizing to zero bits
  48.  * a special case to skip some operations on undefined values.
  49.  *
  50.  **********************************************************************/
  51. /**********************************************************************
  52.  *   date   programmers         comment                               *
  53.  * 3/01/91  Douglas Wong,       start of version 1.1 records          *
  54.  *          Davis Pan                                                 *
  55.  * 3/06/91  Douglas Wong        rename: setup.h to endef.h            *
  56.  *                                      efilter to enfilter           *
  57.  *                                      ewindow to enwindow           *
  58.  *                              integrated "quantizer", "scalefactor",*
  59.  *                              and "transmission" files              *
  60.  *                              update routine "window_subband"       *
  61.  * 3/31/91  Bill Aspromonte     replaced read_filter by               *
  62.  *                              create_an_filter                      *
  63.  * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         *
  64.  *                              Incorporated Jean-Georges Fritsch's   *
  65.  *                              "bitstream.c" package.                *
  66.  *                              Incorporated Bill Aspromonte's        *
  67.  *                              filterbank coefficient matrix         *
  68.  *                              calculation routines and added        *
  69.  *                              roundoff to coincide with specs.      *
  70.  *                              Modified to strictly adhere to        *
  71.  *                              encoded bitstream specs, including    *
  72.  *                              "Berlin changes".                     *
  73.  *                              Modified PCM sound file handling to   *
  74.  *                              process all incoming samples and fill *
  75.  *                              out last encoded frame with zeros     *
  76.  *                              (silence) if needed.                  *
  77.  *                              Located and fixed numerous software   *
  78.  *                              bugs and table data errors.           *
  79.  * 19jun91  dpwe (Aware)        moved "alloc_*" reader to common.c    *
  80.  *                              Globals sblimit, alloc replaced by new*
  81.  *                              struct 'frame_params' passed as arg.  *
  82.  *                              Added JOINT STEREO coding, layers I,II*
  83.  *                              Affects: *_bit_allocation,            *
  84.  *                              subband_quantization, encode_bit_alloc*
  85.  *                              sample_encoding                       *
  86.  * 6/10/91  Earle Jennings      modified II_subband_quantization to   *
  87.  *                              resolve type cast problem for MS_DOS  *
  88.  * 6/11/91  Earle Jennings      modified to avoid overflow on MS_DOS  *
  89.  *                              in routine filter_subband             *
  90.  * 7/10/91  Earle Jennings      port to MsDos from MacIntosh version  *
  91.  * 8/ 8/91  Jens Spille         Change for MS-C6.00                   *
  92.  *10/ 1/91  S.I. Sudharsanan,   Ported to IBM AIX platform.           *
  93.  *          Don H. Lee,                                               *
  94.  *          Peter W. Farrett                                          *
  95.  *10/ 3/91  Don H. Lee          implemented CRC-16 error protection   *
  96.  *                              newly introduced function encode_CRC  *
  97.  *11/ 8/91  Kathy Wang          Documentation of code                 *
  98.  *                              All variablenames are referred to     *
  99.  *                              with surrounding pound (#) signs      *
  100.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  101.  *                              important fixes involved changing     *
  102.  *                              16-bit ints to long or unsigned in    *
  103.  *                              bit alloc routines for quant of 65535 *
  104.  *                              and passing proper function args.     *
  105.  *                              Removed "Other Joint Stereo" option   *
  106.  *                              and made bitrate be total channel     *
  107.  *                              bitrate, irrespective of the mode.    *
  108.  *                              Fixed many small bugs & reorganized.  *
  109.  * 92-08-11 Soren H. Nielsen    Fixed bug: allocation of space in the *
  110.  *                              bitstream for the CRC-word. Fixed     *
  111.  *                              reading of window from file.          *
  112.  * 92-11-06 Soren H. Nielsen Fixed scalefactor calculation.        *
  113.  **********************************************************************
  114.  *                                                                    *
  115.  *                                                                    *
  116.  *  MPEG/audio Phase 2 coding/decoding multichannel                   *
  117.  *                                                                    *
  118.  *  7/27/93        Susanne Ritscher,  IRT Munich                      *
  119.  *  8/10/93        changed matricing to 7 channels                    *
  120.  *            added void matricing_fft                           *
  121.  *  8/12/93        added int required_bits,                           *
  122.  *                       int max_alloc                                *
  123.  *                 implemented the new mc_header (third working draft)*
  124.  *  8/13/93        added channel-switching in required_bits and       *
  125.  *                 II_subband_quantisation, II_encode_scale,          *
  126.  *                 II_encode_bit_alloc, II_encode_sample,             *
  127.  *                 encode_info                                        *
  128.  *                 all channels normalized                            *
  129.  *  9/20/93        channel-switching is only performed at a           *
  130.  *                 certain limit of TC_ALLOC dB, which is included    *
  131.  *                 in encoder.h                                       *
  132.  *  1/04/94        get out some rubbish                               *
  133.  *                                                                    *
  134.  * 01/05/94        implemented the Committee Draft header             *
  135.  *                                                                    *
  136.  * 01/12/94        changed matricing procedure according to           *
  137.  *                 Committee Draft                                    *
  138.  *                                                                    *
  139.  *  Version 1.0                                                       *
  140.  *                                                                    *
  141.  *  07/12/94       Susanne Ritscher,  IRT Munich                      *
  142.  *                 Tel: +49 89 32399 458                              *
  143.  *                 Fax: +49 89 32399 415                              *
  144.  *                                                                    *
  145.  *  Version 1.1                                                       *
  146.  *                                                                    *
  147.  *  02/23/95    Susanne Ritscher,  IRT Munich                      *
  148.  *                 corrected some bugs                                *
  149.  *                 extension bitstream is working                     *
  150.  *                                                                    *
  151.  *  Version 2.0                                                       *
  152.  *                                                                    *
  153.  *  01/28/97       Frans de Bont, Philips Sound & Vision, Eindhoven   *
  154.  *     - dynamic crosstalk working for all configurations*
  155.  *     - prediction working for all configurations       *
  156.  *     - extension bitstream fixed       *
  157.  *     - fully compliant to DIS 13818-3.2                *
  158.  *                                                                    *       *     
  159.  **********************************************************************/
  160. /**********************************************************************
  161.  *                                                                    *
  162.  *  06/06/95       Yeon Bae Thomas Kim, Samsung AIT                   *
  163.  *                 ancillary data is working                          *
  164.  *                                                                    *
  165.  *  06/06/95       Sang Wook Kim, Samsung AIT                         *
  166.  *                 corrected some bugs                                *
  167.  *                                                                    *
  168.  **********************************************************************/
  169. #define VERY_FAST_FILTER  1 /* JMZ 08/03/1995 FILTER */
  170. #include "common.h"
  171. #include "encoder.h"
  172.  
  173. /*=======================================================================
  174. |                                                                       |
  175. | This segment contains all the core routines of the encoder,           |
  176. | except for the psychoacoustic models.                                 |
  177. |                                                                       |
  178. | The user can select either one of the two psychoacoustic              |
  179. | models. Model I is a simple tonal and noise masking threshold         |
  180. | generator, and Model II is a more sophisticated cochlear masking      |
  181. | threshold generator. Model I is recommended for lower complexity      |
  182. | applications whereas Model II gives better subjective quality at low  |
  183. | bit rates.                                                            |
  184. |                                                                       |
  185. | Layers I and II of mono, stereo, and joint stereo modes are supported.|
  186. | Routines associated with a given layer are prefixed by "I_" for layer |
  187. | 1 and "II_" for layer 2.                                              |
  188. =======================================================================*/
  189.  
  190. /************************************************************************/
  191. /*
  192. /* read_samples()
  193. /*
  194. /* PURPOSE:  reads the PCM samples from a file to the buffer
  195. /*
  196. /*  SEMANTICS:
  197. /* Reads #samples_read# number of shorts from #musicin# filepointer
  198. /* into #sample_buffer[]#.  Returns the number of samples read.
  199. /*
  200. /************************************************************************/
  201. unsigned long read_samples(FILE *musicin, long int *sample_buffer, long unsigned int num_samples, long unsigned int frame_size, int
  202.  *byte_per_sample, int *aiff)
  203. {
  204. unsigned long samples_read;
  205. static unsigned long samples_to_read;
  206. static char init = TRUE;
  207. short pcm_sample_buffer[9216];        /*for correct reading of pcm-data*/
  208. int i;
  209.    if (init) {
  210.         samples_to_read = num_samples;
  211.         init = FALSE;
  212.    }
  213.    if (samples_to_read >= frame_size)
  214.         samples_read = frame_size;
  215.    else
  216.   samples_read = samples_to_read;
  217. if((*aiff==1) &&(*byte_per_sample !=2)){
  218.  
  219.             if ((samples_read =
  220.   fread(sample_buffer, *byte_per_sample, (int)samples_read, musicin)) == 0)
  221.   if (verbosity >= 2) printf("Hit end of audio datan");
  222.    
  223. }
  224. else{
  225.  if ((samples_read =
  226.   fread(pcm_sample_buffer, sizeof(short), (int)samples_read, musicin)) == 0)
  227.   if (verbosity >= 2) printf("Hit end of audio datan");
  228.             for(i = 0; i < 9216; ++i) sample_buffer[i] = pcm_sample_buffer[i];
  229.         }
  230.    samples_to_read -= samples_read;
  231.    if (samples_read < frame_size && samples_read > 0) {
  232.         if (verbosity >= 2) printf("Insufficient PCM input for one frame - fillout with zerosn");
  233.         for (; samples_read < frame_size; sample_buffer[samples_read++] = 0);
  234.         samples_to_read = 0;
  235.    }
  236.    return(samples_read);
  237. }
  238. /************************************************************************/
  239. /*
  240. /* get_audio()
  241. /*
  242. /* PURPOSE:  reads a frame of audio data from a file to the buffer,
  243. /*   aligns the data for future processing, and separates the
  244. /*   left and right channels
  245. /*
  246. /*  SEMANTICS:
  247. /* Calls read_samples() to read a frame of audio data from filepointer
  248. /* #musicin# to #insampl[]#.  The data is shifted to make sure the data
  249. /* is centered for the 1024pt window to be used by the psychoacoustic model,
  250. /* and to compensate for the 256 sample delay from the filter bank. For
  251. /* stereo, the channels are also demultiplexed into #buffer[0][]# and
  252. /* #buffer[1][]#
  253. /*
  254. /* 21/03/1995 JMZ Multimode adaptations
  255. /************************************************************************/
  256.  
  257. unsigned long
  258. get_audio (
  259. FILE *musicin,
  260. double (*buffer)[1152],
  261. long unsigned int num_samples,
  262. int stereo,
  263. IFF_AIFF *aiff_ptr,
  264. int stereomc,
  265. int stereoaug,
  266. frame_params *fr_ps,
  267. int *aiff,
  268. int *byte_per_sample,
  269. double (*buffer_matr)[1152]
  270. )
  271. {
  272.     int k, j, i;
  273.     long insamp[9216];
  274.     unsigned long samples_read;
  275.     int lay;
  276.     int lfe;
  277.     layer *info = fr_ps->header;
  278.     
  279.     lay = info->lay;
  280.     lfe = info->lfe;
  281.     if (lay == 1)
  282.     {
  283. if (stereo == 2)
  284. { /* layer 1, stereo */
  285.     samples_read = read_samples (musicin, insamp, num_samples,
  286.          (unsigned long) 768, byte_per_sample, aiff);
  287.     for (j = 0; j < 448; j++) 
  288.     {
  289. if (j<64) 
  290. {
  291.     buffer[0][j] = buffer[0][j+384];
  292.     buffer[1][j] = buffer[1][j+384];
  293.     buffer[2][j] = 0;
  294.     buffer[3][j] = 0;
  295.     buffer[4][j] = 0;
  296. }
  297. else 
  298. {
  299.     buffer[0][j] = insamp[2*j-128];
  300.     buffer[1][j] = insamp[2*j-127];
  301.     buffer[2][j] = 0;
  302.     buffer[3][j] = 0;
  303.     buffer[4][j] = 0;
  304. }
  305.     }
  306. }
  307. else 
  308. { /* layer 1, mono */
  309.     samples_read = read_samples (musicin, insamp, num_samples,
  310.          (unsigned long) 384, byte_per_sample, aiff);
  311.     for (j = 0; j < 448; j++)
  312.     {
  313. if (j < 64) 
  314. {
  315.     buffer[0][j] = buffer[0][j+384];
  316.     buffer[1][j] = 0;
  317.     buffer[2][j] = 0;
  318.     buffer[3][j] = 0;
  319.     buffer[4][j] = 0;
  320. }
  321. else 
  322. {
  323.     buffer[0][j] = insamp[j-64];
  324.     buffer[1][j] = 0;
  325.     buffer[2][j] = 0;
  326.     buffer[3][j] = 0;
  327.     buffer[4][j] = 0;
  328. }
  329.     }
  330. }
  331.     }
  332.     else 
  333.     {
  334. if (*aiff == 1)
  335. {
  336.     k = aiff_ptr->numChannels;
  337.     samples_read = read_samples (musicin, insamp, num_samples,
  338.      (unsigned long) (k * 1152), byte_per_sample, aiff);
  339.     for (i = 0; i < k; i++)
  340. for (j = 0; j < 1152; j++)
  341.     buffer[i][j] = insamp[k*j+i];
  342. }
  343. else 
  344. {  /* layerII, stereo */
  345.     if (stereo == 2)
  346.     {
  347. samples_read = read_samples (musicin, insamp, num_samples,
  348. (unsigned long) ((2+lfe)*1152), byte_per_sample, aiff);
  349. for (j = 0; j < 1152; j++)
  350. { /* fixed bug 28.6.93 S.R. */
  351.     buffer[0][j] = insamp[(2+lfe)*j];
  352.     buffer[1][j] = insamp[(2+lfe)*j+1];
  353.     buffer[2][j] = 0;
  354.     buffer[3+lfe][j] = 0;
  355.     buffer[4+lfe][j] = 0;
  356.     if (lfe)
  357.         buffer[3][j] = insamp[(2+lfe)*j+2]; /* ########### */
  358. }
  359.     }
  360.     else
  361.     { /* layer 2 (or 3), mono */
  362. samples_read = read_samples (musicin, insamp, num_samples,
  363. (unsigned long) 1152, byte_per_sample, aiff);
  364. for (j = 0; j < 1152; j++)
  365. {
  366.     buffer[0][j] = insamp[j];
  367.     buffer[1][j] = 0;
  368.     buffer[2][j] = 0;
  369.     buffer[3][j] = 0;
  370.     buffer[4][j] = 0;
  371. }        
  372.     }
  373. }
  374.     }
  375.     /*
  376.      * If LFE is not enabled, "buffer" contains:
  377.      * buffer[0] L
  378.      * buffer[1] R
  379.      * buffer[2] C
  380.      * buffer[3] Ls
  381.      * buffer[4] Rs
  382. #ifdef Augmentation_7ch
  383.      *  optional in 7.1 channel augmentation mode
  384.      * buffer[5] Lc
  385.      * buffer[6] Rc
  386. #endif
  387.      *
  388.      * If LFE is enabled, "buffer" contains:
  389.      * buffer[0] L
  390.      * buffer[1] R
  391.      * buffer[2] C
  392.      * buffer[3] LFE
  393.      * buffer[4] Ls
  394.      * buffer[5] Rs
  395. #ifdef Augmentation_7ch
  396.      *  optional in 7.1 channel augmentation mode
  397.      * buffer[6] Lc
  398.      * buffer[7] Rc
  399. #endif
  400.      */
  401. #ifdef Augmentation_7ch
  402.     if (stereoaug == 2)
  403.      matricing_aug_fft (buffer, buffer_matr, fr_ps);
  404.     else
  405. #endif
  406. matricing_fft (buffer, buffer_matr, fr_ps);
  407.     /*
  408.      * After matrixing, "buffer_matr" contains:
  409.      * buffer_matr[0] Lo
  410.      * buffer_matr[1] Ro
  411.      * buffer_matr[2] C
  412.      * buffer_matr[3] Ls
  413.      * buffer_matr[4] Rs
  414.      * buffer_matr[5] L
  415.      * buffer_matr[6] R
  416. #ifdef Augmentation_7ch
  417.      *  optional in 7.1 channel augmentation mode
  418.      * buffer_matr[7] L7
  419.      * buffer_matr[8] R7
  420.      * buffer_matr[9] C7
  421.      * buffer_matr[10] Lc
  422.      * buffer_matr[11] Rc
  423. #endif
  424.      */
  425.     return (samples_read);
  426. }
  427. /*************************************************************************
  428. /*
  429. /* matricing()
  430. /*
  431. /* The five-channel signal must be matricied to guarantee
  432. /* the compatibility to the stereo-decoder.
  433. /* There must be something of the surround information in the
  434. /* two front channels. In a five-channel decoder there will
  435. /* be a dematricing.
  436. /* There must be 7 channels for channel switching 8/10/93, SR
  437. /* 
  438. /* Channel 5 and 6 are the not matriced signals L and R
  439. /*
  440. /* If phantom coding is used the high-frequency part of the
  441. /* center signal is matrixed to left and right.
  442. /* 27/07/95 WtK
  443. /*                                                                         */
  444. /***************************************************************************/
  445. void normalizing (double (*sb_sample)[3][12][32], frame_params *fr_ps)
  446. {
  447.     double matrNorm; /* factor for normalizing JMZ */
  448.     double matrC; /* weighting factor for C, Phantom C */
  449.     double matrLsRs; /* weighting factor for Ls, Rs */
  450.     int stereo = fr_ps->stereo;
  451.     int i, j, k, l;
  452.     
  453.     layer *info = fr_ps->header;
  454.   
  455.     switch (info->matrix)
  456.     {
  457.     /* Changed the factors according to International Standard */
  458.       
  459.     case 0:
  460.     case 2: matrNorm = 1 / (1 + sqrt(2.0));
  461.     matrC = 1 / sqrt(2.0);
  462.     matrLsRs = 1 / sqrt(2.0);
  463.     break;
  464.     case 1: matrNorm = 1 / (1.5 + 0.5*sqrt(2.0));
  465.     matrC = 1 / sqrt(2.0);
  466.     matrLsRs = 0.5;
  467.     break;
  468.     case 3: matrNorm = 1;
  469.     matrC = 1;
  470.     matrLsRs = 1;
  471.     break;
  472.     }
  473.     for (i = 0; i < stereo; i++)
  474.      for (j = 0; j < 3; j++)
  475.     for (l = 0; l < 12; l++)
  476.      for (k = 0; k < SBLIMIT; k ++)
  477.     sb_sample[i][j][l][k] *= matrNorm;
  478.     for (j = 0; j < 3; ++j)
  479. for (l = 0; l < 12; l ++)
  480.     for (k = 0; k < SBLIMIT; k ++)
  481. if (fr_ps->config == 320)
  482. {
  483.     sb_sample[2][j][l][k] = sb_sample[2][j][l][k] * matrNorm * matrC;
  484.     sb_sample[3][j][l][k] = sb_sample[3][j][l][k] * matrNorm * matrLsRs;
  485.     sb_sample[4][j][l][k] = sb_sample[4][j][l][k] * matrNorm * matrLsRs;
  486. }
  487. else if (fr_ps->config == 310)
  488. {
  489.     sb_sample[2][j][l][k] = sb_sample[2][j][l][k] * matrNorm * matrC;
  490.     sb_sample[3][j][l][k] = sb_sample[3][j][l][k] * matrNorm * matrLsRs;
  491. }
  492. else if (fr_ps->config == 220)
  493. {
  494.     sb_sample[2][j][l][k] = sb_sample[2][j][l][k] * matrNorm * matrLsRs;
  495.     sb_sample[3][j][l][k] = sb_sample[3][j][l][k] * matrNorm * matrLsRs;
  496. }
  497. else if (fr_ps->config == 300 || fr_ps->config == 302)
  498.     sb_sample[2][j][l][k] = sb_sample[2][j][l][k] * matrNorm * matrC;
  499. else if (fr_ps->config == 210)
  500.     sb_sample[2][j][l][k] = sb_sample[2][j][l][k] * matrNorm * matrLsRs;
  501. }
  502. void matricing (double (*sb_sample)[3][12][32], frame_params *fr_ps)
  503. {
  504.     double matrPC; /* weighting factor for Phantom C */
  505.     double mono_surround;
  506.     register double val;
  507.     int i, j, k, l;
  508.     
  509.     layer *info = fr_ps->header;
  510.   
  511.     switch (info->matrix)
  512.     {
  513.     /* Changed the factors according to International Standard */      
  514.     case 0:
  515.     case 1:
  516.     case 2: matrPC = 1;
  517.     break;
  518.     case 3: matrPC = 1 / sqrt(2.0);
  519.     break;
  520.     }
  521.     for (j = 0; j < 3; ++j)
  522.     {
  523. for (l = 0; l < 12; l ++)
  524. {
  525.     for (k = 0; k < SBLIMIT; k ++)
  526.     {
  527. sb_sample[5][j][l][k] = sb_sample[0][j][l][k];
  528. sb_sample[6][j][l][k] = sb_sample[1][j][l][k];
  529. if (fr_ps->config == 320)
  530. {
  531.     /* 960819 FdB changed matricing */
  532.     if (info->matrix == 0 || info->matrix == 1)
  533.     {
  534.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k] + sb_sample[2][j][l][k] + sb_sample[3][j][l][k];
  535.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k] + sb_sample[2][j][l][k] + sb_sample[4][j][l][k];
  536.     }
  537.     else if (info->matrix == 2)
  538.     {
  539.     mono_surround = (sb_sample[3][j][l][k] + sb_sample[4][j][l][k]) / 2.0;
  540.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k] + sb_sample[2][j][l][k] - mono_surround;
  541.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k] + sb_sample[2][j][l][k] + mono_surround;
  542.     }
  543.     else
  544.     {
  545.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k];
  546.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k];
  547.     }
  548. }
  549. else if (fr_ps->config == 310)
  550. {
  551.     /* 960819 FdB changed matricing */
  552.     if (info->matrix == 0 || info->matrix == 1)
  553.     {
  554.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k] + sb_sample[2][j][l][k] + sb_sample[3][j][l][k];
  555.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k] + sb_sample[2][j][l][k] + sb_sample[3][j][l][k];
  556.     }
  557.     else if (info->matrix == 2)
  558.     {
  559.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k] + sb_sample[2][j][l][k] - sb_sample[3][j][l][k];
  560.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k] + sb_sample[2][j][l][k] + sb_sample[3][j][l][k];
  561.     }
  562.     else
  563.     {
  564.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k];
  565.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k];
  566.     }
  567. }
  568. else if (fr_ps->config == 220)
  569. {
  570.     /* 960819 FdB changed matricing */
  571.     if (info->matrix == 0 || info->matrix == 1)
  572.     {
  573.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k] + sb_sample[2][j][l][k];
  574.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k] + sb_sample[3][j][l][k];
  575.     }
  576.     else if (info->matrix == 3)
  577.     {
  578.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k];
  579.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k];
  580.     }
  581. }
  582. else if (fr_ps->config == 300 || fr_ps->config == 302)
  583. {
  584.     /* 960819 FdB changed matricing */
  585.     if (info->matrix == 0 || info->matrix == 1)
  586.     {
  587.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k] + sb_sample[2][j][l][k];
  588.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k] + sb_sample[2][j][l][k];
  589.     }
  590.     else if (info->matrix == 3)
  591.     {
  592.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k];
  593.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k];
  594.     }
  595. }
  596. else if (fr_ps->config == 210)
  597. {
  598.     /* 960819 FdB changed matricing */
  599.     if (info->matrix == 0 || info->matrix == 1)
  600.     {
  601.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k] + sb_sample[2][j][l][k];
  602.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k] + sb_sample[2][j][l][k];
  603.     }
  604.     else if (info->matrix == 3)
  605.     {
  606.     sb_sample[0][j][l][k] = sb_sample[5][j][l][k];
  607.     sb_sample[1][j][l][k] = sb_sample[6][j][l][k];
  608.     }
  609. }
  610.     }
  611.     if (info->center == 3)            /* 27/07/95 WtK */
  612.     {
  613. if (info->matrix==3)
  614.     for (k = 12; k < SBLIMIT; k ++)
  615.     {
  616. val = matrPC * sb_sample[2][j][l][k];
  617. sb_sample[0][j][l][k] += val;
  618. sb_sample[1][j][l][k] += val;
  619. sb_sample[2][j][l][k] = 0;
  620.     }
  621. else 
  622.     for (k = 12; k < SBLIMIT; k ++)
  623.     {
  624. val = matrPC * sb_sample[2][j][l][k];
  625. sb_sample[5][j][l][k] += val;
  626. sb_sample[6][j][l][k] += val;
  627. sb_sample[2][j][l][k] = 0;
  628.     }
  629.     }
  630. }
  631.     }
  632. }
  633. #ifdef Augmentation_7ch
  634. void normalizing_aug (double (*sb_sample)[3][12][32], frame_params *fr_ps)
  635. {
  636.     double norm; /* factor for normalizing JMZ */
  637.     double c[7];
  638.     int i, j, k, l;
  639.     
  640.     layer *info = fr_ps->header;
  641.   
  642.     for (i = 0; i < 7; i++)
  643. c[i] = 1.0;
  644.     switch (info->matrix)
  645.     {
  646.      /* factors according to International Standard */
  647.      case 0:
  648.      case 2: c[2] = c[3] = c[4] = 1.0 / sqrt (2.0); /* weigh factor for C, Ls and Rs */
  649.      break;
  650.      case 1: c[2] = 1.0 / sqrt (2.0); /* weigh factor for C            */
  651. c[3] = c[4] = 0.5; /* weigh factor for Ls, Rs       */
  652. break;
  653.     }
  654.     if (info->aug_mtx_proc == 0)
  655.      /* factors according to 7-ch augmentation */
  656. /* unweigh factor for LC, RC */
  657. c[5] = c[6] = 0.75;
  658.     /* normalization factor */
  659.     switch (info->matrix * 10 + info->aug_mtx_proc)
  660.     {
  661.     case 00:
  662.     case 20: norm = 1.0 / (1.75 + 1.25 * sqrt (2.0));
  663.      break;
  664.     case 10: norm = 1.0 / (2.25 + 0.75 * sqrt (2.0));
  665.      break;
  666.     case 30: norm = 1.0 / 1.75;
  667.      break;
  668.     case 01:
  669.     case 21: norm = 1.0 / (2.0 + sqrt (2.0));
  670.      break;
  671.     case 11: norm = 1.0 / (2.5 + 0.5 * sqrt (2.0));
  672.      break;
  673.     case 31: norm = 0.5;
  674.      break;
  675.     case 03:
  676.     case 23: norm = 1.0 / (1.0 + sqrt (2.0));
  677.      break;
  678.     case 13: norm = 1.0 / (1.5 + 0.5 * sqrt (2.0));
  679.      break;
  680.     case 33: norm = 1.0;
  681.      break;
  682.     }
  683.     for (i = 0; i < 7; i++)
  684. c[i] *= norm;
  685.     /* normalizing */
  686.     for (i = 0; i < 7; i++)
  687. for (j = 0; j < 3; j++)
  688.     for (k = 0; k < 12; k++)
  689. for (l = 0; l < SBLIMIT; l++)
  690.     sb_sample[i][j][k][l] *= c[i];
  691. }
  692. void matricing_aug (double (*sb_sample)[3][12][32], frame_params *fr_ps)
  693. {
  694.     int i, j, k, l;
  695.     
  696.     layer *info = fr_ps->header;
  697.   
  698.     for (j = 0; j < 3; ++j)
  699. for (l = 0; l < 12; l ++)
  700.     for (k = 0; k < SBLIMIT; k ++)
  701.     {
  702. /* copy L7, R7, C7, Lc and Rc to sb_sample[7 .. 11] */
  703. sb_sample[11][j][l][k] = sb_sample[6][j][l][k];
  704. sb_sample[10][j][l][k] = sb_sample[5][j][l][k];
  705. sb_sample[ 9][j][l][k] = sb_sample[2][j][l][k];
  706. sb_sample[ 8][j][l][k] = sb_sample[1][j][l][k];
  707. sb_sample[ 7][j][l][k] = sb_sample[0][j][l][k];
  708. /* 960819 FdB changed matricing */
  709. if (info->aug_mtx_proc == 0 || info->aug_mtx_proc == 1)
  710. {
  711.     sb_sample[0][j][l][k] += sb_sample[5][j][l][k];
  712.     sb_sample[1][j][l][k] += sb_sample[6][j][l][k];
  713.                 }
  714. if (info->aug_mtx_proc == 0)
  715.     sb_sample[2][j][l][k] += (sb_sample[5][j][l][k] + sb_sample[6][j][l][k]) / 3;
  716.     }
  717. }
  718. #endif
  719. /*************************************************************************
  720. /*
  721. /* matricing_fft()
  722. /*
  723. /* To get the best results in psychoacoustics there must be both,
  724. /* the matriced and the not matriced signal. This matricing
  725. /* may be in full bandwith.
  726.  *
  727.  * If LFE is not enabled, "buffer" contains:
  728.  * buffer[0] L
  729.  * buffer[1] R
  730.  * buffer[2] C
  731.  * buffer[3] Ls
  732.  * buffer[4] Rs
  733.  *
  734.  * If LFE is enabled, "buffer" contains:
  735.  * buffer[0] L
  736.  * buffer[1] R
  737.  * buffer[2] C
  738.  * buffer[3] LFE
  739.  * buffer[4] Ls
  740.  * buffer[5] Rs
  741.  *
  742.  * This function matrixes the original audio samples to pass to the
  743.  * psychoacoustic model. The model considers the matrixed and non-
  744.  * matrixed versions of the signal, so both are retained here.
  745.  * 
  746.  * On exit, buffer_matr[0] to buffer_matr[6] contain the channels
  747.  * Lo, Ro, C, Ls, Rs, L, R, respectively.
  748.  *
  749.  **************************************************************************/
  750. void matricing_fft (double (*buffer)[1152],
  751.     double (*buffer_matr)[1152],
  752.     frame_params *fr_ps)
  753. {
  754.     double matrNorm; /* factor for normalizing JMZ */
  755.     double matrC; /* weighting factor for C */
  756.     double matrLsRs; /* weighting factor for Ls, Rs */
  757.     double mono_surround;
  758.     int i, j, k, l;
  759.     int lfe, lfe_pos;
  760.     double dummy;
  761.     
  762.     layer *info = fr_ps->header;
  763.     lfe = info->lfe;
  764.     lfe_pos = fr_ps->lfe_pos;
  765.     switch(info->matrix)
  766.     {
  767.     case 0:
  768.     case 2: matrNorm = 1 / (1 + sqrt(2.0));
  769.     matrC = 1 / sqrt(2.0);
  770.     matrLsRs = 1 / sqrt(2.0);
  771.     break;
  772.     case 1: matrNorm = 1 / (1.5 + 0.5*sqrt(2.0));
  773.     matrC = 1 / sqrt(2.0);
  774.     matrLsRs = 0.5;
  775.     break;
  776.     case 3: matrNorm = 1;
  777.     matrC = 1;
  778.     matrLsRs = 1;
  779.     break;
  780.     }
  781.     for (i = 0; i < 1152; i++)
  782.     {
  783. if (lfe && lfe_pos < 3)
  784.     buffer_matr[2][i] = buffer[3][i];
  785. else
  786.     buffer_matr[2][i] = buffer[2][i];
  787. buffer_matr[3][i] = buffer[3+lfe][i];
  788. buffer_matr[4][i] = buffer[4+lfe][i];
  789. buffer_matr[5][i] = buffer[0][i];
  790. buffer_matr[6][i] = buffer[1][i];
  791.    
  792. switch (info->matrix)
  793. {
  794. case 0:
  795. case 1: buffer_matr[0][i] = matrNorm*(buffer[0][i] + matrC*buffer_matr[2][i] + matrLsRs*buffer_matr[3][i]);
  796. buffer_matr[1][i] = matrNorm*(buffer[1][i] + matrC*buffer_matr[2][i] + matrLsRs*buffer_matr[4][i]);
  797. break;
  798. case 2: mono_surround = (buffer_matr[3][i] + buffer_matr[4][i]) / 2.0;
  799. buffer_matr[0][i] = matrNorm*(buffer[0][i] + matrC*buffer_matr[2][i] - matrLsRs * mono_surround);
  800. buffer_matr[1][i] = matrNorm*(buffer[1][i] + matrC*buffer_matr[2][i] + matrLsRs * mono_surround);
  801. break;
  802. case 3: buffer_matr[0][i] = buffer[0][i];
  803. buffer_matr[1][i] = buffer[1][i];
  804. break;
  805. }
  806.    }
  807. }
  808. #ifdef Augmentation_7ch
  809. /*************************************************************************
  810. /*
  811. /* matricing_aug_fft()
  812. /*
  813. /* To get the best results in psychoacoustics there must be both,
  814. /* the matriced and the not matriced signal. This matricing
  815. /* may be in full bandwith.
  816.  *
  817.  * If LFE is not enabled, "buffer" contains:
  818.  * buffer[0] L
  819.  * buffer[1] R
  820.  * buffer[2] C
  821.  * buffer[3] Ls
  822.  * buffer[4] Rs
  823.  * buffer[5] Lc
  824.  * buffer[6] Rc
  825.  *
  826.  * If LFE is enabled, "buffer" contains:
  827.  * buffer[0] L
  828.  * buffer[1] R
  829.  * buffer[2] C
  830.  * buffer[3] LFE
  831.  * buffer[4] Ls
  832.  * buffer[5] Rs
  833.  * buffer[6] Lc
  834.  * buffer[7] Rc
  835.  *
  836.  * This function matrixes the original audio samples to pass to the
  837.  * psychoacoustic model. The model considers the matrixed and non-
  838.  * matrixed versions of the signal, so both are retained here.
  839.  * 
  840.  * On exit, buffer[0] to buffer[5] contain the channels
  841.  * L5, R5, C5, (LFE, ) Ls, Rs, respectively.
  842.  * On exit, buffer_matr[7] to buffer_matr[11] contain the channels
  843.  * L7, R7, C7, Lc and Rc respectively.
  844.  *
  845.  **************************************************************************/
  846. void matricing_aug_fft (double (*buffer)[1152],
  847. double (*buffer_matr)[1152],
  848. frame_params *fr_ps)
  849. {
  850.     double matrNorm; /* factor for normalizing JMZ */
  851.     double matrC; /* weighting factor for C */
  852.     double matrLR; /* weighting factor for L, R */
  853.     double matrLsRs; /* weighting factor for Ls, Rs */
  854.     int i, j, k, l;
  855.     int lfe;
  856.     double dummy;
  857.     
  858.     layer *info = fr_ps->header;
  859.     lfe = info->lfe;
  860.   
  861.     switch (info->aug_mtx_proc)
  862.     {
  863.     case 0:
  864.   matrNorm = 1 / 1.75;
  865.   matrC = 0.25;
  866.   matrLR = 0.75;
  867.   break;
  868.     case 1:
  869.   matrNorm = 0.5;
  870.   matrC = 0;
  871.   matrLR = 1;
  872.   break;
  873.     case 3:
  874.   matrNorm = 1;
  875.   matrC = 0;
  876.   matrLR = 0;
  877.   break;
  878.     }
  879.     for (i = 0; i < 1152; i++)
  880.     {
  881. buffer_matr[3][i] = buffer[3+lfe][i]; /* Ls */
  882. buffer_matr[4][i] = buffer[4+lfe][i]; /* Rs */
  883.    
  884. buffer_matr[7][i] = buffer[0][i]; /* L7 */
  885. buffer_matr[8][i] = buffer[1][i]; /* R7 */
  886. buffer_matr[9][i] = buffer[2][i]; /* C7 */
  887. buffer_matr[10][i] = buffer[5+lfe][i]; /* Lc */
  888. buffer_matr[11][i] = buffer[6+lfe][i]; /* Rc */
  889. /* calculate L5, R5, C5 */
  890. buffer_matr[0][i] = matrNorm * (buffer_matr[7][i] + matrLR * buffer_matr[10][i]);
  891. buffer_matr[1][i] = matrNorm * (buffer_matr[8][i] + matrLR * buffer_matr[11][i]);
  892. buffer_matr[2][i] = matrNorm * (buffer_matr[9][i] + matrC * (buffer_matr[10][i] + buffer_matr[11][i]));
  893.     }
  894.     switch (info->matrix)
  895.     {
  896.     case 0:
  897.     case 2:
  898.   matrNorm = 1 / (1 + sqrt(2.0));
  899.   matrC = 1 / sqrt(2.0);
  900.   matrLsRs = 1 / sqrt(2.0);
  901.   break;
  902.     case 1:
  903.   matrNorm = 1 / (1.5 + 0.5*sqrt(2.0));
  904.   matrC = 1 / sqrt(2.0);
  905.   matrLsRs = 0.5;
  906.   break;
  907.     case 3:
  908.   matrNorm = 1;
  909.   matrC = 1;
  910.   matrLsRs = 1;
  911.   break;
  912.     }
  913.     for (i = 0; i < 1152; i++)
  914.     {
  915. buffer_matr[5][i] = buffer_matr[0][i];
  916. buffer_matr[6][i] = buffer_matr[1][i];
  917.    
  918. switch (info->matrix)
  919. {
  920. case 0:
  921. case 1: buffer_matr[0][i] = matrNorm * (buffer_matr[0][i] +
  922. matrC * buffer_matr[2][i] +
  923. matrLsRs * buffer_matr[3][i]);
  924. buffer_matr[1][i] = matrNorm * (buffer_matr[1][i] +
  925. matrC * buffer_matr[2][i] +
  926. matrLsRs * buffer_matr[4][i]);
  927. break;
  928. case 2: buffer_matr[0][i] = matrNorm * (buffer_matr[0][i] +
  929. matrC * buffer_matr[2][i] -
  930. matrLsRs * 0.5 *
  931.  (buffer_matr[3][i] + buffer_matr[4][i]));
  932. buffer_matr[1][i] = matrNorm * (buffer_matr[1][i] +
  933. matrC * buffer_matr[2][i] +
  934. matrLsRs * 0.5 *
  935.  (buffer_matr[3][i] + buffer_matr[4][i]));
  936. break;
  937. }
  938.     }
  939. }
  940. #endif
  941. /************************************************************************/
  942. /*
  943. /* read_ana_window()
  944. /*
  945. /* PURPOSE:  Reads encoder window file "enwindow" into array #ana_win#
  946. /*
  947. /************************************************************************/
  948.  
  949. void read_ana_window(double *ana_win)
  950.        /*far*/                   
  951. {
  952.     int i,j[4];
  953.     FILE *fp;
  954.     double f[4];
  955.     char t[150];
  956.  
  957.     if (!(fp = OpenTableFile("enwindow") ) ) {
  958.        printf("Please check analysis window table 'enwindow'n");
  959.        exit(1);
  960.     }
  961.     for (i=0;i<512;i+=4) {
  962.        fgets(t, 80, fp); /* changed from 150, 92-08-11 shn */
  963.        sscanf(t,"C[%d] = %lf C[%d] = %lf C[%d] = %lf C[%d] = %lfn",
  964.               j, f,j+1,f+1,j+2,f+2,j+3,f+3);
  965.        if (i==j[0]) {
  966.           ana_win[i] = f[0];
  967.           ana_win[i+1] = f[1];
  968.           ana_win[i+2] = f[2];
  969.           ana_win[i+3] = f[3];
  970.        }
  971.        else {
  972.           printf("Check index in analysis window tablen");
  973.           exit(1);
  974.        }
  975.        fgets(t,80,fp); /* changed from 150, 92-08-11 shn */
  976.     }
  977.     fclose(fp);
  978. }
  979. /************************************************************************/
  980. /*
  981. /* window_subband()
  982. /*
  983. /* PURPOSE:  Overlapping window on PCM samples
  984. /*
  985. /* SEMANTICS:
  986. /* 32 16-bit pcm samples are scaled to fractional 2's complement and
  987. /* concatenated to the end of the window buffer #x#. The updated window
  988. /* buffer #x# is then windowed by the analysis window #c# to produce the
  989. /* windowed sample #z#
  990. /*
  991. /************************************************************************/
  992.  
  993. void window_subband (double **buffer, double *z, int k)
  994. {
  995.     typedef double XX[14][HAN_SIZE]; /* 08/03/1995 JMZ Multilingual */
  996.     static XX *x;
  997.     int i, j;
  998.     static off[14]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0};/* 08/03/1995 JMZ Multilingual */
  999.     static char init = 0;
  1000.     static double *c;
  1001.  
  1002.     if (!init)
  1003.     {
  1004. c = (double *) mem_alloc (sizeof(double) * HAN_SIZE, "window");
  1005. read_ana_window (c);
  1006. x = (XX *) mem_alloc (sizeof(XX), "x");
  1007. for (i = 0; i < 14; i++)
  1008.    for (j = 0; j < HAN_SIZE; j++)
  1009.  (*x)[i][j] = 0;
  1010. init = 1;
  1011.     }
  1012.  
  1013.     for (i = 0; i < 32; i++)
  1014. (*x)[k][31-i+off[k]] = (double) *(*buffer)++ / SCALE;
  1015.     for (i = 0; i < HAN_SIZE; i++)
  1016. z[i] = (*x)[k][(i+off[k])&HAN_SIZE-1] * c[i];
  1017.     off[k] += 480; /*offset is modulo (HAN_SIZE-1)*/
  1018.     off[k] &= HAN_SIZE-1;
  1019. }
  1020.  
  1021. /************************************************************************/
  1022. /*
  1023. /* create_ana_filter()
  1024. /*
  1025. /* PURPOSE:  Calculates the analysis filter bank coefficients
  1026. /*
  1027. /* SEMANTICS:
  1028. /* Calculates the analysis filterbank coefficients and rounds to the
  1029. /* 9th decimal place accuracy of the filterbank tables in the ISO
  1030. /* document.  The coefficients are stored in #filter#
  1031. /*
  1032. /************************************************************************/
  1033.  
  1034. void create_ana_filter(double (*filter)[64])
  1035.        /*far*/                     
  1036. {
  1037.    register int i,k;
  1038.  
  1039.    for (i = 0; i < 32; i++)
  1040.       for (k = 0; k < 64; k++) {
  1041.           if ((filter[i][k] = 1e9*cos((double)((2*i+1)*(16-k)*PI64))) >= 0)
  1042.              modf(filter[i][k]+0.5, &filter[i][k]);
  1043.           else
  1044.              modf(filter[i][k]-0.5, &filter[i][k]);
  1045.           filter[i][k] *= 1e-9;
  1046.    }
  1047. }
  1048. /************************************************************************/
  1049. /*
  1050. /* filter_subband()
  1051. /*
  1052. /* PURPOSE:  Calculates the analysis filter bank coefficients
  1053. /*
  1054. /* SEMANTICS:
  1055. /*      The windowed samples #z# is filtered by the digital filter matrix #m#
  1056. /* to produce the subband samples #s#. This done by first selectively
  1057. /* picking out values from the windowed samples, and then multiplying
  1058. /* them by the filter matrix, producing 32 subband samples.
  1059. /*
  1060. /************************************************************************/
  1061.  
  1062. void filter_subband_old(double *z, double *s)
  1063.        /*far*/                         
  1064. {
  1065.    double y[64];
  1066.    int i,j, k;
  1067. static char init = 0;
  1068.    typedef double MM[SBLIMIT][64];
  1069. static MM /*far*/ *m;
  1070.    double sum1, sum2;
  1071.    
  1072. #ifdef MS_DOS
  1073.    long    SIZE_OF_MM;
  1074.    SIZE_OF_MM      = SBLIMIT*64;
  1075.    SIZE_OF_MM      *= 8;
  1076.    if (!init) {
  1077.        m = (MM /*far*/ *) mem_alloc(SIZE_OF_MM, "filter");
  1078.        create_ana_filter(*m);
  1079.        init = 1;
  1080.    }
  1081. #else
  1082.    if (!init) {
  1083.        m = (MM /*far*/ *) mem_alloc(sizeof(MM), "filter");
  1084.        create_ana_filter(*m);
  1085.        init = 1;
  1086.    }
  1087. #endif
  1088.    /* Window */
  1089.    for (i=0; i<64; i++)
  1090.    {
  1091.       for (k=0, sum1 = 0.0; k<8; k++)
  1092.          sum1 += z[i+64*k];
  1093.       y[i] = sum1;
  1094.    }
  1095.    /* Filter */
  1096.    for (i=0;i<SBLIMIT;i++)
  1097.    {
  1098.        for (k=0, sum1=0.0 ;k<64;k++)
  1099.           sum1 += (*m)[i][k] * y[k];
  1100.        s[i] = sum1;
  1101.    }
  1102. /*   for (i=0;i<64;i++) for (j=0, y[i] = 0;j<8;j++) y[i] += z[i+64*j];*/
  1103. /*   for (i=0;i<SBLIMIT;i++)*/
  1104. /*       for (j=0, s[i]= 0;j<64;j++) s[i] += (*m)[i][j] * y[j];*/
  1105. }
  1106. /************************************************************************/
  1107. /* JMZ 08/03/1995 FILTER */
  1108. void filter_subband(double *z, double *s)
  1109.        /*far*/                         
  1110. {
  1111.    double y[64];
  1112.    int i,j, k;
  1113. static char init = 0;
  1114.    typedef double MM[SBLIMIT][64];
  1115. static MM /*far*/ *m;
  1116.    double sum1, sum2;
  1117.   
  1118.    if (!init) {
  1119.        m = (MM /*far*/ *) mem_alloc(sizeof(MM), "filter");
  1120.        create_ana_filter(*m);
  1121.        init = 1;
  1122.    }
  1123.    /* Window */
  1124.    for (i=0; i<64; i++)
  1125.    {
  1126.       for (k=0, sum1 = 0.0; k<8; k++)
  1127.          sum1 += z[i+64*k];
  1128.       y[i] = sum1;
  1129.    }
  1130.    /* Filter */
  1131. #if VERY_FAST_FILTER 
  1132.    for (i=0; i<SBLIMIT/2; i++)
  1133.    {
  1134.        for (k=0, sum1=0.0, sum2=0.0; k<16;)
  1135.        {
  1136. sum1 += (*m)[i][k] * (y[k]+y[32-k]); 
  1137. sum2 += (*m)[i][k+1] * (y[k+1]+y[31-k]); 
  1138. sum2 += (*m)[i][k+33] * (y[k+33]-y[63-k]); 
  1139. sum1 += (*m)[i][k+34] * (y[k+34]-y[62-k]); 
  1140. k+=2;
  1141.        }
  1142. sum1 += (*m)[i][16]*y[16] - (*m)[i][48]*y[48]; 
  1143. s[i]    = sum1 + sum2;
  1144. s[31-i] = sum1 - sum2;
  1145.    }
  1146. #else
  1147.    for (i=0;i<SBLIMIT;i++)
  1148.    {
  1149.        for (k=0, sum1=0.0 ;k<64;k++)
  1150.           sum1 += (*m)[i][k] * y[k];
  1151.        s[i] = sum1;
  1152.    }
  1153. #endif /*VERY_FAST_FILTER*/
  1154. }
  1155. /* JMZ 08/03/1995 FILTER */
  1156. /************************************************************************/
  1157. /************************************************************************/
  1158. /*
  1159. /* encode_info()
  1160. /* encode_infomc1() SR
  1161. /* encode_infomc2() SR
  1162. /*
  1163. /* PURPOSE:  Puts the syncword and header information on the output
  1164. /* bitstream.
  1165. /*
  1166. /************************************************************************/
  1167.  
  1168. void encode_info (frame_params *fr_ps, Bit_stream_struc *bs)
  1169. {
  1170.     layer *info = fr_ps->header;
  1171.     putbits (bs, 0xfff, 12);                   /* syncword 12 bits */
  1172.     put1bit (bs, info->version);               /* ID        1 bit  */
  1173.     putbits (bs, 4-info->lay, 2);              /* layer     2 bits */
  1174.     put1bit (bs, !info->error_protection);     /* bit set => no err prot */
  1175.     putbits (bs, info->bitrate_index, 4);
  1176.     putbits (bs, info->sampling_frequency, 2);
  1177.     put1bit (bs, info->padding);
  1178.     put1bit (bs, info->extension);             /* private_bit */
  1179.     putbits (bs, info->mode, 2);
  1180.     putbits (bs, info->mode_ext, 2);
  1181.     put1bit (bs, info->copyright);
  1182.     put1bit (bs, info->original);
  1183.     putbits (bs, info->emphasis, 2);
  1184. }
  1185. void encode_info_mc1 (frame_params *fr_ps, Bit_stream_struc *bs)
  1186. {
  1187.     layer *info = fr_ps->header;
  1188.     put1bit (bs, info->ext_bit_stream_present);
  1189.     if(info->ext_bit_stream_present == 1) 
  1190.       putbits (bs, info->n_ad_bytes, 8); 
  1191.     putbits (bs, info->center, 2); 
  1192.     putbits (bs, info->surround, 2);
  1193.     put1bit (bs, info->lfe);
  1194.     put1bit (bs, info->audio_mix);
  1195.     putbits (bs, info->matrix, 2);
  1196.     putbits (bs, info->multiling_ch, 3);
  1197.     put1bit (bs, info->multiling_fs);
  1198.     put1bit (bs, info->multiling_lay);
  1199.     put1bit (bs, info->copy_ident_bit);
  1200.     put1bit (bs, info->copy_ident_start);
  1201. }
  1202. void encode_info_mc2 (frame_params *fr_ps, Bit_stream_struc *bs)
  1203. {
  1204.     layer *info = fr_ps->header;
  1205.     int i, j;       
  1206.     put1bit (bs, info->tc_sbgr_select);
  1207.     put1bit (bs, info->dyn_cross_on);
  1208.     put1bit (bs, info->mc_prediction_on);
  1209.     /* 960627 FdB tca bits dependent on configuration */
  1210.     if (fr_ps->config == 320 || fr_ps->config == 310)
  1211.     {
  1212. /* 3 bits for tca's */
  1213. if (info->tc_sbgr_select == 1)
  1214.     putbits (bs, info->tc_allocation, 3);
  1215. else
  1216.     for (i = 0; i < 12; i++)
  1217. putbits (bs, info->tc_alloc[i], 3);
  1218.     }
  1219.     else if (fr_ps->config == 300 || fr_ps->config == 302 ||
  1220.      fr_ps->config == 220 || fr_ps->config == 210)
  1221.     {
  1222. /* 2 bits for tca's */
  1223. if (info->tc_sbgr_select == 1)
  1224.     putbits (bs, info->tc_allocation, 2);
  1225. else
  1226.     for (i = 0; i < 12; i++)
  1227. putbits (bs, info->tc_alloc[i], 2);
  1228.     }
  1229.     if (info->dyn_cross_on == 1)
  1230.     {
  1231. put1bit (bs, info->dyn_cross_LR);
  1232. for (i = 0; i < 12; i++)
  1233. {
  1234.     /* 960627 FdB DynX bits dependent on configuration */
  1235.     if (fr_ps->config == 320)
  1236. /* 3/2 */
  1237. putbits (bs, info->dyn_cross[i], 4);
  1238.     else if (fr_ps->config == 310 || fr_ps->config == 220)
  1239. /* 3/1 and 2/2 */
  1240. putbits (bs, info->dyn_cross[i], 3);
  1241.     else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
  1242. /* 3/0 (+2/0) and 2/1 */
  1243. putbits (bs, info->dyn_cross[i], 1);
  1244.   
  1245.     if (info->surround == 3)
  1246. put1bit (bs, info->dyn_second_stereo[i]);
  1247. }     
  1248.     }
  1249.     if (info->mc_prediction_on == 1)
  1250.     {
  1251. for(i = 0; i < 8; i++)
  1252. {
  1253.     put1bit (bs, info->mc_pred[i]);  
  1254.     if (info->mc_pred[i] == 1)
  1255.     {
  1256. for (j = 0; j < n_pred_coef[info->dyn_cross[i]]; j++)
  1257.     putbits (bs, info->predsi[i][j], 2);
  1258.     }
  1259. }  
  1260.     }
  1261. }   
  1262.     
  1263. #ifdef Augmentation_7ch
  1264. void encode_info_aug (frame_params *fr_ps, Bit_stream_struc *bs)
  1265. {
  1266.     int sbgr;
  1267.     layer *info = fr_ps->header;
  1268.     putbits (bs, info->aug_mtx_proc,  2);
  1269.     put1bit (bs, info->aug_dyn_cross_on);
  1270.     put1bit (bs, info->aug_future_ext);
  1271.     if (info->aug_mtx_proc == 0)
  1272. for (sbgr = 0; sbgr < 12; sbgr++)
  1273.     putbits (bs, info->aug_tc_alloc[sbgr], 3); 
  1274.     else if (info->aug_mtx_proc == 1)
  1275. for (sbgr = 0; sbgr < 12; sbgr++)
  1276.     putbits (bs, info->aug_tc_alloc[sbgr], 2); 
  1277.     if (info->aug_dyn_cross_on == 1)
  1278. for (sbgr = 0; sbgr < 12; sbgr++)
  1279.     putbits (bs, info->aug_dyn_cross[sbgr], 5); 
  1280. }
  1281. #endif
  1282. void encode_info_ext1 (frame_params *fr_ps, Bit_stream_struc *bs_ext)
  1283. {
  1284.     layer *info = fr_ps->header;
  1285.     info->ext_sync = 0x7ff;
  1286.     putbits (bs_ext, info->ext_sync, 12); 
  1287. }
  1288. void encode_info_ext2 (frame_params *fr_ps, Bit_stream_struc *bs_ext, unsigned int crc)
  1289. {
  1290.     layer *info = fr_ps->header;
  1291.     putbits (bs_ext, crc, 16);
  1292.     putbits (bs_ext, info->ext_length, 11);
  1293.     put1bit (bs_ext, info->ext_bit);
  1294. }
  1295. /************************************************************************/
  1296. /*
  1297. /* mod()
  1298. /*
  1299. /* PURPOSE:  Returns the absolute value of its argument
  1300. /*
  1301. /************************************************************************/
  1302.  
  1303. double mod(double a)
  1304. {
  1305.     return (a > 0) ? a : -a;
  1306. }
  1307.  
  1308. /************************************************************************/
  1309. /*
  1310. /* I_combine_LR    (Layer I)
  1311. /* II_combine_LR  (Layer II)
  1312. /*
  1313. /* PURPOSE:Combines left and right channels into a mono channel
  1314. /*
  1315. /* SEMANTICS:  The average of left and right subband samples is put into
  1316. /* #joint_sample#
  1317. /*
  1318. /* Layer I and II differ in frame length and # subbands used
  1319. /*
  1320. /************************************************************************/
  1321.  
  1322. void I_combine_LR(double (*sb_sample)[3][12][32], double (*joint_sample)[3][12][32])
  1323.        /*far*/                                       
  1324.        /*far*/                                          
  1325. {   /* make a filtered mono for joint stereo */
  1326.     int sb, smp;
  1327.  
  1328.    for(sb = 0; sb<SBLIMIT; ++sb)
  1329.       for(smp = 0; smp<SCALE_BLOCK; ++smp)
  1330.   joint_sample[0][0][smp][sb] = .5 *
  1331.                     (sb_sample[0][0][smp][sb] + sb_sample[1][0][smp][sb]);
  1332. }
  1333.  
  1334. void II_combine_LR(double (*sb_sample)[3][12][32], double (*joint_sample)[3][12][32], int sblimit)
  1335.        /*far*/                                       
  1336.        /*far*/                                          
  1337.             
  1338. {  /* make a filtered mono for joint stereo */
  1339.    int sb, smp, sufr;
  1340.  
  1341.    for(sb = 0; sb<sblimit; ++sb)
  1342.       for(smp = 0; smp<SCALE_BLOCK; ++smp)
  1343.          for(sufr = 0; sufr<3; ++sufr)
  1344. joint_sample[0][sufr][smp][sb] = .5 * (sb_sample[0][sufr][smp][sb]
  1345.                                           + sb_sample[1][sufr][smp][sb]);
  1346. }
  1347. /************************************************************************
  1348. /*
  1349. /* I_scale_factor_calc     (Layer I)
  1350. /* II_scale_factor_calc    (Layer II)
  1351. /*
  1352. /* PURPOSE:For each subband, calculate the scale factor for each set
  1353. /* of the 12 (6 in case of lsf ML) subband samples
  1354. /*
  1355. /* SEMANTICS:  Pick the scalefactor #multiple[]# just larger than the
  1356. /* absolute value of the peak subband sample of 12 samples,
  1357. /* and store the corresponding scalefactor index in #scalar#.
  1358. /*
  1359. /* Layer II has three sets of 12 (6 in case of lsf ML) subband samples 
  1360. /* for a given subband.
  1361. /*
  1362. /************************************************************************/
  1363.  
  1364. void I_scale_factor_calc(double (*sb_sample)[3][12][32], unsigned int (*scalar)[3][32], int stereo)
  1365.        /*far*/                                       
  1366.                                    
  1367.            
  1368. {
  1369.    int i,j, k;
  1370.    double s[SBLIMIT];
  1371.  
  1372.    for (k=0;k<stereo;k++) {
  1373.      for (i=0;i<SBLIMIT;i++)
  1374.        for (j=1, s[i] = mod(sb_sample[k][0][0][i]);j<SCALE_BLOCK;j++)
  1375.          if (mod(sb_sample[k][0][j][i]) > s[i])
  1376.             s[i] = mod(sb_sample[k][0][j][i]);
  1377.  
  1378.      for (i=0;i<SBLIMIT;i++)
  1379.        for (j=SCALE_RANGE-1,scalar[k][0][i]=0;j>=0;j--)
  1380.          if (s[i] < multiple[j]) { /* <= changed to <, 1992-11-06 shn */
  1381.             scalar[k][0][i] = j;
  1382.             break;
  1383.          }
  1384.    }
  1385. }
  1386. /******************************** Layer II ******************************/
  1387.  
  1388. void II_scale_factor_calc (frame_params *fr_ps,
  1389.    double (*sb_sample)[3][12][32],
  1390.    unsigned int (*scalar)[3][32],
  1391.    int sblimit, int l, int m)
  1392. /* sblimit has the value of sblimit_ml in case II_scale_factor_calc */
  1393. /* is called in a ML channel , 7/8/95 WtK                          */
  1394. {
  1395.     int    i,j, k,t;
  1396.     double s[SBLIMIT];
  1397.     int    leng;
  1398.    
  1399.     leng = SCALE_BLOCK; /* == 12 */
  1400.     if (l >= 7 && fr_ps->header->multiling_fs == 1)
  1401. leng /= 2;
  1402.   
  1403.     for (k = l; k < m; k++)
  1404. for (t = 0; t < 3; t++) 
  1405. {
  1406.     for (i = 0; i < sblimit; i++)
  1407. for (j = 1, s[i] = mod (sb_sample[k][t][0][i]); j < leng; j++)
  1408.     if (mod (sb_sample[k][t][j][i]) > s[i])
  1409. s[i] = mod (sb_sample[k][t][j][i]);
  1410.    
  1411.     for (i = 0; i < sblimit; i++)
  1412. for (j = SCALE_RANGE - 1, scalar[k][t][i] = 0; j >= 0; j--)
  1413.     if (s[i] < multiple[j]) 
  1414.     {
  1415. /* <= changed to <, 1992-11-06 shn */
  1416. scalar[k][t][i] = j;
  1417. break;
  1418.     }
  1419.     for (i = sblimit; i < SBLIMIT; i++)
  1420. scalar[k][t][i] = SCALE_RANGE - 1;
  1421. }
  1422. /***************************************************************************
  1423. /* void II_scale_factor_calc1(sb_sample, scalar, stereo, sblimit)
  1424. /*
  1425. /* in case of any joint stereo the scalefactor must be computed
  1426. /* a second time for the combind samples
  1427. /*
  1428. /***************************************************************************/
  1429. void II_scale_factor_calc1(double (*sb_sample)[3][12][32], unsigned int (*scalar)[3][32], int sblimit, int dim)
  1430.        /*far*/                                       
  1431.                                    
  1432.             
  1433.         
  1434. {
  1435.   int i,j, k,t;
  1436.   double s[SBLIMIT];
  1437. for (t=0;t<3;t++) {
  1438.  for (i=0;i<sblimit;i++)
  1439. for (j=1, s[i] = mod(sb_sample[dim][t][0][i]);j<SCALE_BLOCK;j++)
  1440.   if (mod(sb_sample[dim][t][j][i]) > s[i])
  1441.  s[i] = mod(sb_sample[dim][t][j][i]);
  1442.   for (i=0;i<sblimit;i++)
  1443.  for (j=SCALE_RANGE-1,scalar[dim][t][i]=0;j>=0;j--)
  1444. if (s[i] < multiple[j]) { /* <= changed to <, 1992-11-06 shn */
  1445. scalar[dim][t][i] = j;
  1446. break;
  1447. }
  1448. for (i=sblimit;i<SBLIMIT;i++) scalar[dim][t][i] = SCALE_RANGE-1;
  1449.  }
  1450. }
  1451. /************************************************************************
  1452. /*
  1453. /* pick_scale  (Layer II)
  1454. /*
  1455. /* PURPOSE:For each subband, puts the smallest scalefactor of the 3
  1456. /* associated with a frame into #max_sc#.  This is used
  1457. /* used by Psychoacoustic Model I.
  1458. /* (I would recommend changin max_sc to min_sc)
  1459. /*
  1460. /************************************************************************/
  1461.  
  1462. void pick_scale (unsigned int (*scalar)[3][32],
  1463.  frame_params *fr_ps,
  1464.  double (*max_sc)[32],
  1465.  int cha_sw,
  1466.  int aug_cha_sw,
  1467.  int aiff)         
  1468. {
  1469.     int i,j,k,l,m;
  1470.     int max;
  1471.     int stereo  = fr_ps->stereo;
  1472.     int stereomc = fr_ps->stereomc;
  1473.     int stereoaug = fr_ps->stereoaug;
  1474.     int sblimit = fr_ps->sblimit;
  1475.     int sblimit_mc = fr_ps->sblimit_mc;
  1476.     int sblimit_ml = fr_ps->sblimit_ml;
  1477.     int n_ml_ch = fr_ps->header->multiling_ch; /* 08/03/1995 JMZ Multilingual */
  1478.    
  1479.   
  1480.     if (aiff != 1)
  1481.     {
  1482.        l = 0; m = stereo;
  1483.     }
  1484.     else
  1485.     {   
  1486.        l = 0;
  1487.        if (stereoaug == 2) m = 12;
  1488.        else    m = 7;
  1489.     }
  1490.   
  1491.     for (k = 0; k < stereo; k++)
  1492.     {
  1493. for (i = 0; i < sblimit; max_sc[k][i] = multiple[max], i++)
  1494.     for (j=1, max = scalar[k][0][i];j<3;j++)
  1495.         if (max > scalar[k][j][i])
  1496.     max = scalar[k][j][i];
  1497. for (i = sblimit; i < SBLIMIT;i++)
  1498.     max_sc[k][i] = 1E-20;
  1499.     }  
  1500.   
  1501.     for (k = stereo; k < m; k++)
  1502.     {
  1503. for (i = 0; i < sblimit_mc; max_sc[k][i] = multiple[max], i++)
  1504.     for (j=1, max = scalar[k][0][i];j<3;j++)
  1505.         if (max > scalar[k][j][i])
  1506.     max = scalar[k][j][i];
  1507. for (i = sblimit_mc; i < SBLIMIT;i++)
  1508.     max_sc[k][i] = 1E-20;
  1509.     }  
  1510.   
  1511.     if (aiff == 1)
  1512.     {
  1513. /* OLD 961114 FdB
  1514. if (fr_ps->header->matrix == 3 || cha_sw == 0)
  1515. {
  1516.     fr_ps->header->tc_sbgr_select = 1;
  1517.     for (i = 0; i < 12; i++)
  1518. fr_ps->header->tc_alloc[i] = 0;
  1519. }
  1520. else
  1521.     tc_alloc (fr_ps, max_sc);
  1522. */
  1523. for (i = 0; i < 12; i++)
  1524.     if (cha_sw == -1 && fr_ps->header->matrix != 3)
  1525. switch (fr_ps->config)
  1526. {
  1527. case 320:
  1528. if (fr_ps->header->center == 3 && i >= 10)   /* tc_alloc = 0,3,4,5 */
  1529. {
  1530.     fr_ps->header->tc_alloc[i] = rand () % 4;
  1531.     if (fr_ps->header->tc_alloc[i] > 0)
  1532. fr_ps->header->tc_alloc[i] += 2;
  1533. }
  1534. else
  1535.     fr_ps->header->tc_alloc[i] = rand () % 8;
  1536. break;
  1537. case 310:
  1538. if (fr_ps->header->center == 3 && i >= 10)   /* tc_alloc = 0,3,4 */
  1539. {
  1540.     fr_ps->header->tc_alloc[i] = rand () % 3;
  1541.     if (fr_ps->header->tc_alloc[i] > 0)
  1542. fr_ps->header->tc_alloc[i] += 2;
  1543. }
  1544. else if (fr_ps->header->matrix == 2)
  1545.     fr_ps->header->tc_alloc[i] = rand () % 6;
  1546. else
  1547.     fr_ps->header->tc_alloc[i] = rand () % 5;
  1548. break;
  1549. case 300:
  1550. case 302:
  1551. if (fr_ps->header->center == 3 && i >= 10)   /* tc_alloc = 0 */
  1552.     fr_ps->header->tc_alloc[i] = 0;
  1553. else
  1554.     fr_ps->header->tc_alloc[i] = rand () % 3;
  1555. break;
  1556. case 220:
  1557. fr_ps->header->tc_alloc[i] = rand () % 4;
  1558. break;
  1559. case 210:
  1560. fr_ps->header->tc_alloc[i] = rand () % 3;
  1561. break;
  1562. default:
  1563. break;
  1564. }
  1565.     else if (cha_sw == -2 && fr_ps->header->matrix != 3)
  1566.      tc_alloc (fr_ps, max_sc);
  1567.     else if (fr_ps->header->matrix == 3)
  1568. fr_ps->header->tc_alloc[i] = 0;
  1569.     else
  1570. fr_ps->header->tc_alloc[i] = cha_sw;
  1571. fr_ps->header->tc_sbgr_select = 1;
  1572. fr_ps->header->tc_allocation = fr_ps->header->tc_alloc[0];
  1573. for (i = 1; i < 12; i++)
  1574.     if (fr_ps->header->tc_alloc[i] != fr_ps->header->tc_alloc[0])
  1575.      fr_ps->header->tc_sbgr_select = 0;
  1576. #ifdef Augmentation_7ch
  1577. for (i = 0; i < 12; i++)
  1578.     if (aug_cha_sw == -1)
  1579. switch (fr_ps->header->aug_mtx_proc)
  1580. {
  1581. case 0: fr_ps->header->aug_tc_alloc[i] = rand () % 8;
  1582. break;
  1583. case 1: fr_ps->header->aug_tc_alloc[i] = rand () % 4;
  1584. break;
  1585. case 3: fr_ps->header->aug_tc_alloc[i] = 0;
  1586. break;
  1587. }
  1588.     else
  1589. fr_ps->header->aug_tc_alloc[i] = aug_cha_sw;
  1590. #endif
  1591.     }
  1592.   
  1593. /********************************************************/
  1594. /* JMZ 08/03/1995 Multilingual , WtK 07/08/95 */
  1595.     if (n_ml_ch > 0)
  1596.     {
  1597. for (k = 7; k < 7 + n_ml_ch; k++)
  1598. {
  1599.     for (i = 0; i < sblimit_ml; max_sc[k][i] = multiple[max], i++)
  1600. for (j = 1, max = scalar[k][0][i]; j < 3; j++)
  1601.     if (max > scalar[k][j][i])
  1602. max = scalar[k][j][i];
  1603.   for (i= sblimit_ml; i < SBLIMIT;i++)
  1604.     max_sc[k][i] = 1E-20;
  1605. }
  1606.     }
  1607. /* JMZ 08/03/1995 Multilingual */
  1608. /********************************************************/
  1609. }
  1610. /***************************************************************************
  1611. /*
  1612. /* tc_alloc  (Layer II, multichannel)
  1613. /*
  1614. /* PURPOSE: For each subbandgroup the three transmissionchannels are
  1615. /*          determined by taking the channel with the lowest level
  1616. /*          according to the tabel tc_allocation in the draft
  1617. /*  8/10/93, SR          
  1618. /* 
  1619. /*           changed to a certain limit of TC_ALLOC which must be stepped
  1620. /*           beyond, before there is channel-switching
  1621. /*           9/20/93 SR
  1622. /* JMZ 08/03/1995 Ajout pour traiter les differentes configurations 
  1623. /* envisagees dans la norme
  1624. /**************************************************************************/
  1625. void tc_alloc (frame_params *fr_ps, double (*max_sc)[32])
  1626. {
  1627.     layer  *info  = fr_ps->header;
  1628.     int  center  = info->center;
  1629.     int  surround = info->surround;
  1630.     int  matrix  = info->matrix;
  1631.     int  i, l, k;
  1632.     int  min;
  1633.     double  min1;
  1634.     double  min2[7][12];
  1635.     
  1636.     /* 01/03/1995 JMZ Configuration 3/2 */
  1637.     if (surround == 2 && center != 0)
  1638.     {
  1639. /* if (matrix == 3) ->tc_alloc = 0
  1640.    else if (center == 3) ->tc_alloc = 0,3,4,5
  1641.    else ->tc_alloc = 0,1,2,3,4,5,6,7 */
  1642. if (matrix == 3)
  1643. {
  1644.     for (i = 0; i < 12; i++)
  1645. fr_ps->header->tc_alloc[i] = 0;
  1646. }
  1647. else if (center == 3) /* && matrix != 3 */
  1648. {
  1649.     /* 3/2 Phantom Center coding */
  1650.     for (i = 0; i < 8; i++)
  1651.     {
  1652. if (((20 * log10(max_sc[3][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  1653. {
  1654.     if (max_sc[6][i] < max_sc[4][i])
  1655. fr_ps->header->tc_alloc[i] = 5;
  1656.     else
  1657. fr_ps->header->tc_alloc[i] = 3;
  1658. }  
  1659. else if (((20 * log10(max_sc[4][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)
  1660.     fr_ps->header->tc_alloc[i] = 4;
  1661. else
  1662.     fr_ps->header->tc_alloc[i] = 0; 
  1663.     } 
  1664.     for (i = 8; i < 12; i++)
  1665.     {
  1666. for (k = 2; k < 7; k++)
  1667. {
  1668.     min2[k][i] = 0.0;  
  1669.     for (l = (sb_groups[i-1] + 1); l <= sb_groups[i]; l++)
  1670. min2[k][i] += max_sc[k][l];  
  1671.     min2[k][i] = min2[k][i] / (sb_groups[i] - sb_groups[i-1]); 
  1672. }
  1673. if (((20 * log10(min2[3][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  1674. {
  1675.     if (min2[6][i] < min2[4][i])
  1676. fr_ps->header->tc_alloc[i] = 5;
  1677.     else
  1678. fr_ps->header->tc_alloc[i] = 3;
  1679. }  
  1680. else if (((20 * log10(min2[4][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)
  1681.     fr_ps->header->tc_alloc[i] = 4;
  1682. else
  1683.     fr_ps->header->tc_alloc[i] = 0;
  1684.     }
  1685. }
  1686. else
  1687. {
  1688.     /* 3/2 no Phantom Center coding */
  1689.     for (i = 0; i < 8; i++)
  1690.     {
  1691. if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  1692. {
  1693.     if (max_sc[6][i] < max_sc[5][i])
  1694. min = 6;
  1695.     else if (max_sc[6][i] == max_sc[5][i])
  1696.     {
  1697. if (max_sc[3][i] <= max_sc[5][i])
  1698.     min = 5;
  1699. else
  1700.     min = 6;           
  1701.     }
  1702.     else
  1703. min = 5;
  1704. }  
  1705. else if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)
  1706. {
  1707.     min = 6;
  1708.     /* 01/03/1995 JMZ Simplification */
  1709. }  
  1710. else           
  1711. {
  1712.     min = 2;
  1713. }
  1714. switch (min)
  1715. {
  1716.     case 5: if (max_sc[4][i] <= max_sc[6][i])  /* left front,Rs*/
  1717. fr_ps->header->tc_alloc[i] = 1;
  1718.     else
  1719. fr_ps->header->tc_alloc[i] = 7;  /*R*/
  1720.     break;
  1721.     case 6: if (max_sc[3][i] <= max_sc[5][i])  /* right front,Ls*/
  1722. fr_ps->header->tc_alloc[i] = 2;
  1723.     else
  1724. fr_ps->header->tc_alloc[i] = 6;  /* L */
  1725.     break;     
  1726.     case 2: if (((20 * log10(max_sc[3][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  1727.     {
  1728. if  (max_sc[4][i] <= max_sc[6][i])  
  1729.     fr_ps->header->tc_alloc[i] = 3;
  1730.        else
  1731.     fr_ps->header->tc_alloc[i] = 5;
  1732.     }  
  1733.     else
  1734.     {
  1735. if (((20 * log10(max_sc[4][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)  
  1736.     fr_ps->header->tc_alloc[i] = 4;
  1737. else
  1738.     fr_ps->header->tc_alloc[i] = 0;
  1739.     }    
  1740.     break;
  1741. }
  1742.     }
  1743.     for (i = 8; i < 12; i++)    /*taking the average scalefactor of each sb-group*/
  1744.     {
  1745. for (k = 2; k < 7; k++)
  1746. {
  1747.     min2[k][i] = 0.0;  
  1748.     for (l = (sb_groups[i-1] + 1); l <= sb_groups[i]; l++)
  1749. min2[k][i] += max_sc[k][l];  
  1750.     min2[k][i] = min2[k][i] / (sb_groups[i] - sb_groups[i-1]); 
  1751. }
  1752. if (((20 * log10(min2[2][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  1753. {
  1754.     if (min2[6][i] < min2[5][i])
  1755. min = 6;
  1756.     else if (min2[6][i] == min2[5][i])
  1757.     {
  1758. if (min2[3][i] <= min2[5][i])
  1759.     min = 5;
  1760. else
  1761.     min = 6;           
  1762.     }
  1763.     else
  1764. min = 5;
  1765. }  
  1766. else if (((20 * log10(min2[2][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)
  1767. {
  1768.     min = 6;
  1769.     /* 01/03/1995 JMZ Simplification */
  1770. }  
  1771. else           
  1772. {
  1773.     min = 2;
  1774. }
  1775. switch (min)
  1776. {
  1777.     case 5: if (min2[4][i] <= min2[6][i])  /* left front,Rs*/
  1778. fr_ps->header->tc_alloc[i] = 1;
  1779.     else
  1780. fr_ps->header->tc_alloc[i] = 7;  /*R*/
  1781.     break;
  1782.     case 6: if (min2[3][i] <= min2[5][i])  /* right front,Ls*/
  1783. fr_ps->header->tc_alloc[i] = 2;
  1784.     else
  1785. fr_ps->header->tc_alloc[i] = 6;  /* L */
  1786.     break;
  1787.     case 2: if (((20 * log10(min2[3][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  1788.     {
  1789. if (min2[4][i] <= min2[6][i])  
  1790.     fr_ps->header->tc_alloc[i] = 3;
  1791. else
  1792.     fr_ps->header->tc_alloc[i] = 5;
  1793.     }  
  1794.     else
  1795.     {
  1796. if (((20 * log10(min2[4][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)  
  1797.     fr_ps->header->tc_alloc[i] = 4;
  1798. else
  1799.     fr_ps->header->tc_alloc[i] = 0;
  1800.     }    
  1801.     break;
  1802. }
  1803.     }
  1804. }
  1805.     }
  1806.     /* 01/03/1995 JMZ Configuration 3/1 */
  1807.     if (surround == 1 && center != 0)
  1808.     {
  1809. /* if (matrix == 3) ->tc_alloc = 0
  1810.    else if (center == 3) ->tc_alloc = 0,3,4
  1811.    else if (matrix == 2) ->tc_alloc = 0,1,2,3,4,5
  1812.    else ->tc_alloc = 0,1,2,3,4 */
  1813. if (matrix == 3)
  1814. {
  1815.          for (i = 0; i < 12; i++)
  1816. fr_ps->header->tc_alloc[i] = 0;
  1817. }
  1818. else if (center == 3) /* && matrix != 3 */
  1819. {
  1820.     /* 3/1 Phantom Center coding */
  1821.     for (i = 0; i < 8; i++)
  1822.     {
  1823. if (((20 * log10(max_sc[3][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  1824. {
  1825.     if (max_sc[6][i] < max_sc[5][i])
  1826. fr_ps->header->tc_alloc[i] = 4;
  1827.     else
  1828. fr_ps->header->tc_alloc[i] = 3;
  1829. }  
  1830. else if (((20 * log10(max_sc[3][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)
  1831.     fr_ps->header->tc_alloc[i] = 4;
  1832. else
  1833.     fr_ps->header->tc_alloc[i] = 0; 
  1834.     } 
  1835.     for (i = 8; i < 12; i++)    
  1836.     {
  1837. for (k = 2; k < 7; k++)
  1838. {
  1839.     min2[k][i] = 0.0;  
  1840.     for (l = (sb_groups[i-1] + 1); l <= sb_groups[i]; l++)
  1841.     min2[k][i] += max_sc[k][l];  
  1842.     min2[k][i] = min2[k][i] / (sb_groups[i] - sb_groups[i-1]); 
  1843. }
  1844.     
  1845. if (((20 * log10(min2[3][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  1846. {
  1847.     if (min2[6][i] < min2[5][i])
  1848. fr_ps->header->tc_alloc[i] = 4;
  1849.     else 
  1850. fr_ps->header->tc_alloc[i] = 3;
  1851. }  
  1852. else 
  1853.     if (((20 * log10(min2[3][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)
  1854. fr_ps->header->tc_alloc[i] = 4;
  1855.     else   
  1856. fr_ps->header->tc_alloc[i] = 0; 
  1857.     } 
  1858. }
  1859. else
  1860. /*
  1861. if(matrix==2)
  1862. {    
  1863. }
  1864. else
  1865. */
  1866. {
  1867.     /* 3/1 no Phantom Center coding */
  1868.     for (i = 0; i < 8; i++)
  1869.     {
  1870. if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  1871. {
  1872.     if (max_sc[6][i] < max_sc[5][i])
  1873. min = 6;
  1874.     else
  1875. min = 5;
  1876. }  
  1877. else if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)
  1878.     min = 6;
  1879. else           
  1880.     min = 2;
  1881. switch (min)
  1882. {
  1883.     case 5: fr_ps->header->tc_alloc[i] = 1;
  1884.     break;
  1885.     case 6: fr_ps->header->tc_alloc[i] = 2;
  1886.     break;
  1887.     
  1888.     case 2: if (((20 * log10(max_sc[3][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  1889.     {
  1890. if (max_sc[6][i] <= max_sc[5][i])  
  1891.     fr_ps->header->tc_alloc[i] = 4;
  1892. else
  1893.     fr_ps->header->tc_alloc[i] = 3;
  1894.     }  
  1895.     else
  1896.     {
  1897. if (((20 * log10(max_sc[3][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)  
  1898.     fr_ps->header->tc_alloc[i] = 4;
  1899. else
  1900.     fr_ps->header->tc_alloc[i] = 0;
  1901.     }    
  1902.     break;
  1903. }
  1904.     }
  1905.  
  1906.     for (i = 8; i < 12; i++)
  1907.     {
  1908. for (k = 2; k < 7; k++)
  1909. {
  1910.     min2[k][i] = 0.0;  
  1911.     for (l = (sb_groups[i-1] + 1); l <= sb_groups[i]; l++)
  1912. min2[k][i] += max_sc[k][l];  
  1913.     min2[k][i] = min2[k][i] / (sb_groups[i] - sb_groups[i-1]); 
  1914. }
  1915. if (((20 * log10(min2[2][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  1916. {
  1917.     if (min2[6][i] < min2[5][i])
  1918. min = 6;
  1919.     else
  1920. min = 5;
  1921. }  
  1922. else if (((20 * log10(min2[2][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)
  1923.     min = 6;
  1924. else           
  1925.     min = 2;
  1926. switch (min)
  1927. {
  1928.     case 5: fr_ps->header->tc_alloc[i] = 1;
  1929.     break;
  1930.     case 6: fr_ps->header->tc_alloc[i] = 2;
  1931.     break;
  1932.     
  1933.     case 2: if (((20 * log10(min2[3][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  1934.     {
  1935. if (min2[6][i] <= min2[5][i])  
  1936.     fr_ps->header->tc_alloc[i] = 4;
  1937. else
  1938.     fr_ps->header->tc_alloc[i] = 3;
  1939.     }  
  1940.     else
  1941.     {
  1942. if (((20 * log10(min2[3][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)  
  1943.     fr_ps->header->tc_alloc[i] = 4;
  1944. else
  1945.     fr_ps->header->tc_alloc[i] = 0;
  1946.     }    
  1947.     break;
  1948. }
  1949.     }
  1950. }
  1951.     }
  1952.      
  1953.     /* 01/03/1995 JMZ Configuration 3/0 (+2/0) */
  1954.     if (center != 0 && (surround == 3 || surround == 0))
  1955.     {
  1956. if (matrix == 3 || center == 3)
  1957. {
  1958.          for (i = 0; i < 12; i++)
  1959. fr_ps->header->tc_alloc[i] = 0;
  1960. }
  1961. /* 02/02/97 FdB no matrix == 2 allowed for 3/0
  1962. else if (matrix == 2) 
  1963. {
  1964. for(i = 0; i < 8; i++)
  1965. {
  1966. if(((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  1967. {
  1968. if(max_sc[6][i] < max_sc[5][i])
  1969. fr_ps->header->tc_alloc[i] = 2;
  1970. else  fr_ps->header->tc_alloc[i] = 1;
  1971. }  
  1972. else  if(((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)
  1973. fr_ps->header->tc_alloc[i] = 2;
  1974. else    fr_ps->header->tc_alloc[i] = 0; 
  1975. for(i = 8; i < 12; i++)   
  1976. for(k = 2; k < 7; k++)
  1977. min2[k][i] = 0.0;  
  1978.  
  1979. for(i = 8; i < 12; i++)    
  1980. {
  1981. for(k = 2; k < 7; k++)
  1982. {
  1983. for(l = (sb_groups[i-1] + 1); l <= sb_groups[i]; l++)
  1984. {
  1985. min2[k][i] += max_sc[k][l];  
  1986. }
  1987. min2[k][i] = min2[k][i] / (sb_groups[i] - sb_groups[i-1]); 
  1988. }
  1989. if(((20 * log10(min2[2][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  1990. {
  1991. if(min2[6][i] < min2[5][i])
  1992. fr_ps->header->tc_alloc[i] = 2;
  1993. else  fr_ps->header->tc_alloc[i] = 1;
  1994. }  
  1995. else  if(((20 * log10(min2[2][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)
  1996. fr_ps->header->tc_alloc[i] = 2;
  1997. else    fr_ps->header->tc_alloc[i] = 0; 
  1998. }
  1999. */
  2000. else
  2001. {
  2002.     for (i = 0; i < 8; i++)
  2003.     {
  2004. if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  2005. {
  2006.     if (max_sc[6][i] < max_sc[5][i])
  2007. min = 6;
  2008.     else
  2009. min = 5;
  2010. }  
  2011. else if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)
  2012.     min = 6;
  2013. else           
  2014.     min = 2;
  2015. switch (min)
  2016. {
  2017.     case 5: fr_ps->header->tc_alloc[i] = 1;
  2018.     break;
  2019.     case 6: fr_ps->header->tc_alloc[i] = 2;
  2020.     break;
  2021.     case 2: fr_ps->header->tc_alloc[i] = 0;
  2022.     break;
  2023. }
  2024.     }
  2025.     for (i = 8; i < 12; i++)
  2026.     {
  2027. for (k = 2; k < 7; k++)
  2028. {
  2029.     min2[k][i] = 0.0;  
  2030.     for (l = (sb_groups[i-1] + 1); l <= sb_groups[i]; l++)
  2031. min2[k][i] += max_sc[k][l];  
  2032.     min2[k][i] = min2[k][i] / (sb_groups[i] - sb_groups[i-1]); 
  2033. }
  2034. if (((20 * log10(min2[2][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  2035. {
  2036.     if (min2[6][i] < min2[5][i])
  2037. min = 6;
  2038.     else
  2039. min = 5;
  2040. }  
  2041. else if (((20 * log10(min2[2][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)
  2042.     min = 6;
  2043. else           
  2044.     min = 2;
  2045. switch (min)
  2046. {
  2047.     case 5: fr_ps->header->tc_alloc[i] = 1;
  2048.     break;
  2049.     case 6: fr_ps->header->tc_alloc[i] = 2;
  2050.     break;
  2051.     case 2: fr_ps->header->tc_alloc[i] = 0;
  2052.     break;
  2053. }
  2054.     }
  2055. }
  2056.     }
  2057.     /* 01/03/1995 JMZ Configuration 2/2 */
  2058.     if (center == 0 && surround == 2)
  2059.     {
  2060. if (matrix == 3)
  2061. {
  2062.          for (i = 0; i < 12; i++)
  2063. fr_ps->header->tc_alloc[i] = 0;
  2064. }
  2065. else
  2066. {
  2067.     for (i = 0; i < 8; i++)
  2068.     {
  2069. if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  2070. {
  2071.     if (max_sc[6][i] < max_sc[3][i])
  2072. fr_ps->header->tc_alloc[i] = 3;
  2073.     else 
  2074. fr_ps->header->tc_alloc[i] = 2;
  2075. }  
  2076. else if (((20 * log10(max_sc[3][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)
  2077.     fr_ps->header->tc_alloc[i] = 1;
  2078. else           
  2079.     fr_ps->header->tc_alloc[i] = 0;
  2080.     }
  2081.     for (i = 8; i < 12; i++)
  2082.     {
  2083. for (k = 2; k < 7; k++)
  2084. {
  2085.     min2[k][i] = 0.0;  
  2086.     for (l = (sb_groups[i-1] + 1); l <= sb_groups[i]; l++)
  2087. min2[k][i] += max_sc[k][l];  
  2088.     min2[k][i] = min2[k][i] / (sb_groups[i] - sb_groups[i-1]); 
  2089. }
  2090. if (((20 * log10(min2[2][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  2091. {
  2092.     if (min2[6][i] < min2[3][i])
  2093. fr_ps->header->tc_alloc[i] = 3;
  2094.     else 
  2095. fr_ps->header->tc_alloc[i] = 2;
  2096. }  
  2097. else if (((20 * log10(min2[3][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)
  2098.     fr_ps->header->tc_alloc[i] = 1;
  2099. else           
  2100.     fr_ps->header->tc_alloc[i] = 0;
  2101.     }
  2102. }
  2103.     }
  2104.  
  2105.     /* 01/03/1995 JMZ et Configuration 2/1*/
  2106.     if (center == 0 && surround == 1)
  2107.     {
  2108. if (matrix == 3)
  2109. {
  2110.          for (i = 0; i < 12; i++)
  2111. fr_ps->header->tc_alloc[i] = 0;
  2112. }
  2113. else
  2114. {
  2115.     for (i = 0; i < 8; i++)
  2116.     {
  2117. if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[5][i]))) > TC_ALLOC)
  2118. {
  2119.     if (max_sc[6][i] < max_sc[5][i])
  2120. min = 6;
  2121.     else
  2122. min = 5;
  2123. }  
  2124. else if (((20 * log10(max_sc[2][i])) - (20 * log10(max_sc[6][i]))) > TC_ALLOC)
  2125.     min = 6;
  2126. else           
  2127.     min = 2;
  2128. switch (min)
  2129. {
  2130.     case 5: fr_ps->header->tc_alloc[i] = 1;
  2131.     break;
  2132.     case 6: fr_ps->header->tc_alloc[i] = 2;
  2133.     break;
  2134.     
  2135.     case 2: fr_ps->header->tc_alloc[i] = 0;
  2136.     break;
  2137. }
  2138.     }
  2139.     for (i = 8; i < 12; i++)
  2140.     {
  2141. for (k = 2; k < 7; k++)
  2142. {
  2143.     min2[k][i] = 0.0;  
  2144.     for (l = (sb_groups[i-1] + 1); l <= sb_groups[i]; l++)
  2145. min2[k][i] += max_sc[k][l];  
  2146.     min2[k][i] = min2[k][i] / (sb_groups[i] - sb_groups[i-1]); 
  2147. }
  2148. if (((20 * log10(min2[2][i])) - (20 * log10(min2[5][i]))) > TC_ALLOC)
  2149. {
  2150.     if (min2[6][i] < min2[5][i])
  2151. min = 6;
  2152.     else
  2153. min = 5;
  2154. }  
  2155. else if (((20 * log10(min2[2][i])) - (20 * log10(min2[6][i]))) > TC_ALLOC)
  2156.     min = 6;
  2157. else           
  2158.     min = 2;
  2159. switch (min)
  2160. {
  2161.     case 5: fr_ps->header->tc_alloc[i] = 1;
  2162.     break;
  2163.     case 6: fr_ps->header->tc_alloc[i] = 2;
  2164.     break;
  2165.     
  2166.     case 2: fr_ps->header->tc_alloc[i] = 0;
  2167.     break;
  2168. }
  2169.     }
  2170. }
  2171.     }
  2172.     if (fr_ps->header->tc_alloc[0] == fr_ps->header->tc_alloc[1] &&
  2173. fr_ps->header->tc_alloc[1] == fr_ps->header->tc_alloc[2] &&
  2174. fr_ps->header->tc_alloc[2] == fr_ps->header->tc_alloc[3] &&
  2175. fr_ps->header->tc_alloc[3] == fr_ps->header->tc_alloc[4] &&
  2176. fr_ps->header->tc_alloc[4] == fr_ps->header->tc_alloc[5] &&
  2177. fr_ps->header->tc_alloc[5] == fr_ps->header->tc_alloc[6] &&
  2178. fr_ps->header->tc_alloc[6] == fr_ps->header->tc_alloc[7] &&
  2179. fr_ps->header->tc_alloc[7] == fr_ps->header->tc_alloc[8] &&
  2180. fr_ps->header->tc_alloc[8] == fr_ps->header->tc_alloc[9] &&
  2181. fr_ps->header->tc_alloc[9] == fr_ps->header->tc_alloc[10] &&
  2182. fr_ps->header->tc_alloc[10] == fr_ps->header->tc_alloc[11])
  2183. {
  2184.     fr_ps->header->tc_sbgr_select = 1;
  2185.     fr_ps->header->tc_allocation = fr_ps->header->tc_alloc[0];
  2186. }
  2187. else
  2188.     fr_ps->header->tc_sbgr_select = 0; /* added 8/20/93,SR*/ 
  2189. }
  2190. /************************************************************************
  2191. /*
  2192. /* put_scale   (Layer I)
  2193. /*
  2194. /* PURPOSE:Sets #max_sc# to the scalefactor index in #scalar.
  2195. /* This is used by Psychoacoustic Model I
  2196. /*
  2197. /************************************************************************/
  2198.  
  2199. void put_scale(unsigned int (*scalar)[3][32], frame_params *fr_ps, double (*max_sc)[32])
  2200.                                    
  2201.                     
  2202.        /*far*/                    
  2203. {
  2204.    int i,j,k, max;
  2205.    int stereo  = fr_ps->stereo;
  2206.    int stereomc = fr_ps->stereomc;
  2207.    int sblimit = fr_ps->sblimit;
  2208.  
  2209. /* for (k = 0; k < stereo+stereomc+2; k++) 960814 FdB bug for some configurations */
  2210. for (k = 0; k < 7; k++)
  2211.    for (i = 0; i < SBLIMIT; i++)
  2212.               max_sc[k][i] = multiple[scalar[k][0][i]];
  2213. }
  2214.  
  2215. /************************************************************************
  2216. /*
  2217. /* II_transmission_pattern (Layer II only)
  2218. /*
  2219. /* PURPOSE:For a given subband, determines whether to send 1, 2, or
  2220. /* all 3 of the scalefactors, and fills in the scalefactor
  2221. /* select information accordingly
  2222. /*
  2223. /* SEMANTICS:  The subbands and channels are classified based on how much
  2224. /* the scalefactors changes over its three values (corresponding
  2225. /* to the 3 sets of 12 samples per subband).  The classification
  2226. /* will send 1 or 2 scalefactors instead of three if the scalefactors
  2227. /* do not change much.  The scalefactor select information,
  2228. /* #scfsi#, is filled in accordingly.
  2229. /*
  2230. /************************************************************************/
  2231.  
  2232. void II_transmission_pattern (unsigned int (*scalar)[3][32], unsigned int (*scfsi)[32], frame_params *fr_ps)
  2233. {
  2234.     int stereo  = fr_ps->stereo;
  2235.     int stereomc = fr_ps->stereomc;
  2236.     int sblimit;
  2237.     int sblimit_mc = fr_ps->sblimit_mc;
  2238.     int sblimit_ml = fr_ps->sblimit_ml;
  2239.     int n_ml_ch = fr_ps->header->multiling_ch;
  2240.     int dscf[2];
  2241.     int class[2],i,j,k;