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

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: musicin.c 1.9 1996/02/12 07:13:35 rowlands Exp $
  6.  *
  7.  * $Log: musicin.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:57:11  tenkate
  15.  * ML-LSF added Warner ten Kate 7/8/95 (Philips)
  16.  * debugging (whole packet)
  17.  * obtain_params() and parse_args() cleaned up.
  18.  * get_audio_ml() and Psycho_one_ml() only add odd frames upon LSF-ML.
  19.  * II_smr() is called separately because of that.
  20.  * sample shifting is added because of that.
  21.  *
  22.  * Revision 1.7  1995/07/31  07:49:58  tenkate
  23.  * addition of phantom coding, at sevral lines, 25/07/95 WtK
  24.  *
  25.  * Revision 1.4.3.1  1995/06/16  08:25:11  rowlands
  26.  * Input from Sang Wook Kim (Samsung AIT)
  27.  *
  28.  * Revision 1.4.2.1  1995/06/16  03:46:42  rowlands
  29.  * Input from Susanne Ritscher (IRT)
  30.  *
  31.  * Revision 1.4.1.4  1995/06/16  02:49:33  rowlands
  32.  * Added dematrix procedure 2
  33.  *
  34.  * Added support for dematrix procedure 2, without predistortion yet.
  35.  * Calculated the compatible stereo signal subband samples by
  36.  * transforming the compatible signal used for the psychoacoustics,
  37.  * instead of recalculating in the subband domain from the other
  38.  * channels.
  39.  *
  40.  **********************************************************************/
  41. /**********************************************************************
  42.  *   date   programmers         comment                               *
  43.  * 3/01/91  Douglas Wong,       start of version 1.1 records          *
  44.  *          Davis Pan                                                 *
  45.  * 3/06/91  Douglas Wong,       rename: setup.h to endef.h            *
  46.  *                              removed extraneous variables          *
  47.  * 3/21/91  J.Georges Fritsch   introduction of the bit-stream        *
  48.  *                              package. This package allows you      *
  49.  *                              to generate the bit-stream in a       *
  50.  *                              binary or ascii format                *
  51.  * 3/31/91  Bill Aspromonte     replaced the read of the SB matrix    *
  52.  *                              by an "code generated" one            *
  53.  * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         *
  54.  *                              Incorporated Jean-Georges Fritsch's   *
  55.  *                              "bitstream.c" package.                *
  56.  *                              Modified to strictly adhere to        *
  57.  *                              encoded bitstream specs, including    *
  58.  *                              "Berlin changes".                     *
  59.  *                              Modified user interface dialog & code *
  60.  *                              to accept any input & output          *
  61.  *                              filenames desired.  Also added        *
  62.  *                              de-emphasis prompt and final bail-out *
  63.  *                              opportunity before encoding.          *
  64.  *                              Added AIFF PCM sound file reading     *
  65.  *                              capability.                           *
  66.  *                              Modified PCM sound file handling to   *
  67.  *                              process all incoming samples and fill *
  68.  *                              out last encoded frame with zeros     *
  69.  *                              (silence) if needed.                  *
  70.  *                              Located and fixed numerous software   *
  71.  *                              bugs and table data errors.           *
  72.  * 27jun91  dpwe (Aware Inc)    Used new frame_params struct.         *
  73.  *                              Clear all automatic arrays.           *
  74.  *                              Changed some variable names,          *
  75.  *                              simplified some code.                 *
  76.  *                              Track number of bits actually sent.   *
  77.  *                              Fixed padding slot, stereo bitrate    *
  78.  *                              Added joint-stereo : scales L+R.      *
  79.  * 6/12/91  Earle Jennings      added fix for MS_DOS in obtain_param  *
  80.  * 6/13/91  Earle Jennings      added stack length adjustment before  *
  81.  *                              main for MS_DOS                       *
  82.  * 7/10/91  Earle Jennings      conversion of all float to FLOAT      *
  83.  *                              port to MsDos from MacIntosh completed*
  84.  * 8/ 8/91  Jens Spille         Change for MS-C6.00                   *
  85.  * 8/22/91  Jens Spille         new obtain_parameters()               *
  86.  *10/ 1/91  S.I. Sudharsanan,   Ported to IBM AIX platform.           *
  87.  *          Don H. Lee,                                               *
  88.  *          Peter W. Farrett                                          *
  89.  *10/ 3/91  Don H. Lee          implemented CRC-16 error protection   *
  90.  *                              newly introduced functions are        *
  91.  *                              I_CRC_calc, II_CRC_calc and encode_CRC*
  92.  *                              Additions and revisions are marked    *
  93.  *                              with "dhl" for clarity                *
  94.  *11/11/91 Katherine Wang       Documentation of code.                *
  95.  *                                (variables in documentation are     *
  96.  *                                surround by the # symbol, and an '*'*
  97.  *                                denotes layer I or II versions)     *
  98.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  99.  *                              important fixes involved changing     *
  100.  *                              16-bit ints to long or unsigned in    *
  101.  *                              bit alloc routines for quant of 65535 *
  102.  *                              and passing proper function args.     *
  103.  *                              Removed "Other Joint Stereo" option   *
  104.  *                              and made bitrate be total channel     *
  105.  *                              bitrate, irrespective of the mode.    *
  106.  *                              Fixed many small bugs & reorganized.  *
  107.  * 2/25/92  Masahiro Iwadare    made code cleaner and more consistent *
  108.  *10 jul 92 Susanne Ritscher    Bug fix in main, scale factor calc.   *
  109.  * 5 aug 92 Soren H. Nielsen    Printout of bit allocation.           *
  110.  *19 aug 92 Soren H. Nielsen Changed MS-DOS file name extensions.  *
  111.  * 2 dec 92 Susanne Ritscher Start of changes to multi-channel with*
  112.  *                                                  several options   *  *
  113.  **********************************************************************
  114.  *                                                                    *
  115.  *                                                                    *
  116.  *  MPEG/audio Phase 2 coding/decoding multichannel                   *
  117.  *                                                                    *
  118.  *                                                                    *
  119.  *  7/27/93        Susanne Ritscher,  IRT Munich                      *
  120.  *                                                                    *
  121.  *                                                               *
  122.  *  8/13/93        implemented channel-switching by changing          *
  123.  *                 a lot in encode.c                                  *
  124.  *                                                                    *
  125.  *  8/27/93        Susanne Ritscher, IRT Munich                       *
  126.  *                 Channel-Switching is working                       *
  127.  *  9/1/93         Susanne Ritscher,  IRT Munich                      *
  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        try get all the rubbish out!                       *
  133.  *                                                                    *
  134.  *                                                                    *
  135.  *  Version 1.0                                                       *
  136.  *                                                                    *
  137.  *  07/12/94       Susanne Ritscher,  IRT Munich                      *
  138.  *                                                                    *
  139.  *  Version 1.1                                                       *
  140.  *                                                                    *
  141.  *  02/23/95    Susanne Ritscher,  IRT Munich                      *
  142.  *                 corrected some bugs                                *
  143.  *                 extension bitstream is working                     *
  144.  *                                                                    *
  145.  *  Version 2.0                                                       *
  146.  *                                                                    *
  147.  *  01/28/97       Frans de Bont, Philips Sound & Vision, Eindhoven   *
  148.  *     - dynamic crosstalk working for all configurations*
  149.  *     - prediction working for all configurations       *
  150.  *     - extension bitstream fixed       *
  151.  *     - fully compliant to DIS 13818-3.2                *
  152.  *                                                                    *       *     
  153.  **********************************************************************/
  154. /**********************************************************************
  155.  *                                                                    *
  156.  *  06/06/95    Yeon Bae Thomas Kim,  Samsung AIT                  *
  157.  *                 ancillary data is working                          *
  158.  *                                                                    *
  159.  *  06/06/95    Sang Wook Kim,  Samsung AIT                        *
  160.  *                 corrected some bugs                                *
  161.  *                                                                    *
  162.  **********************************************************************/
  163. #ifdef MS_DOS
  164. #include <dos.h>
  165. #endif
  166. #include "common.h"
  167. #include "encoder.h"
  168. #include <math.h>
  169. /* Global variable definitions for "musicin.c" */
  170. FILE               *musicin;
  171. FILE               *musicin_ml; /* 08/03/1995 JMZ Multilingual */
  172. Bit_stream_struc   bs;
  173. Bit_stream_struc   bs_ext;
  174. Bit_stream_struc   bs_mpg;
  175. char               *programName;
  176. int    mesg_index=0; /* YBKim060695 ancillary */
  177. int    verbosity;
  178. char multilingual_file_name[MAX_NAME_SIZE]; /* 08/03/1995 JMZ Multilingual */
  179. /* Implementations */
  180. /************************************************************************
  181. /*
  182. /* obtain_parameters
  183. /*
  184. /* PURPOSE:  Prompts for and reads user input for encoding parameters
  185. /*
  186. /* SEMANTICS:  The parameters read are:
  187. /* - input and output filenames
  188. /* - sampling frequency (if AIFF file, will read from the AIFF file header)
  189. /* - layer number
  190. /* - mode (stereo, joint stereo, dual channel or mono)
  191. /* - psychoacoustic model (I or II)
  192. /* - total bitrate, irrespective of the mode
  193. /* - de-emphasis, error protection, copyright and original or copy flags
  194. /*
  195. /************************************************************************/
  196. void
  197. obtain_parameters (
  198. frame_params *fr_ps,
  199. int *psy,
  200. long unsigned int *num_samples,
  201. long unsigned int *num_samples_ml,
  202. char *original_file_name,
  203. char *encoded_file_name,
  204. IFF_AIFF *pcm_aiff_data,
  205. IFF_AIFF *pcm_aiff_data_ml,
  206. int *aiff,
  207. int *byte_per_sample,
  208. int *mat_mode,
  209. int *aug_mat_mode,
  210. int *cha_sw,
  211. int *aug_cha_sw,
  212. char *encoded_file_name_ext,
  213. int *bit_rate,
  214. char *encoded_file_name_mpg,
  215. int *dyn_cr,
  216. int *dyn_cr_LR,
  217. int *aug_dyn_cr,
  218. int *ancillaryUse,
  219. int *verbosity)
  220. {
  221.     int j, bool, max_rate, max_rate_index;
  222.     long int i;
  223.     int tot_channels = 0; /* 21/03/1995 JMZ Multimode */ 
  224.     char configuration[50]; /* 21/03/1995 JMZ Multimode */
  225.     char t[50];
  226.     layer *info = fr_ps->header;
  227.     *aiff = 0;  /* flag for AIFF-Soundfile*/
  228.  
  229.     do
  230.     {
  231.        printf ("Enter PCM input file name <required>: ");
  232.        gets (original_file_name);
  233.        if (original_file_name[0] == NULL_CHAR)
  234.        printf ("PCM input file name is required.n");
  235.     } while (original_file_name[0] == NULL_CHAR);
  236.     printf(">>> PCM input file name is: %sn", original_file_name);
  237.  
  238.     if ((musicin = fopen (original_file_name, "rb")) == NULL)
  239.     {
  240.        printf ("Could not find "%s".n", original_file_name);
  241.        exit (1);
  242.     }
  243. /***************************************************************************/
  244. /* 08/03/1995 Multi lingual extension JMZ                                  */
  245.     printf ("Do you have multi lingual channels? (Y)es, (<N>)o: ");
  246.     gets (multilingual_file_name);
  247.     if ((*multilingual_file_name == 'Y') || (multilingual_file_name[0] == 'y'))
  248.     {
  249. printf ("Enter multilingual input file name <%s.%s>: ", original_file_name, DFLT_ML_EXT);
  250. gets (multilingual_file_name);
  251. if (multilingual_file_name[0] == NULL_CHAR)
  252. {
  253.     printf ("Null charn");
  254.     strcat (strcpy (multilingual_file_name, original_file_name), DFLT_ML_EXT);
  255. }
  256. if ((musicin_ml = fopen (multilingual_file_name, "rb")) == NULL) 
  257. {
  258.     printf ("Could not find "%s".n", multilingual_file_name);
  259.     exit (1);
  260. }
  261. /*remplir fr_ps il y a au moins un multilingual*/
  262. if (aiff_read_headers (musicin_ml, pcm_aiff_data_ml, byte_per_sample) == 0) 
  263. {
  264.     printf (">>> Using Audio IFF multilingual file headersn");
  265.     info->multiling_ch = pcm_aiff_data_ml->numChannels;
  266.     printf (">>> Using %d multilingual channelsn",info->multiling_ch);
  267.     *num_samples_ml = pcm_aiff_data_ml->numChannels *
  268.       pcm_aiff_data_ml->numSampleFrames;
  269. }
  270. else     /* Not using Audio IFF sound file headers. */
  271. {
  272.     printf ("***WARNING: Could not read AIFF header - No MultiLingual coding!!n");
  273.     info->multiling_ch = 0;
  274. }
  275.     }
  276.     else
  277.     {
  278. printf ("no multi lingual coding!!n");
  279. info->multiling_ch = 0;
  280.     }
  281. /* 08/03/1995 Multi lingual extension JMZ                                  */
  282. /***************************************************************************/
  283.     printf("Enter MPEG encoded output file name <%s%s>: ",
  284. original_file_name, DFLT_EXT);
  285.     gets (encoded_file_name);
  286.     if (encoded_file_name[0] == NULL_CHAR)
  287.     {
  288. strcat (strcpy (encoded_file_name_ext, original_file_name), DFLT_EXT_EXT);
  289. strcat (strcpy (encoded_file_name, original_file_name), DFLT_EXT);
  290. strcat (strcpy (encoded_file_name_mpg, encoded_file_name), DFLT_EXT);
  291.     }
  292.     else
  293.     {
  294. strcat (strcpy (encoded_file_name_ext, encoded_file_name), DFLT_EXT_EXT);
  295. strcat (encoded_file_name, DFLT_EXT);
  296. strcat (strcpy (encoded_file_name_mpg, encoded_file_name), DFLT_EXT);
  297.     }
  298.     printf(">>> MPEG encoded output file name is: %sn", encoded_file_name);
  299.  
  300.     open_bit_stream_w (&bs, encoded_file_name, BUFFER_SIZE);
  301.  
  302.     if (aiff_read_headers (musicin, pcm_aiff_data, byte_per_sample) == 0)
  303.     {
  304. *aiff = 1;
  305. printf(">>> Using Audio IFF sound file headersn");
  306. /**********************************************************/
  307. /* 21/03/1995 JMZ Multimode */
  308. tot_channels = pcm_aiff_data->numChannels;
  309. printf (">>> Using %d audio channelsn", tot_channels);
  310. /********* 27/01/97, FdB, select LFE ********************/
  311. if (tot_channels > 1)
  312. {
  313.     printf ("Do you want to use LFE coding? (y/<n>) ");
  314.     gets (t);
  315.     if ((*t == 'y') || (*t == 'Y'))
  316.     {
  317. printf (">>> LFE coding is used.n");
  318. info->lfe = 1;
  319.     } 
  320.     else
  321.     {
  322. printf (">>> No LFE coding.n");  
  323. info->lfe = 0;
  324.     }
  325.         }
  326. #ifdef Augmentation_7ch
  327. if (tot_channels - info->lfe == 7) 
  328. {
  329.     if (info->multiling_ch > 0)
  330.     {
  331. printf ("7.1 channel augmentation and multilingual cannot be combinedn");
  332. exit (1);
  333.     }
  334.     fr_ps->stereomc = 3;
  335.     fr_ps->stereoaug = 2;
  336.     fr_ps->lfe_pos = 3;
  337.     info->center = 1; 
  338.     info->surround = 2; 
  339.     fr_ps->config = 320;
  340.     printf (">>> Using 5/2 configuration.n"); 
  341. }
  342. else
  343. #endif
  344. if (tot_channels - info->lfe == 5) 
  345. {
  346.     fr_ps->stereomc = 3;
  347.     fr_ps->stereoaug = 0;
  348.     fr_ps->lfe_pos = 3;
  349.     printf ("Which configuration do you want to use?n");
  350.     printf ("Available: 3/2 (<1>), 3/0 + 2/0 (2): ");
  351.     gets (configuration);
  352.     switch (*configuration)
  353.          {
  354.     case '1': 
  355.     info->center = 1; 
  356.     info->surround = 2; 
  357.     fr_ps->config = 320;
  358.     printf (">>> Using 3/2 configuration.n"); 
  359.     break;
  360.     case '2': 
  361.     info->center = 1; 
  362.     info->surround = 3; 
  363.     fr_ps->config = 302;
  364.     printf (">>> Using 3/0 + 2/0 configuration.n"); 
  365.     break;
  366.     default:  
  367.     info->center = 1; 
  368.     info->surround = 2; 
  369.     fr_ps->config = 320;
  370.     printf (">>> Using default 3/2 configuration.n"); 
  371.     break;
  372.     }
  373. }
  374. else if (tot_channels - info->lfe == 4) 
  375. {
  376.     fr_ps->stereomc = 2;
  377.     fr_ps->stereoaug = 0;
  378.     printf ("Which configuration do you want to use?n");
  379.     printf ("Available: 3/1 (<1>), 2/2 (2), 2/0 + 2/0 (3): ");
  380.     gets (configuration);
  381.     switch (*configuration)
  382.          {
  383.     case '1': 
  384.     info->center = 1; 
  385.     info->surround = 1; 
  386.     fr_ps->config = 310;
  387.     fr_ps->lfe_pos = 3;
  388.     printf (">>> Using 3/1 configuration.n"); 
  389.     break;
  390.     case '2': 
  391.     info->center = 0; 
  392.     info->surround = 2; 
  393.     fr_ps->config = 220;
  394.     fr_ps->lfe_pos = 2;
  395.     printf (">>> Using 2/2 configuration.n"); 
  396.     break;
  397.     case '3': 
  398.     info->center = 0; 
  399.     info->surround = 3; 
  400.     fr_ps->config = 202;
  401.     fr_ps->lfe_pos = 2;
  402.     printf (">>> Using 2/0 + 2/0 configuration.n"); 
  403.     break;
  404.     default:  
  405.     info->center = 1; 
  406.     info->surround = 1; 
  407.     fr_ps->config = 310;
  408.     fr_ps->lfe_pos = 3;
  409.     printf (">>> Using default 3/1 configuration.n"); 
  410.     break;
  411.     }
  412. }
  413. else if (tot_channels - info->lfe == 3) 
  414. {
  415.     fr_ps->stereoaug = 0;
  416.     printf ("Which configuration do you want to use?n");
  417.     printf ("Available: 3/0 (<1>), 2/1 (2), 1/0 + 2/0 (3): ");
  418.     gets (configuration);
  419.     switch (*configuration)
  420.          {
  421.     case '1': 
  422.     info->center = 1; 
  423.     info->surround = 0; 
  424.     fr_ps->config = 300;
  425.     fr_ps->stereomc = 1;
  426.     fr_ps->lfe_pos = 3;
  427.     printf (">>> Using 3/0 configuration.n"); 
  428.     break;
  429.     case '2': 
  430.     info->center = 0; 
  431.     info->surround = 1; 
  432.     fr_ps->config = 210;
  433.     fr_ps->stereomc = 1;
  434.     fr_ps->lfe_pos = 2;
  435.     printf (">>> Using 2/1 configuration.n"); 
  436.     break;
  437.     case '3': 
  438.     info->center = 0; 
  439.     info->surround = 3; 
  440.     fr_ps->config = 102;
  441.     fr_ps->stereomc = 2;
  442.     fr_ps->lfe_pos = 1;
  443.     printf (">>> Using 1/0 + 2/0 configuration.n"); 
  444.     break;
  445.     default:  
  446.     info->center = 1; 
  447.     info->surround = 0; 
  448.     fr_ps->config = 300;
  449.     fr_ps->stereomc = 1;
  450.     fr_ps->lfe_pos = 3;
  451.     printf (">>> Using default 3/0 configuration.n"); 
  452.     break;
  453.     }
  454. }
  455. else if (tot_channels - info->lfe == 2) 
  456. {
  457.     fr_ps->config = 200;
  458.     fr_ps->stereomc = 0;
  459.     fr_ps->stereoaug = 0;
  460.     fr_ps->lfe_pos = 2;
  461. }
  462. else if (tot_channels - info->lfe == 1) 
  463. {
  464.     if (info->lfe)
  465.     {
  466. printf ("single channel plus LFE not supported.n");
  467. exit (1);
  468.     }
  469.     fr_ps->config = 100;
  470.     fr_ps->stereomc = 0;
  471.     fr_ps->stereoaug = 0;
  472. }
  473. else
  474. {
  475.     printf ("Channels = %d not supported.n", tot_channels);
  476.     exit (1);
  477. }
  478. aiff_check (original_file_name, pcm_aiff_data);
  479. /* 21/03/1995 JMZ Multimode */
  480. /**********************************************************/
  481.         info->sampling_frequency = SmpFrqIndex ((long) pcm_aiff_data->sampleRate);
  482.         printf (">>> %.f Hz sampling frequency selectedn", pcm_aiff_data->sampleRate);
  483.         /* Determine number of samples in sound file */
  484.         *num_samples = pcm_aiff_data->numChannels * pcm_aiff_data->numSampleFrames;
  485. if (info->multiling_ch > 0)
  486. {
  487.     switch (SmpFrqIndex ((long) pcm_aiff_data_ml->sampleRate) - info->sampling_frequency)
  488.     {
  489.     case 16 : printf ("MultiLingual is LSF coded.n");
  490.       info->multiling_fs = 1;
  491.       break;
  492.     case  0 : printf ("MultiLingual sample rate equals that of Audio.n");
  493.       info->multiling_fs = 0;
  494.       break;
  495.     default : printf ("***WARNING: MultiLingual sample rate does not equal (half) mc sample rate.n");
  496.            printf ("            No MultiLingual coding!!!n");
  497.       info->multiling_ch = 0;
  498.       break;
  499.     } /*switch*/
  500. } /*if (ml_ch>0)*/
  501.     }
  502.     else
  503.     {    /* Not using Audio IFF sound file headers. */
  504. printf("no multichannel coding!!n");
  505. fr_ps->stereomc = 0;
  506. fr_ps->stereoaug = 0;
  507. info->multiling_ch = 0;
  508.         printf ("What is the sampling frequency? <48000>[Hz]: ");
  509.         gets (t);
  510.         i = atol(t);
  511.         switch (i)
  512. {
  513.         case 48000 : info->sampling_frequency = 1;
  514.              printf (">>> %ld Hz sampling freq selectedn", i);
  515.      break;
  516.         case 44100 : info->sampling_frequency = 0;
  517.      printf (">>> %ld Hz sampling freq selectedn", i);
  518.      break;
  519.         case 32000 : info->sampling_frequency = 2;
  520.      printf (">>> %ld Hz sampling freq selectedn", i);
  521.      break;
  522.         default:     info->sampling_frequency = 1;
  523.      printf (">>> Default 48 kHz samp freq selectedn");
  524.         }
  525.  
  526.         if (fseek (musicin, 0, SEEK_SET) != 0)
  527. {
  528.           printf ("Could not seek to PCM sound data in "%s".n",
  529.                   original_file_name);
  530.           exit (1);
  531.         }
  532.  
  533.         /* Declare sound file to have "infinite" number of samples. */
  534.         *num_samples = MAX_U_32_NUM;
  535.     }
  536.     printf ("Which layer do you want to use?n");
  537.     printf ("Available: Layer (1), Layer (<2>): ");
  538.     gets (t);
  539.     switch (*t)
  540.     {
  541.     case '1': info->lay = 1; printf (">>> Using Layer %sn", t); break;
  542.     case '2': info->lay = 2; printf (">>> Using Layer %sn", t); break;
  543.     default : info->lay = 2; printf (">>> Using default Layer 2n"); break;
  544.     }
  545.     printf ("Which mode do you want for the two front channels?n");
  546.     printf ("Available: (<s>)tereo, (j)oint stereo, ");
  547.     printf ("(d)ual channel, s(i)ngle Channel, n(o)ne: ");
  548.     gets (t);
  549.     if (fr_ps->config < 200) /* compatible is mono */
  550.     {
  551. info->mode = MPG_MD_MONO;
  552. info->mode_ext = 0;
  553. printf (">>> Using default mono moden");
  554.     }
  555.     else
  556. switch (*t)
  557. {
  558. case 's':
  559. case 'S': info->mode = MPG_MD_STEREO; info->mode_ext = 0;
  560.   printf (">>> Using mode %sn",t);
  561.   break;
  562. case 'j':
  563. case 'J': info->mode = MPG_MD_JOINT_STEREO;
  564.   printf (">>> Using mode %sn",t);
  565.   break;
  566. case 'd':
  567. case 'D': info->mode = MPG_MD_DUAL_CHANNEL; info->mode_ext = 0;
  568.   printf (">>> Using mode %sn",t);
  569.   break;
  570. case 'i':
  571. case 'I': info->mode = MPG_MD_MONO; info->mode_ext = 0;
  572.   printf (">>> Using mode %sn",t);
  573.   break;
  574. case 'o':
  575. case 'O': info->mode = MPG_MD_NONE; info->mode_ext = 0;
  576.   printf (">>> Using mode %sn",t);
  577.   break;
  578. default:  info->mode = MPG_MD_STEREO; info->mode_ext = 0;
  579.   printf (">>> Using default stereo moden");
  580.   break;
  581. }
  582.     *psy = DFLT_PSY;
  583.     if (info->mode == MPG_MD_MONO)
  584. max_rate_index = 10;
  585.     else
  586. max_rate_index = 14;
  587. /*    max_rate_index = 6; */ /* 48 kHz => 96 kbps for multiple table testing */ 
  588.     max_rate = bitrate[info->lay-1][max_rate_index];
  589.     printf ("What is the total bitrate? <%u>[kbps]: ", DFLT_BRT);
  590.     gets (t);
  591.     i = atol (t);
  592.     if (i == 0) i = -10;
  593.     j = 0;
  594.     while (j <= max_rate_index) 
  595.     {
  596. if (bitrate[info->lay-1][j] == (int) i)
  597.     break;
  598. j++;
  599.     }
  600.     if (j > max_rate_index) 
  601.     {
  602.         if (i < max_rate)
  603.         {
  604.     if (DFLT_BRT <= max_rate)
  605.     {
  606.      i = DFLT_BRT;
  607. printf (">>> Using default %u kbpsn", DFLT_BRT);
  608.     }
  609.     else
  610.     {
  611.         i = max_rate;
  612. printf (">>> Using max. bitrate %u kbpsn", max_rate);
  613.     }
  614.     for (j = 0; j < 15; j++)
  615. if (bitrate[info->lay-1][j] == (int) i) 
  616. {
  617.     info->bitrate_index = j;
  618.     break;
  619. }
  620. }
  621. else
  622. {
  623.     info->ext_bit_stream_present = 1;
  624.     *bit_rate = i;
  625.     if (DFLT_BRT <= max_rate)
  626.      i = DFLT_BRT;
  627.     else
  628.         i = max_rate;
  629.     for (j = 0; j < 15; j++)
  630. if (bitrate[info->lay-1][j] == (int) i) 
  631. {
  632.     info->bitrate_index = j;
  633.     break;
  634. }
  635.     info->ext_length = ((*bit_rate - i) * 144) / s_freq[info->sampling_frequency];
  636.     printf (">>> Bitrate = %d kbpsn", *bit_rate);
  637. }    
  638.     }
  639.     else
  640.     {
  641.         info->bitrate_index = j;
  642.         printf (">>> Bitrate = %d kbpsn", bitrate[info->lay-1][j]);
  643.     }
  644.     printf ("What type of de-emphasis should the decoder use?n");
  645.     printf ("Available: (<n>)one, (5)0/15 microseconds, (c)citt j.17: ");
  646.     gets (t);
  647.     if (*t != 'n' && *t != '5' && *t != 'c')
  648.     {
  649.         printf (">>> Using default no de-emphasisn");
  650.         info->emphasis = 0;
  651.     }
  652.     else
  653.     {
  654.         if (*t == 'n')      info->emphasis = 0;
  655.         else if (*t == '5') info->emphasis = 1;
  656.         else if (*t == 'c') info->emphasis = 3;
  657.         printf (">>> Using de-emphasis %cn", *t);
  658.     }
  659.  
  660. /*  Start 2. Part changes for CD Ver 3.2; jsp; 22-Aug-1991 */
  661.  
  662.     printf ("Do you want to set the private bit? (y/<n>): ");
  663.     gets (t);
  664.     if (*t == 'y' || *t == 'Y') info->extension = 1;
  665.     else                        info->extension = 0;
  666.     if (info->extension) printf (">>> Private bit setn");
  667.     else                 printf (">>> Private bit not setn");
  668.  
  669. /*  End changes for CD Ver 3.2; jsp; 22-Aug-1991 */
  670.     printf ("Do you want error protection? (y/<n>): ");
  671.     gets (t);
  672.     if (*t == 'y' || *t == 'Y') info->error_protection = TRUE;
  673.     else                        info->error_protection = FALSE;
  674.     if (info->error_protection) printf (">>> Error protection usedn");
  675.     else printf (">>> Error protection not usedn");
  676.     printf ("Is the material copyrighted? (y/<n>): ");
  677.     gets (t);
  678.     if (*t == 'y' || *t == 'Y') info->copyright = 1;
  679.     else                        info->copyright = 0;
  680.     if (info->copyright) printf (">>> Copyrighted materialn");
  681.     else                 printf (">>> Material not copyrightedn");
  682.  
  683.     printf ("Is this the original? (y/<n>): ");
  684.     gets (t);
  685.     if (*t == 'y' || *t == 'Y') info->original = 1;
  686.     else                        info->original = 0;
  687.     if (info->original) printf (">>> Original materialn");
  688.     else         printf (">>> Material not originaln");
  689.     
  690.     /* Option for multichannel for matricing, 7/12/93,SR*/
  691.     if (*aiff == 1)
  692.     {
  693.         printf ("which kind of matrix do you want(<(-3, -3) = 0>;(-xx, -3) = 1;");
  694. printf (" (-oo, -3) = 2; (-oo, -oo) = 3)  ");
  695. gets (t);
  696. if (strcmp (t,"") == 0) info->matrix = 0;
  697. else info->matrix = atoi (t);
  698. printf ("The matrix %d is chosenn", info->matrix);
  699. *mat_mode = info->matrix;
  700. #ifdef Augmentation_7ch
  701. if (fr_ps->stereoaug == 2)  /* 7.1 channel mode */
  702. {
  703.     printf ("which kind of aug matrix do you want? (<0>; 1; 3) ");
  704.     gets (t);
  705.     if (strcmp (t, "") == 0) info->aug_mtx_proc = 0;
  706.     else      info->aug_mtx_proc = atoi (t);
  707.     printf ("The aug matrix %d is chosenn", info->aug_mtx_proc);
  708.     *aug_mat_mode = info->aug_mtx_proc;
  709. }
  710. #endif
  711. printf ("Do you want to have Channel-switching?(<y>/n) ");
  712. gets (t);
  713. if (*t == 'y' || *t == 'Y')
  714.     *cha_sw = *aug_cha_sw = 1;
  715. if (*cha_sw == 0 || info->matrix == 3)
  716. {
  717.     *cha_sw = 0;
  718.     printf ("Channel-switching is not used!n");
  719.     printf ("Which mode of Channel-switching do you want? (not used) ");
  720.     gets (t);
  721.     printf("CHA mode: %dn", *cha_sw);
  722. }
  723. else
  724. {
  725.     *cha_sw = 1;
  726.     printf ("Channel-switching is usedn");  
  727.     do
  728.     {
  729. printf ("Which mode of Channel-switching do you want? (-2 ... 7) ");
  730. gets (t);
  731. *cha_sw = atoi (t);
  732. printf ("CHA mode: %dn", *cha_sw);
  733. if (fr_ps->config == 320)
  734.     bool = *cha_sw > 7;
  735. else if (fr_ps->config == 310 && info->matrix == 2)
  736.     bool = *cha_sw > 5;
  737. else if (fr_ps->config == 310)
  738.     bool = *cha_sw > 4;
  739. else if (fr_ps->config == 220)
  740.     bool = *cha_sw > 3;
  741. else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
  742.     bool = *cha_sw > 2;
  743. else
  744.     bool = *cha_sw > 0;
  745. if (bool)
  746.     printf ("!!! Channel-switching mode %d cannot be used together with Configuration: %d !!!n", *cha_sw, fr_ps->config);
  747.     } while (bool);
  748. }
  749. #ifdef Augmentation_7ch
  750. if (fr_ps->stereoaug == 2)  /* 7.1 channel mode */
  751. {
  752.     if (*aug_cha_sw == 0 || info->aug_mtx_proc == 3)
  753.     {
  754. *aug_cha_sw = 0;
  755. printf ("Aug Channel-switching is not used!n");
  756. printf ("Which mode of Aug Channel-switching do you want? (not used) ");
  757. gets (t);
  758. printf("Aug CHA mode: %dn", *aug_cha_sw);
  759.     }
  760.     else
  761.     {
  762. *aug_cha_sw = 1;
  763. printf ("Aug Channel-switching is usedn");  
  764. do
  765. {
  766.     printf ("Which mode of Aug Channel-switching do you want? (-1 ... 7) ");
  767.     gets (t);
  768.     *aug_cha_sw = atoi (t);
  769.     printf ("Aug CHA mode: %dn", *aug_cha_sw);
  770.     if (info->aug_mtx_proc == 0 || info->aug_mtx_proc == -1)
  771. bool = *aug_cha_sw > 7;
  772.     else if (info->aug_mtx_proc == 1)
  773. bool = *aug_cha_sw > 3;
  774.     else
  775. bool = *aug_cha_sw > 0;
  776.     if (bool)
  777.         printf ("!!! TCA7 mode %d cannot be used together with aug_mtx_proc: %d !!!n",
  778. *aug_cha_sw, info->aug_mtx_proc);
  779. } while (bool);
  780.     }
  781. }
  782. else
  783. #endif
  784.     *aug_cha_sw = 0;
  785. /********* 27/07/95, WtK , phantom coding ********************/
  786. if ((fr_ps->stereomc > 0) && (info->center == 1))
  787. {
  788.     printf ("Do you want to use Phantom Coding of the Center signal? (y/<n>) ");
  789.     gets (t);
  790.     if ((*t == 'y') || (*t == 'Y'))
  791.     {
  792. printf (">>> Phantom Coding is used.n");
  793. fr_ps->phantom_c = 1;
  794.     } 
  795.     else
  796.     {
  797. printf (">>> No Phantom Coding.n");  
  798. fr_ps->phantom_c = 0;
  799.     }
  800.         }
  801. /********* 05/24/95, SR , dynamic cross_talk ********************/
  802. printf ("Do you want to have Dynamic Crosstalk?(y/<n>) ");
  803. gets (t);
  804. if (*t == 'y')  
  805. {
  806.     printf ("Dynamic Crosstalk is used!n");
  807.     bool = 1;
  808.     do
  809.     {
  810. printf ("Which mode of Dynamic Crosstalk do you want? (-1 ... 14) ");
  811. gets (t);
  812. *dyn_cr = atoi (t);
  813. printf ("DynX mode: %dn", *dyn_cr);
  814. if (fr_ps->phantom_c && fr_ps->config == 320)
  815.     bool = ((*dyn_cr==9) || (*dyn_cr==10) || (*dyn_cr==11) || (*dyn_cr==12) || (*dyn_cr==14));
  816. else if (fr_ps->phantom_c && ((fr_ps->config==310) || (fr_ps->config==220)))
  817.     bool = (*dyn_cr==4);
  818. else
  819.     bool = 0;
  820. if (bool)
  821.     printf ("!!! Dynamic Crosstalk mode %d cannot be used together with Phantom Coding !!!n", *dyn_cr);
  822.     } while (bool);
  823. #ifdef Augmentation_7ch
  824.     if (fr_ps->stereoaug == 2)  /* 7.1 channel mode */
  825.     {
  826. bool = 1;
  827. do
  828. {
  829.     printf ("Which mode of Aug Dynamic Crosstalk do you want? (-1 ... 18) ");
  830.     gets (t);
  831.     *aug_dyn_cr = atoi (t);
  832.     printf ("Aug DynX mode: %dn", *aug_dyn_cr);
  833.     bool = *aug_dyn_cr > 18;
  834.     if (bool)
  835. printf ("!!! Aug Dynamic Crosstalk mode %d cannot be used !!!n", *aug_dyn_cr);
  836. } while (bool);
  837.     }
  838. #endif
  839. else
  840. {
  841.     *dyn_cr = 0;
  842.     printf ("Dynamic Crosstalk is not usedn");  
  843.     printf ("Which mode of Dynamic Crosstalk do you want? (not used) ");
  844.     gets (t);
  845.     printf ("DynX mode: %dn", *dyn_cr);
  846. #ifdef Augmentation_7ch
  847.     if (fr_ps->stereoaug == 2)  /* 7.1 channel mode */
  848.     {
  849.         *aug_dyn_cr = 0;
  850. printf ("Which mode of Aug Dynamic Crosstalk do you want? (-1 ... 18) ");
  851. gets (t);
  852. printf ("Aug DynX mode: %dn", *aug_dyn_cr);
  853.     }
  854. #endif
  855. }
  856. bool = 1;
  857. do
  858. {
  859.     printf ("Value for dyn_cross_LR?(<0>/1) ");
  860.     gets (t);
  861.     *dyn_cr_LR = atoi (t);
  862.     bool = *dyn_cr_LR < -1 || *dyn_cr_LR > 1;
  863.     if (bool)
  864. printf ("!!! dyn_cross_LR %d invalid value -1, 0 or 1 !!!n", *dyn_cr_LR);
  865. } while (bool);
  866. printf ("dyn_cross_LR: %dn", *dyn_cr_LR);
  867. /********* 27/01/97, FdB, select prediction ********************/
  868. if (fr_ps->stereomc > 0 && fr_ps->config != 202 && fr_ps->config != 102)
  869. {
  870.     printf ("Do you want to use MC prediction? (y/<n>) ");
  871.     gets (t);
  872.     if ((*t == 'y') || (*t == 'Y'))
  873.     {
  874. printf (">>> MC prediction is used.n");
  875. info->mc_prediction_on = 1;
  876.     } 
  877.     else
  878.     {
  879. printf (">>> No MC prediction.n");  
  880. info->mc_prediction_on = 0;
  881.     }
  882.         }
  883.     }
  884.     /* YBKim060695 ancillary */
  885.     printf ("Do you want to use ancillary part ? (y:<n>): ");
  886.     gets (t);
  887.     *ancillaryUse = (*t == 'y' || *t == 'Y');
  888.     printf ("Ancillary: %dn", *ancillaryUse);
  889.     printf ("How verbose would you like the output ? (0, <1>, 2, 3): ");
  890.     gets (t);
  891.     if (*t >= '0' && *t <= '3')
  892. *verbosity = atoi (t);
  893.     else
  894. *verbosity = DFLT_VERB;
  895.     printf ("Verbose level: %dn", *verbosity);
  896.     printf ("Do you wish to exit (last chance before encoding)? (y/<n>): ");
  897.     gets (t);
  898.     if (*t == 'y' || *t == 'Y')
  899. exit (1);
  900. }   
  901. /************************************************************************
  902. /*
  903. /* parse_args
  904. /*
  905. /* PURPOSE:  Sets encoding parameters to the specifications of the
  906. /* command line.  Default settings are used for parameters
  907. /* not specified in the command line.
  908. /*
  909. /* SEMANTICS:  The command line is parsed according to the following
  910. /* syntax:
  911. /*
  912. /* -l  is followed by the layer number
  913. /* -m  is followed by the mode of the two front channels
  914. /* -r  is followed by the sampling rate
  915. /* -b  is followed by the total bitrate, irrespective of the mode
  916. /* -B  is followed by the MPEG1 bitrate, irrespective of the mode
  917. /* -d  is followed by the emphasis flag
  918. /* -c  turns the copyright flag on
  919. /* -o  turns the original flag on
  920. /* -e  turns the error_protection flag on
  921. /* -C  is followed by the configuration code "???" (front,rear,2ndstereo) channels
  922. /* -L  turns the LFE flag on
  923. /* -x  is followed by the matrix
  924. /* -k  is followed by a fixed tca value, or if '-1' a random value 
  925. /* -y  is followed by the dynamic crosstalk mode, or if '-1' a random value 
  926. #ifdef Augmentation_7ch
  927. /* -X  is followed by the 7.1-ch aug. matrix
  928. /* -K  is followed by a fixed 7.1-ch aug. tca value, or if '-1' a random value 
  929. /* -Y  is followed by the 7.1-ch aug. dynX mode, or if '-1' a random value 
  930. #endif
  931. /* -w  sets phantom coding /* 27/07/95: '-p' already reserved for psy */
  932. /* -g  sets MultiLingual coding
  933. /* -D  turns the dyn_cross_LR flag on
  934. /* -P  turns the 'random prediction values' flag on
  935. /* -n  is followed by the number of ancillary data bytes
  936. /* -a  turns the ancillary flag on
  937. /* -v  sets level of verbosity of debug and progress messages
  938. /*
  939. /* If the input file is in AIFF format, the sampling frequency is read
  940. /* from the AIFF header.
  941. /*
  942. /* The input and output filenames are read into #inpath# and #outpath#.
  943. /*
  944. /************************************************************************/
  945.  
  946. void
  947. parse_args(int argc, char **argv,
  948. frame_params *fr_ps,
  949. int *psy,
  950. long unsigned int *num_samples,
  951. long unsigned int *num_samples_ml,
  952. char *original_file_name,
  953. char *encoded_file_name,
  954. IFF_AIFF *pcm_aiff_data,
  955. IFF_AIFF *pcm_aiff_data_ml,
  956. int *aiff,
  957. int *byte_per_sample,
  958. int *mat_mode,
  959. int *aug_mat_mode,
  960. int *cha_sw,
  961. int *aug_cha_sw,
  962. char *encoded_file_name_ext,
  963. int *bit_rate,
  964. char *encoded_file_name_mpg,
  965. int *dyn_cr,
  966. int *dyn_cr_LR,
  967. int *aug_dyn_cr,
  968. int *ancillaryUse,
  969. int *verbosity)
  970. {
  971.     FLOAT srate;
  972.     int  brate = DFLT_BRT;    /* MPEG1 bitrate */
  973.     layer *info = fr_ps->header;
  974.     int   err = 0, bool, i = 0;
  975.     int   ml_present = 0; /* MultiLingual coding */
  976.     
  977.     fr_ps->mnr_min = 0.0;
  978.     *aiff = 0;
  979.     *bit_rate = DFLT_BRT;    /* total bitrate */
  980.     fr_ps->phantom_c = 0;
  981.     *verbosity = DFLT_VERB;
  982.  
  983.     /* preset defaults */
  984.     original_file_name[0] = NULL_CHAR;
  985.     encoded_file_name[0] = NULL_CHAR;
  986.     info->lay = DFLT_LAY;
  987.     switch(DFLT_MOD)
  988.     {
  989. case 'r': info->mode = MPG_MD_STEREO; info->mode_ext = 0; break;
  990. case 'd': info->mode = MPG_MD_DUAL_CHANNEL; info->mode_ext=0; break;
  991. case 'j': info->mode = MPG_MD_JOINT_STEREO; break;
  992. case 'm': info->mode = MPG_MD_MONO; info->mode_ext = 0; break;
  993. default : fprintf(stderr, "%s: Bad mode dflt %cn", programName, DFLT_MOD);
  994.   abort ();
  995.     }
  996.     *psy = DFLT_PSY;
  997.     if ((info->sampling_frequency = SmpFrqIndex ((long) (1000*DFLT_SFQ))) < 0)
  998.     {
  999.         fprintf (stderr, "%s: bad sfrq default %.2fn", programName, DFLT_SFQ);
  1000.         abort ();
  1001.     }
  1002.     info->bitrate_index = DFLT_BRT;
  1003.     if ((info->bitrate_index = BitrateIndex (info->lay, DFLT_BRT)) < 0)
  1004.     {
  1005. fprintf (stderr, "%s: bad default bitrate %un", programName, DFLT_BRT);
  1006. abort ();
  1007.     }
  1008.     switch(DFLT_EMP)
  1009.     {
  1010. case 'n': info->emphasis = 0; break;
  1011. case '5': info->emphasis = 1; break;
  1012. case 'c': info->emphasis = 3; break;
  1013. default : fprintf (stderr, "%s: Bad emph dflt %cn", programName, DFLT_EMP);
  1014.   abort ();
  1015.     }
  1016.     info->copyright = 0;
  1017.     info->original = 0;
  1018.     info->error_protection = FALSE;
  1019.   
  1020.     /* process args */
  1021.     while (++i < argc && err == 0)
  1022.     {
  1023. char c, *token, *arg, *nextArg;
  1024. int  argUsed;
  1025.    
  1026. token = argv[i];
  1027. if (*token++ == '-')
  1028. {
  1029.     if (i+1 < argc)
  1030.        nextArg = argv[i+1];
  1031.     else
  1032.        nextArg = "";
  1033.    
  1034.     argUsed = 0;
  1035.     while (c = *token++)
  1036.     {
  1037. if (*token /* NumericQ(token) */)
  1038.    arg = token;
  1039. else
  1040.    arg = nextArg;
  1041.     
  1042. switch (c)
  1043. {
  1044.     case 'l': info->lay = atoi(arg);
  1045. argUsed = 1;
  1046. if (info->lay < 1 || info->lay > 2)
  1047. {
  1048.    fprintf(stderr,"%s: -l layer must be 1 or 2, not %sn",
  1049. programName, arg);
  1050.    err = 1;
  1051. }
  1052. break;
  1053.     case 'm': argUsed = 1;
  1054. if (*arg == 's')
  1055.     { info->mode = MPG_MD_STEREO; info->mode_ext = 0; }
  1056. else if (*arg == 'd')
  1057.     { info->mode = MPG_MD_DUAL_CHANNEL; info->mode_ext = 0; }
  1058. else if (*arg == 'j')
  1059.     { info->mode = MPG_MD_JOINT_STEREO; }
  1060. else if (*arg == 'm')
  1061.     { info->mode = MPG_MD_MONO; info->mode_ext = 0; }
  1062. else if (*arg == 'n')
  1063.     { info->mode = MPG_MD_NONE; info->mode_ext = 0; }
  1064. else 
  1065. {
  1066.     fprintf (stderr, "%s: -m mode must be s/d/j/m not %sn",
  1067.      programName, arg);
  1068.     err = 1;
  1069. }
  1070. break;
  1071.     case 'r': srate = atof(arg);
  1072. argUsed = 1;
  1073. if ((info->sampling_frequency =
  1074.     SmpFrqIndex ((long) (1000*srate))) < 0)
  1075.     err = 1;
  1076. break;
  1077.     case 'b': *bit_rate = atoi(arg);
  1078. argUsed = 1;
  1079. if (*bit_rate > brate)
  1080. {
  1081.     info->ext_bit_stream_present = 1;
  1082.     info->ext_length = ((*bit_rate - brate) * 144) / s_freq[info->sampling_frequency];
  1083. }
  1084. else
  1085. {
  1086.     info->ext_bit_stream_present = 0;
  1087.     brate = *bit_rate;
  1088. }
  1089. break;
  1090.     case 'B': brate = atoi(arg);
  1091. argUsed = 1;
  1092. if (*bit_rate > brate)
  1093. {
  1094.     info->ext_bit_stream_present = 1;
  1095.     info->ext_length = ((*bit_rate - brate) * 144) / s_freq[info->sampling_frequency];
  1096. }
  1097. else
  1098.     info->ext_bit_stream_present = 0;
  1099. break;
  1100.     case 'C': fr_ps->config = atoi(arg);
  1101. argUsed = 1;
  1102. break;
  1103.     case 'd': argUsed = 1;
  1104. if (*arg == 'n') info->emphasis = 0;
  1105. else if (*arg == '5') info->emphasis = 1;
  1106. else if (*arg == 'c') info->emphasis = 3;
  1107. else 
  1108. {
  1109.     fprintf (stderr, "%s: -d emp must be n/5/c not %sn",
  1110.      programName, arg);
  1111.     err = 1;
  1112. }
  1113. break;
  1114.     case 'c':   info->copyright = 1; break;
  1115.     case 'o':   info->original  = 1; break;
  1116.     case 'e':   info->error_protection = TRUE; break;
  1117.     case 'x': info->matrix = *mat_mode = atoi(arg); 
  1118.                 if (info->matrix == 3)
  1119.     *cha_sw = 0;
  1120. argUsed = 1;
  1121. break;
  1122.     case 'k': *cha_sw = atoi(arg); 
  1123. argUsed = 1;
  1124. break;
  1125.                case 'y': *dyn_cr = atoi(arg);
  1126. argUsed = 1;
  1127. break;    
  1128. #ifdef Augmentation_7ch
  1129.     case 'X': info->aug_mtx_proc = *aug_mat_mode = atoi(arg); 
  1130.                 if (info->aug_mtx_proc == 3)
  1131.     *aug_cha_sw = 0;
  1132. argUsed = 1;
  1133. break;
  1134.     case 'K': *aug_cha_sw = atoi(arg); 
  1135. argUsed = 1;
  1136. break;
  1137.                case 'Y': *aug_dyn_cr = atoi(arg);
  1138. argUsed = 1;
  1139. break;    
  1140. #endif
  1141.     case 'D': *dyn_cr_LR = 1;
  1142. break;    
  1143.     case 'L': info->lfe = 1;
  1144. break;    
  1145.     case 'w': fr_ps->phantom_c = 1;
  1146. break;    
  1147.     case 'P': info->mc_prediction_on = 1;
  1148. break;    
  1149.     case 'g': ml_present = 1;
  1150. break;    
  1151.     case 'n': info->n_ad_bytes = atoi(arg);
  1152. argUsed = 1;
  1153. break;
  1154.     case 'a': *ancillaryUse = 1;
  1155. break;
  1156.     case 'v': *verbosity = atoi(arg);
  1157. argUsed = 1;
  1158. break;
  1159.     default:    fprintf(stderr,"%s: unrec option %cn",
  1160.                                         programName, c);
  1161.                                 err = 1;
  1162. break;
  1163. }
  1164.     
  1165.     
  1166. if (argUsed)
  1167. {
  1168.     if (arg == token)
  1169. token = ""; /* no more from token */
  1170.     else
  1171. i++; /* skip arg we used */
  1172.     arg = "";
  1173.     argUsed = 0;
  1174. }
  1175.     }
  1176. }
  1177. else
  1178. {
  1179.     if (original_file_name[0] == NULL_CHAR)
  1180. strcpy (original_file_name, argv[i]);
  1181.     else if (encoded_file_name[0] == NULL_CHAR)
  1182. strcpy (encoded_file_name, argv[i]);
  1183.     else
  1184.     {
  1185. fprintf (stderr, "%s: excess arg %sn", programName, argv[i]);
  1186. err = 1;
  1187.     }
  1188. }
  1189.     }
  1190.     if ((info->bitrate_index = BitrateIndex (info->lay, brate)) < 0)
  1191. err = 1;
  1192.     if (err || original_file_name[0] == NULL_CHAR)
  1193. usage ();  /* never returns */
  1194.  
  1195.     if (encoded_file_name[0] == NULL_CHAR)
  1196.     {
  1197. strcat (strcpy (encoded_file_name_ext, original_file_name), DFLT_EXT_EXT);
  1198. strcat (strcpy (encoded_file_name, original_file_name), DFLT_EXT);
  1199. strcat (strcpy (encoded_file_name_mpg, encoded_file_name), DFLT_EXT);
  1200.     }
  1201.     else
  1202.     {
  1203. strcat (strcpy (encoded_file_name_ext, encoded_file_name), DFLT_EXT_EXT);
  1204. strcat (encoded_file_name, DFLT_EXT);
  1205. strcat (strcpy (encoded_file_name_mpg, encoded_file_name), DFLT_EXT);
  1206.     }
  1207.     if ((musicin = fopen (original_file_name, "rb")) == NULL)
  1208.     {
  1209. printf ("Could not find "%s".n", original_file_name);
  1210. exit (0);
  1211.     }
  1212.     open_bit_stream_w (&bs, encoded_file_name, BUFFER_SIZE);
  1213.     if (aiff_read_headers (musicin, pcm_aiff_data, byte_per_sample) == 0)
  1214.     {
  1215. int wrong_nr_channels = 0;
  1216. *aiff = 1;
  1217. if (*verbosity >= 2)
  1218.     printf (">>> Using Audio IFF sound file headersn");
  1219. aiff_check (original_file_name, pcm_aiff_data);
  1220. if (fr_ps->config)
  1221. {
  1222.     /* check if config and number of channels is consistent */
  1223.     switch (fr_ps->config)
  1224.     {
  1225. case 100:   wrong_nr_channels = pcm_aiff_data->numChannels != 1;
  1226.     info->mode = MPG_MD_MONO;
  1227.     info->mode_ext = 0;
  1228.     break;
  1229. case 200:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 2;
  1230.     fr_ps->lfe_pos = 2;
  1231.     break;
  1232. case 102:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 3;
  1233.     info->mode = MPG_MD_MONO;
  1234.     info->mode_ext = 0;
  1235.     info->surround = 3; 
  1236.     fr_ps->stereomc = 2;
  1237.     fr_ps->lfe_pos = 1;
  1238.     break;
  1239. case 202:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 4;
  1240.     info->surround = 3; 
  1241.     fr_ps->stereomc = 2;
  1242.     fr_ps->lfe_pos = 2;
  1243.     break;
  1244. case 210:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 3;
  1245.     info->surround = 1; 
  1246.     fr_ps->stereomc = 1;
  1247.     fr_ps->lfe_pos = 2;
  1248.     break;
  1249. case 220:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 4;
  1250.     info->surround = 2; 
  1251.     fr_ps->stereomc = 2;
  1252.     fr_ps->lfe_pos = 2;
  1253.     break;
  1254. case 302:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 5;
  1255.     info->center = 1; 
  1256.     info->surround = 3; 
  1257.     fr_ps->stereomc = 3;
  1258.     break;
  1259. case 310:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 4;
  1260.     info->center = 1; 
  1261.     info->surround = 1; 
  1262.     fr_ps->stereomc = 2;
  1263.     fr_ps->lfe_pos = 3;
  1264.     break;
  1265. case 320:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 5;
  1266.     info->center = 1; 
  1267.     info->surround = 2; 
  1268.     fr_ps->stereomc = 3;
  1269.     fr_ps->lfe_pos = 3;
  1270.     break;
  1271. #ifdef Augmentation_7ch
  1272. case 520:   wrong_nr_channels = pcm_aiff_data->numChannels - info->lfe != 7;
  1273.     if (ml_present)
  1274.     {
  1275. printf ("7.1 channel augmentation and multilingual cannot be combinedn");
  1276. exit (1);
  1277.     }
  1278.     fr_ps->config = 320;
  1279.     info->center = 1; 
  1280.     info->surround = 2; 
  1281.     fr_ps->stereomc = 3;
  1282.     fr_ps->stereoaug = 2;
  1283.     fr_ps->lfe_pos = 3;
  1284.     break;
  1285. #endif
  1286. default:    printf ("Configuration: %d not supportedn", fr_ps->config);
  1287.     exit (1);
  1288.     }
  1289. }
  1290. else
  1291. {
  1292.     if (pcm_aiff_data->numChannels == 1)
  1293.     {
  1294. fr_ps->config = 100;
  1295. info->mode = MPG_MD_MONO;
  1296. info->mode_ext = 0;
  1297.     }
  1298.     else
  1299.     {
  1300. switch (pcm_aiff_data->numChannels - info->lfe)
  1301. {
  1302.     case 2: fr_ps->config = 200;
  1303.     fr_ps->lfe_pos = 2;
  1304.     break;
  1305.     case 3: fr_ps->config = 210;
  1306.     info->surround = 1; 
  1307.     fr_ps->stereomc = 1;
  1308.     fr_ps->lfe_pos = 2;
  1309.     break;
  1310.     case 4: fr_ps->config = 310;
  1311.     info->center = 1; 
  1312.     info->surround = 1; 
  1313.     fr_ps->stereomc = 2;
  1314.     fr_ps->lfe_pos = 3;
  1315.     break;
  1316.     case 5: fr_ps->config = 320;
  1317.     info->center = 1; 
  1318.     info->surround = 2; 
  1319.     fr_ps->stereomc = 3;
  1320.     fr_ps->lfe_pos = 3;
  1321.     break;
  1322. #ifdef Augmentation_7ch
  1323.     case 7: fr_ps->config = 320;
  1324.     info->center = 1; 
  1325.     info->surround = 2; 
  1326.     fr_ps->stereomc = 3;
  1327.     fr_ps->stereoaug = 2;
  1328.     fr_ps->lfe_pos = 3;
  1329.     break;
  1330. #endif
  1331.     default: wrong_nr_channels = 1;
  1332. }
  1333.     }
  1334. }
  1335. if (wrong_nr_channels)
  1336. {
  1337.     printf ("Configuration: %d lfe: %d do not match with audio channels: %dn", 
  1338.      fr_ps->config,  info->lfe, pcm_aiff_data->numChannels);
  1339.     exit (1);
  1340. }
  1341. switch (fr_ps->config)
  1342. {
  1343.     case 100:   printf (">>> Using 1/0 configuration.n"); 
  1344. break;
  1345.     case 200:   printf (">>> Using 2/0 configuration.n"); 
  1346. break;
  1347.     case 102:   printf (">>> Using 1/0 + 2/0 configuration.n"); 
  1348. break;
  1349.     case 202:   printf (">>> Using 2/0 + 2/0 configuration.n"); 
  1350. break;
  1351.     case 210:   printf (">>> Using 2/1 configuration.n"); 
  1352. break;
  1353.     case 220:   printf (">>> Using 2/2 configuration.n"); 
  1354. break;
  1355.     case 302:   printf (">>> Using 3/0 + 2/0 configuration.n"); 
  1356. break;
  1357.     case 310:   printf (">>> Using 3/1 configuration.n"); 
  1358. break;
  1359.     case 320:   if (fr_ps->stereoaug == 0)
  1360.     printf (">>> Using 3/2 configuration.n"); 
  1361. #ifdef Augmentation_7ch
  1362. else
  1363.     printf (">>> Using 5/2 configuration.n"); 
  1364. #endif
  1365. break;
  1366. }
  1367. info->sampling_frequency = SmpFrqIndex ((long) pcm_aiff_data->sampleRate);
  1368. if (*verbosity >= 2)
  1369.     printf (">>> %.f Hz sampling frequency selectedn",
  1370.     pcm_aiff_data->sampleRate);
  1371. /* Determine number of samples in sound file */
  1372. #ifndef MS_DOS
  1373. *num_samples = pcm_aiff_data->numChannels *
  1374.        pcm_aiff_data->numSampleFrames;
  1375. #else
  1376. *num_samples = (long) (pcm_aiff_data->numChannels) *
  1377.                        (long) (pcm_aiff_data->numSampleFrames);
  1378. #endif
  1379. if (*cha_sw > 0)
  1380. {
  1381.     if (fr_ps->config == 320)
  1382. bool = *cha_sw > 7;
  1383.     else if (fr_ps->config == 310 && info->matrix == 2)
  1384. bool = *cha_sw > 5;
  1385.     else if (fr_ps->config == 310)
  1386. bool = *cha_sw > 4;
  1387.     else if (fr_ps->config == 220)
  1388. bool = *cha_sw > 3;
  1389.     else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
  1390. bool = *cha_sw > 2;
  1391.     else
  1392. bool = 1;
  1393.     if (bool)
  1394.     {
  1395. printf ("!!! Channel-switching mode %d cannot be used together with Configuration: %d !!!n", *cha_sw, fr_ps->config);
  1396. exit (1);
  1397.     }
  1398. }
  1399. #ifdef Augmentation_7ch
  1400. if (*aug_cha_sw > 0)
  1401. {
  1402.     if (info->aug_mtx_proc == 0 || info->aug_mtx_proc == -1)
  1403. bool = *aug_cha_sw > 7;
  1404.     else if (info->aug_mtx_proc == 1)
  1405. bool = *aug_cha_sw > 3;
  1406.     else
  1407. bool = 1;
  1408.     if (bool)
  1409.     {
  1410. printf ("!!! TCA7 mode %d cannot be used together with aug_mtx_proc: %d !!!n",
  1411. *aug_cha_sw, info->aug_mtx_proc);
  1412. exit (1);
  1413.     }
  1414. }
  1415. #endif
  1416. if (*dyn_cr > 0)
  1417. {
  1418.     if (fr_ps->config == 320)
  1419. bool = *dyn_cr > 14;
  1420.     else if (fr_ps->config == 310 || fr_ps->config == 220)
  1421. bool = *dyn_cr > 4;
  1422.     else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
  1423. bool = *dyn_cr > 1;
  1424.     else
  1425.      bool = 1;
  1426.     if (bool)
  1427.     {
  1428. printf ("!!! Dynamic Crosstalk mode %d cannot be used for Configuration: %d !!!n", *dyn_cr, fr_ps->config);
  1429. exit (1);
  1430.     }
  1431.     
  1432.     if (!bool && fr_ps->phantom_c)
  1433.     {
  1434.      if (fr_ps->config == 320)
  1435.     bool = ((*dyn_cr==9) || (*dyn_cr==10) || (*dyn_cr==11) || (*dyn_cr==12) || (*dyn_cr==14));
  1436. else if (fr_ps->config == 310)
  1437.     bool = (*dyn_cr==4);
  1438. if (bool)
  1439. {
  1440.     printf ("!!! Dynamic Crosstalk mode %d cannot be used together with Phantom Coding for Configuration: %d!!!n", *dyn_cr, fr_ps->config);
  1441.     exit (1);
  1442. }
  1443.     }
  1444. }
  1445. #ifdef Augmentation_7ch
  1446. if (*aug_dyn_cr > 18)
  1447. {
  1448.     printf ("!!! Aug Dynamic Crosstalk mode %d cannot be used !!!n", *aug_dyn_cr);
  1449.     exit (1);
  1450. }
  1451. #endif
  1452.     }
  1453.     else
  1454.     {
  1455. /* Not using Audio IFF sound file headers. */
  1456.    
  1457. if (*verbosity >= 2)
  1458.     printf(" NO MULTICHANNEL CODING!!n");
  1459. ml_present = 0;
  1460. if (fseek (musicin, 0, SEEK_SET) != 0)
  1461. {
  1462.     printf  ("Could not seek to PCM sound data in "%s".n", original_file_name);
  1463.     exit (0);
  1464. }
  1465.  
  1466. /* Declare sound file to have "infinite" number of samples. */
  1467. *num_samples = MAX_U_32_NUM;
  1468.     }
  1469.     /***************************************************************************/
  1470.     /* 7/8/95 Multi lingual extension WtK                                      */
  1471.     if (ml_present)
  1472.     {
  1473. strcat (strcpy (multilingual_file_name, original_file_name), DFLT_ML_EXT);
  1474. if ((musicin_ml = fopen (multilingual_file_name, "rb")) == NULL) 
  1475. {
  1476.     printf ("Could not find "%s".nNo MultiLingual Codingn", multilingual_file_name);
  1477.     info->multiling_ch = 0;
  1478. }
  1479. else if (aiff_read_headers (musicin_ml, pcm_aiff_data_ml, byte_per_sample) == 0) 
  1480. {
  1481.     if (*verbosity >= 2)
  1482. printf (">>> Using Audio IFF multilingual file headersn");
  1483.     info->multiling_ch = pcm_aiff_data_ml->numChannels;
  1484.     if (*verbosity >= 2)
  1485. printf (">>> Using %d multilingual channelsn", info->multiling_ch);
  1486.     *num_samples_ml = pcm_aiff_data_ml->numChannels *
  1487.       pcm_aiff_data_ml->numSampleFrames;
  1488. }
  1489. else     /* Not using Audio IFF sound file headers. */
  1490. {
  1491.     printf("***WARNING: Could not read ML AIFF header - No MultiLingual coding!!n");
  1492.     info->multiling_ch = 0;
  1493. }
  1494. if (info->multiling_ch > 0)
  1495. {
  1496.     switch (SmpFrqIndex ((long) pcm_aiff_data_ml->sampleRate) - info->sampling_frequency)
  1497.     {
  1498. case 16 :   if (*verbosity >= 2)
  1499. printf ("MultiLingual is LSF coded.n");
  1500.     info->multiling_fs = 1;
  1501.     break;
  1502. case  0 :   if (*verbosity >= 2)
  1503. printf ("MultiLingual sample rate equals that of Audio.n");
  1504.     info->multiling_fs = 0;
  1505.     break;
  1506. default :   printf ("***WARNING: MultiLingual sample rate unequals (half) mc sample rate.n");
  1507.             printf ("            No MultiLingual coding!!!n");
  1508.     info->multiling_ch = 0;
  1509.     break;
  1510.     } /*switch*/
  1511. } /*if (ml_ch>0)*/
  1512.     }
  1513.     else
  1514.     {
  1515. info->multiling_ch = 0;
  1516.     } /* if (ml_present) */
  1517.     /* 7/8/95 Multi lingual extension WtK                                      */
  1518.     /***************************************************************************/
  1519. }
  1520. /************************************************************************
  1521. /*
  1522. /* print_config
  1523. /*
  1524. /* PURPOSE:  Prints the encoding parameters used
  1525. /*
  1526. /************************************************************************/
  1527.  
  1528. void
  1529. print_config (frame_params *fr_ps, int *psy, long unsigned int *num_samples, char *inPath, char *outPath, int *aiff)
  1530. {
  1531.     layer *info = fr_ps->header;
  1532.  
  1533.     printf ("Encoding configuration:n");
  1534.     if (*aiff == 1)
  1535. printf ("Layer=%s   mode=%s   extn=%d   psy model=%dn",
  1536.         layer_names[info->lay-1], mode_names[info->mode],
  1537.         info->mode_ext, *psy);
  1538.     else
  1539. printf ("Layer=%s   mode=%s   extn=%d    psy model=%dn",
  1540.         layer_names[info->lay-1], mode_names[info->mode],
  1541.         info->mode_ext, *psy);
  1542.     if (info->bitrate_index != 0)
  1543.     {
  1544. if (bitrate[info->lay-1][info->bitrate_index] == 1000)
  1545.     printf ("samp frq=%.1f kHz   total bitrate=dynamic bitraten",
  1546.     s_freq[info->sampling_frequency]);
  1547. else
  1548.     printf ("samp frq=%.1f kHz   mpeg1 bitrate=%d kbpsn",
  1549.     s_freq[info->sampling_frequency],
  1550.     bitrate[info->lay-1][info->bitrate_index]);
  1551. if (info->ext_bit_stream_present)
  1552.     printf ("ext bitrate=%d kbpsn", (int) (info->ext_length * s_freq[info->sampling_frequency] / 144));
  1553.     }
  1554.     if (info->multiling_ch > 0)
  1555.     {
  1556.         printf ("%d multilingual channels ", info->multiling_ch);
  1557.         if (info->multiling_fs == 1)
  1558.     printf ("LSF coded.n");
  1559.         else
  1560.     printf ("full sample rate coded.n");
  1561.     }
  1562.     else
  1563. printf ("No multilingual coding.n");
  1564.     printf ("de-emph=%d   c/right=%d   orig=%d   errprot=%dn",
  1565.             info->emphasis, info->copyright, info->original,
  1566.             info->error_protection);
  1567.     printf ("matrix=%d  center=%d  surround=%d  stereo=%d  stereomc=%d  stereoaug=%dn",
  1568.             info->matrix, info->center, info->surround,
  1569.     fr_ps->stereo, fr_ps->stereomc, fr_ps->stereoaug);
  1570.     printf ("input file: '%s'   output file: '%s'n", inPath, outPath);
  1571.     fflush (stdout);
  1572. }
  1573.  
  1574. /************************************************************************
  1575. /*
  1576. /* main
  1577. /*
  1578. /* PURPOSE:  MPEG I Encoder supporting layers 1 and 2, and
  1579. /* psychoacoustic models 1 (MUSICAM) and 2 (AT&T),now portated
  1580. /* to multichannel (two front channels, one center and three surround
  1581. /* channels. There are different possibilities to code the AIFF-signal,
  1582. /* like coding only the surround channels or the front channels,
  1583. /* different bitrates for front and surropund channels etc.
  1584. /* dec1992 sr.
  1585. /*
  1586. /* SEMANTICS:  One overlapping frame of audio of up to 2 channels are
  1587. /* processed at a time in the following order:
  1588. /* (associated routines are in parentheses)
  1589. /*
  1590. /* 1.  Filter sliding window of data to get 32 subband
  1591. /* samples per channel.
  1592. /* (window_subband,filter_subband)
  1593. /*
  1594. /* 2.  If joint stereo mode, combine left and right channels
  1595. /* for subbands above #jsbound#.
  1596. /* (*_combine_LR)
  1597. /*
  1598. /* 3.  Calculate scalefactors for the frame, and if layer 2,
  1599. /* also calculate scalefactor select information.
  1600. /* (*_scale_factor_calc)
  1601. /*
  1602. /* 4.  Calculate psychoacoustic masking levels using selected
  1603. /* psychoacoustic model.
  1604. /* (*_Psycho_One, psycho_anal)
  1605. /*
  1606. /* 5.  Perform iterative bit allocation for subbands with low
  1607. /* mask_to_noise ratios using masking levels from step 4.
  1608. /* (*_main_bit_allocation)
  1609. /*
  1610. /* 6.  If error protection flag is active, add redundancy for
  1611. /* error protection.
  1612. /* (*_CRC_calc)
  1613. /*
  1614. /* 7.  Pack bit allocation, scalefactors, and scalefactor select
  1615. /* information (layer 2) onto bitstream.
  1616. /* (*_encode_bit_alloc,*_encode_scale,II_transmission_pattern)
  1617. /*
  1618. /* 8.  Quantize subbands and pack them into bitstream
  1619. /* (*_subband_quantization, *_sample_encoding)
  1620. /*
  1621. /************************************************************************/
  1622. #ifdef MS_DOS
  1623. extern unsigned _stklen = 16384;
  1624. #endif
  1625. typedef double JSBS[2][3][12][SBLIMIT];
  1626. typedef double IN[14][HAN_SIZE]; /* JMZ 08/03/1995 */
  1627. typedef unsigned int SUB[14][3][12][SBLIMIT]; /* JMZ 08/03/1995 */
  1628. typedef double SAM[12];
  1629. typedef unsigned int LSB[12];
  1630. main (int argc, char **argv)
  1631. {
  1632.     double  sb_sample[14][3][12][SBLIMIT]; /* JMZ 08/03/1995 */
  1633.     JSBS    *j_sample;
  1634.     IN     *win_que;
  1635.     SUB     *subband;
  1636.     SAM     *lfe_sample;
  1637.     LSB     *lfe_sbband;
  1638.  
  1639.     frame_params fr_ps;
  1640.     layer info;    
  1641.     char original_file_name[MAX_NAME_SIZE];
  1642.     char encoded_file_name[MAX_NAME_SIZE];
  1643.     char encoded_file_name_ext[MAX_NAME_SIZE];
  1644.     char encoded_file_name_mpg[MAX_NAME_SIZE];
  1645.     double *win_buf[14]; /* JMZ 08/03/1995 */
  1646.     static double buffer[14][1152]; /* JMZ 08/03/1995 */
  1647.     double spiki[14][SBLIMIT]; /* JMZ 08/03/1995 */
  1648.     static unsigned int bit_alloc[14][SBLIMIT], scfsi[14][SBLIMIT], scfsi_dyn[14][SBLIMIT]; /* JMZ 08/03/1995 */
  1649.     static unsigned int scalar[14][3][SBLIMIT], j_scale[2][3][SBLIMIT],  scalar_dyn[14][3][SBLIMIT];
  1650.     static double ltmin[14][SBLIMIT], lgmin[14][SBLIMIT], max_sc[14][SBLIMIT], smr[14][SBLIMIT]; /* JMZ 08/03/1995 */
  1651.     static unsigned int lfe_alloc;
  1652.     static unsigned int lfe_scalar; 
  1653.     FLOAT snr32[32];
  1654.     short sam[14][1056]; /* JMZ 08/03/1995 */
  1655.     double buffer_matr[14][1152]; /* JMZ 08/03/1995 */
  1656.     int whole_SpF, extra_slot = 0;
  1657.     double avg_slots_per_frame, frac_SpF, slot_lag;
  1658.     int model, stereo, error_protection, stereomc, stereoaug;
  1659.     static unsigned int crc, crcmc, crcaug, crcext;
  1660.     int i, j, k, adb, p, l, m, lfe, s;
  1661.     unsigned long bitsPerSlot, samplesPerFrame, frameNum = 0;
  1662.     unsigned long frameBits, sentBits = 0;
  1663.     unsigned long num_samples;
  1664.     unsigned long num_samples_ml;                /* 08/03/1995 JMZ Multilingual */
  1665.     int odd_ml = 1;                                    /* LSF MultiLingual: audio inputting only at odd frames , WtK 7/8/95 */
  1666.     int ml_eof = 0;                                    /* MultiLingual: frame loop stops if either audio or ML-file has been exhausted , WtK 7/8/95 */
  1667.     IFF_AIFF aiff_ptr;
  1668.     IFF_AIFF aiff_ptr_ml;                        /* 08/03/1995 JMZ Multilingual */
  1669.     int aiff = 0;                                      /* misused to indicate mc-input */
  1670.     int byte_per_sample = 0;
  1671.     int mat_mode = 0;
  1672.     int aug_mat_mode = 0;
  1673.     int cha_sw = -2;
  1674.     int aug_cha_sw = 0;
  1675.     int dyn_cr = 0;
  1676.     int dyn_cr_LR = 0;
  1677.     int aug_dyn_cr = 0;
  1678.     int predis = 0;
  1679.     int bit_rate = 0;
  1680.     unsigned int crc_buffer[15];
  1681.     int lfe_bits = 0;
  1682.     int sentBits1, frameBits1;
  1683.     int hi,  hu,  ho;
  1684. /*    char *blubb = "rm ";*/
  1685.     char blubb[128]; /* Corrected BUG JMZ 29/03/1995*/
  1686.     int  ancillaryUse = 0;  /* YBKim060695 ancillary */
  1687.     
  1688. #ifdef  PRINTOUT
  1689.     int       loop_channel,loop_subband;
  1690.     
  1691.     al_table  *loop_alloc; /* a pointer to a table */
  1692.     sb_alloc  loop_struct; /* a structure of 4 int's */
  1693.     alloc_ptr loop_str_ptr; /* a pointer to an sb_alloc structure */
  1694.     float     loop_bits;
  1695. #endif
  1696. #ifdef  MACINTOSH
  1697.     console_options.nrows = MAC_WINDOW_SIZE;
  1698.     argc = ccommand(&argv);
  1699. #endif
  1700.     program_information();
  1701.     /* Most large variables are declared dynamically to ensure
  1702.        compatibility with smaller machines */
  1703.     j_sample = (JSBS *) mem_alloc (sizeof (JSBS), "j_sample");   
  1704.     win_que = (IN *) mem_alloc (sizeof (IN), "Win_que");       
  1705.     subband = (SUB *) mem_alloc (sizeof (SUB),"subband");        
  1706.     lfe_sample = (SAM *) mem_alloc (sizeof (SAM), "lfe_sample");
  1707.     lfe_sbband = (LSB *) mem_alloc (sizeof (LSB),"lfe_sbband");
  1708.  
  1709.     /* clear buffers */
  1710.     memset ((char *) buffer, 0, sizeof (buffer));
  1711.     memset ((char *) bit_alloc, 0, sizeof (bit_alloc));
  1712.     memset ((char *) scalar, 0, sizeof (scalar));
  1713.     memset ((char *) j_scale, 0, sizeof (j_scale));
  1714.     memset ((char *) scfsi, 0, sizeof (scfsi));
  1715.     memset ((char *) ltmin, 0, sizeof (ltmin));
  1716.     memset ((char *) lgmin, 0, sizeof (lgmin));
  1717.     memset ((char *) max_sc, 0, sizeof (max_sc));
  1718.     memset ((char *) snr32, 0, sizeof (snr32));
  1719.     memset ((char *) sam, 0, sizeof (sam));
  1720.  
  1721.     fr_ps.header = &info;
  1722.     info.mode_ext = 0;
  1723.     fr_ps.tab_num = -1;             /* no table loaded */
  1724.     fr_ps.tab_num_mc = -1;
  1725.     fr_ps.tab_num_ml = -1;
  1726.     fr_ps.alloc = NULL;
  1727.     fr_ps.alloc_mc = NULL;
  1728.     fr_ps.alloc_ml = NULL;
  1729.     info.version = MPEG_AUDIO_ID;
  1730.     info.bitrate_index = 0;
  1731.     info.lfe = 0;     /* no low frequency effect channel present! */
  1732.     info.center = 0; 
  1733.     info.surround = 0; 
  1734.     info.multiling_ch  = 0;
  1735.     info.multiling_fs  = 0;
  1736.     info.multiling_lay = 0;
  1737.     info.matrix = 0;
  1738. #ifdef Augmentation_7ch
  1739.     info.aug_mtx_proc = 0;
  1740. #endif
  1741.     info.ext_bit_stream_present = 0;
  1742.     info.n_ad_bytes = DFLT_NADB;
  1743.     info.audio_mix = 0;
  1744.     info.dyn_cross_LR = 0;    /* C out of Lo */
  1745.     info.mc_prediction_on = 0;        
  1746.     info.ext_length = 0;
  1747.     info.ext_bit = 0;
  1748.     info.copy_ident_bit = 0;
  1749.     info.copy_ident_start = 0;
  1750.     fr_ps.config = 0;
  1751.     fr_ps.phantom_c = 0;
  1752.     fr_ps.stereomc = 0;
  1753.     fr_ps.stereoaug = 0;
  1754.     programName = argv[0];
  1755.     if (argc == 1)     /* no command-line args */
  1756. obtain_parameters (&fr_ps, &model, &num_samples, &num_samples_ml, original_file_name,
  1757.    encoded_file_name, &aiff_ptr, &aiff_ptr_ml, &aiff, &byte_per_sample, 
  1758.    &mat_mode, &aug_mat_mode, &cha_sw, &aug_cha_sw,
  1759.    encoded_file_name_ext, &bit_rate, encoded_file_name_mpg,
  1760.    &dyn_cr, &dyn_cr_LR, &aug_dyn_cr, &ancillaryUse, &verbosity);
  1761.     else
  1762.         parse_args(argc, argv, &fr_ps, &model, &num_samples, &num_samples_ml, original_file_name,
  1763.    encoded_file_name, &aiff_ptr, &aiff_ptr_ml, &aiff, &byte_per_sample, 
  1764.    &mat_mode, &aug_mat_mode, &cha_sw, &aug_cha_sw,
  1765.    encoded_file_name_ext, &bit_rate, encoded_file_name_mpg,
  1766.    &dyn_cr, &dyn_cr_LR, &aug_dyn_cr, &ancillaryUse, &verbosity);
  1767.     hdr_to_frps (&fr_ps);
  1768.     if (aiff != 1) fr_ps.stereomc = 0;
  1769.     print_config (&fr_ps, &model, &num_samples,
  1770.   original_file_name, encoded_file_name, &aiff);
  1771.   
  1772.     stereo = fr_ps.stereo;
  1773.     stereomc = fr_ps.stereomc;
  1774.     stereoaug = fr_ps.stereoaug;
  1775.     lfe = info.lfe;
  1776.     error_protection = info.error_protection;
  1777.  
  1778.     if (info.lay == 1) { bitsPerSlot = 32; samplesPerFrame = 384;  }
  1779.     else               { bitsPerSlot = 8;  samplesPerFrame = 1152; }
  1780.     /* Figure average number of 'slots' per frame. */
  1781.     /* Bitrate means TOTAL for both channels, not per side. */
  1782.     if (bit_rate == 0) bit_rate = bitrate[info.lay-1][info.bitrate_index];
  1783.     if (verbosity >= 2) printf("bit_rate = %dn", bit_rate);
  1784.     fflush(stderr);  
  1785.   
  1786.     avg_slots_per_frame = ((double) samplesPerFrame / s_freq[info.sampling_frequency]) *
  1787.   ((double) bit_rate / (double) bitsPerSlot);
  1788.     whole_SpF = (int) avg_slots_per_frame;  /* Bytes per frame within datastream*/
  1789.     if (verbosity >= 2)
  1790. printf ("slots/frame = %dn", whole_SpF);
  1791.     frac_SpF  = avg_slots_per_frame - (double) whole_SpF;
  1792.     slot_lag  = -frac_SpF;
  1793.     if (verbosity >= 2)
  1794. printf("frac SpF=%.3f, tot bit_rate=%d kbps, s freq=%.1f kHzn",
  1795.                 frac_SpF, bit_rate, s_freq[info.sampling_frequency]);
  1796.  
  1797.     if (frac_SpF != 0)
  1798.     {
  1799. if (verbosity >= 2)
  1800.     printf ("Fractional number of slots, padding requiredn");
  1801.     }
  1802.     else
  1803. info.padding = 0;
  1804. #ifdef PRINTOUT
  1805.     if (verbosity >= 3)
  1806.     {
  1807. printf ("nFrame ");
  1808. for (loop_subband = 0; loop_subband < SBLIMIT; loop_subband++)
  1809.     printf ("%3d",loop_subband);
  1810. printf ("n");
  1811.     }
  1812. #endif
  1813.  
  1814.     while ( 
  1815.              ( get_audio (musicin, buffer, num_samples, stereo, &aiff_ptr,
  1816.                   stereomc, stereoaug, &fr_ps, &aiff, &byte_per_sample,
  1817.                   buffer_matr) > 0 ) &&
  1818.      ( !ml_eof )
  1819.   )
  1820.     {
  1821. /****************************************************************/
  1822. /*                                                              */
  1823. /*                  START OF FRAME LOOP                         */
  1824. /*                                                              */
  1825. /****************************************************************/
  1826. /* the following allocation must happen within the while-loop. 1/5/93, SR */
  1827.   
  1828. if (mat_mode == -1)
  1829. {
  1830.     if (fr_ps.config == 320 || fr_ps.config == 310)
  1831. info.matrix = rand () % 4;
  1832.     else
  1833.     {
  1834. info.matrix = rand () % 3;
  1835. if (info.matrix == 2)
  1836.     info.matrix++;
  1837.     }
  1838. }
  1839. else
  1840.     info.matrix = mat_mode;
  1841. init_mc_pred (&fr_ps);
  1842. info.tc_sbgr_select = 1;
  1843. info.dyn_cross_on = 0;  
  1844. if (dyn_cr != 0 || fr_ps.config == 302 || fr_ps.config == 202)
  1845.     if (dyn_cr_LR == -1)
  1846. info.dyn_cross_LR = rand () % 2;
  1847.     else
  1848. info.dyn_cross_LR = dyn_cr_LR;
  1849. else
  1850.     info.dyn_cross_LR = 0;
  1851. #ifdef Augmentation_7ch
  1852. if (aug_mat_mode == -1)
  1853. {
  1854.     info.aug_mtx_proc = rand () % 3;
  1855.     if (info.aug_mtx_proc == 2)
  1856. info.aug_mtx_proc++;
  1857. }
  1858. else
  1859.     info.aug_mtx_proc = aug_mat_mode;
  1860. info.aug_dyn_cross_on = 0;    
  1861. info.aug_future_ext = 0;
  1862. #endif
  1863. for (i = 0; i < 12; i++)
  1864. {
  1865.     info.tc_alloc[i] = 0;
  1866.     info.dyn_cross[i] = 0;
  1867.     info.dyn_second_stereo[i] = 0;
  1868. #ifdef Augmentation_7ch
  1869.     info.aug_tc_alloc[i] = 0;
  1870.     info.aug_dyn_cross[i] = 0;
  1871. #endif
  1872. }
  1873. lfe_alloc = 0;
  1874.   
  1875. if (stereomc > 0 && (fr_ps.header->center == 1 || fr_ps.header->center==3))
  1876. {
  1877.     if (fr_ps.phantom_c == 1) fr_ps.header->center = 3;
  1878.     if (fr_ps.phantom_c == 0) fr_ps.header->center = 1;
  1879. }
  1880.   
  1881.         if (verbosity >= 1)
  1882. {
  1883.     fprintf (stderr, "{%4lu}r", frameNum++);
  1884.     fflush (stderr);
  1885. }
  1886. win_buf[0] = &buffer[0][0];
  1887. win_buf[1] = &buffer[1][0];
  1888. win_buf[2] = &buffer[2][0];
  1889. win_buf[3] = &buffer[3][0];
  1890. win_buf[4] = &buffer[4][0];
  1891. win_buf[5] = &buffer[5][0];
  1892. win_buf[6] = &buffer[6][0];
  1893. win_buf[7] = &buffer[7][0]; /* JMZ 08/03/1995 Multilingual */
  1894. win_buf[8] = &buffer[8][0]; /* JMZ 08/03/1995 Multilingual */
  1895. win_buf[9] = &buffer[9][0]; /* JMZ 08/03/1995 Multilingual */
  1896. win_buf[10] = &buffer[10][0]; /* JMZ 08/03/1995 Multilingual */
  1897. win_buf[11] = &buffer[11][0]; /* JMZ 08/03/1995 Multilingual */
  1898. win_buf[12] = &buffer[12][0]; /* JMZ 08/03/1995 Multilingual */
  1899. win_buf[13] = &buffer[13][0]; /* JMZ 08/03/1995 Multilingual */
  1900.         if (frac_SpF != 0)
  1901. {
  1902.     if (slot_lag > (frac_SpF - 1.0))
  1903.     {
  1904.         slot_lag -= frac_SpF;
  1905.         extra_slot = 0;
  1906.         info.padding = 0;
  1907.         if (verbosity >= 2)
  1908.     printf ("No padding for this framen"); 
  1909.     }
  1910.     else
  1911.     {
  1912.         extra_slot = 1;
  1913.         info.padding = 1;
  1914.         slot_lag += (1-frac_SpF);
  1915.     }
  1916.         }
  1917. adb = (whole_SpF + extra_slot) * bitsPerSlot;
  1918. if (verbosity >= 2)
  1919.     printf ("Adb0: %ldn", adb);
  1920. /**************************************************************************/
  1921. /* 08/03/1995 JMZ Multilingual , WtK 7/8/95 */
  1922. if (info.multiling_ch > 0)
  1923. {
  1924.     if (odd_ml)
  1925.     {
  1926. if (get_audio_ml (musicin_ml, buffer, num_samples_ml, &aiff_ptr, &fr_ps, 
  1927.   &aiff, &byte_per_sample,buffer_matr) != 1152*info.multiling_ch )
  1928. {
  1929.     if (verbosity >= 2)
  1930. printf("nHit end of MultiLingual file.n");
  1931.     ml_eof = 1;
  1932. }
  1933. for (i = 0; i < 3; i++)
  1934.     for (j = 0; j < 12; j++)
  1935. for (k = 7; k < 7 + info.multiling_ch; k++) 
  1936. {
  1937.     window_subband (&win_buf[k], &(*win_que)[k][0], k);
  1938.     filter_subband (&(*win_que)[k][0], &(sb_sample)[k][i][j][0]);
  1939. }
  1940. if (info.multiling_fs == 1)
  1941.     ml_sb_sample_swap (7, 7 + info.multiling_ch, sb_sample); /* half fs */
  1942.     }
  1943.     else
  1944. ml_sb_sample_shift (7, 7 + info.multiling_ch, sb_sample);
  1945. }
  1946. /* 08/03/1995 JMZ Multilingual */
  1947. /**************************************************************************/
  1948.         switch (info.lay)
  1949.         {
  1950.  
  1951. /***************************** Layer I **********************************/
  1952.         case 1: for (j = 0; j < 12; j++)
  1953.     for (k = 0; k < stereo; k++)
  1954.     {
  1955. window_subband (&win_buf[k], &(*win_que)[k][0], k);
  1956. filter_subband (&(*win_que)[k][0], &(/***/sb_sample)[k][0][j][0]);
  1957.                     }
  1958. I_scale_factor_calc (sb_sample, scalar, stereo);
  1959. if (fr_ps.actual_mode == MPG_MD_JOINT_STEREO)
  1960. {
  1961.     I_combine_LR (sb_sample, *j_sample);
  1962.     I_scale_factor_calc (/***/sb_sample, scalar, 1);
  1963. }
  1964.     
  1965. put_scale (scalar, &fr_ps, max_sc);
  1966.     
  1967. I_Psycho_One (buffer, max_sc, ltmin, &fr_ps);
  1968.     
  1969. I_main_bit_allocation (ltmin, bit_alloc, &adb, &fr_ps);
  1970.     
  1971. if (error_protection)
  1972.     I_CRC_calc (&fr_ps, bit_alloc, &crc);
  1973.     
  1974. encode_info (&fr_ps, &bs);
  1975.     
  1976. if (error_protection)
  1977.     encode_CRC (crc, &bs);
  1978.     
  1979. I_encode_bit_alloc (bit_alloc, &fr_ps, &bs);
  1980. I_encode_scale (scalar, bit_alloc, &fr_ps, &bs);
  1981. I_subband_quantization (scalar,/** */sb_sample, j_scale, *j_sample,
  1982.         bit_alloc, *subband, &fr_ps);
  1983. I_sample_encoding (*subband, bit_alloc, &fr_ps, &bs);
  1984.    
  1985. /* YBKim060695 ancillary */
  1986. if(ancillaryUse)
  1987.     ancillary_encode (&fr_ps,&bs,adb);
  1988. else
  1989.     for (i = 0; i < adb; i++)
  1990. put1bit (&bs, 0);
  1991.         break;
  1992.  
  1993. /***************************** Layer 2 **********************************/
  1994.  
  1995. case 2: if (aiff != 1)
  1996. {
  1997.     for (i = 0; i < 3; i++)
  1998. for (j = 0;j < 12; j++)
  1999.     for (k = 0; k < stereo; k++)
  2000.     {
  2001. window_subband (&win_buf[k], &(*win_que)[k][0], k);
  2002. filter_subband (&(*win_que)[k][0], &(sb_sample)[k][i][j][0]);
  2003.     }
  2004.  
  2005.     l = 0;
  2006.     m = stereo;
  2007.     II_scale_factor_calc (&fr_ps, sb_sample, scalar, fr_ps.sblimit, l, m);
  2008.     if (info.multiling_ch > 0)
  2009.         II_scale_factor_calc (&fr_ps, sb_sample, scalar, fr_ps.sblimit_ml, 7, 7 + info.multiling_ch);
  2010.     
  2011.     pick_scale (scalar, &fr_ps, max_sc, cha_sw, aug_cha_sw, aiff);
  2012.     if (fr_ps.actual_mode == MPG_MD_JOINT_STEREO)
  2013.     {
  2014. II_combine_LR (sb_sample, *j_sample, fr_ps.sblimit);
  2015. II_scale_factor_calc (&fr_ps, *j_sample, j_scale, fr_ps.sblimit, 0, 1);
  2016.     }
  2017.  
  2018.     /* this way we calculate more mono than we need */
  2019.                     /* but it is cheap */
  2020.     II_Psycho_One (buffer, max_sc, ltmin, &fr_ps, smr, spiki, aiff);
  2021.     if (info.multiling_ch > 0)
  2022.     {
  2023. if (odd_ml)
  2024.     II_Psycho_One_ml (buffer, max_sc, ltmin, &fr_ps, smr, spiki);
  2025. if (info.multiling_fs)
  2026. {
  2027.     pick_scale_ml_2 (&fr_ps, sb_sample, max_sc);
  2028.     for (k = 7; k < 7 + info.multiling_ch; k++) 
  2029. II_smr (&ltmin[k][0], &smr[k][0], &spiki[k][0], &max_sc[k][0], fr_ps.sblimit_ml, 0, fr_ps.sblimit_ml);
  2030. }
  2031.     }
  2032.     II_transmission_pattern (scalar, scfsi, &fr_ps);
  2033.     II_main_bit_allocation (smr, ltmin, scfsi, bit_alloc, &adb,
  2034.     &fr_ps, &aiff, sb_sample, 
  2035.     scalar, max_sc, buffer_matr,
  2036.     spiki, *j_sample, j_scale,
  2037.     dyn_cr, aug_dyn_cr,
  2038.     scfsi_dyn, scalar_dyn);
  2039.     if (error_protection)
  2040. II_CRC_calc (&fr_ps, bit_alloc, scfsi, &crc);
  2041.     encode_info (&fr_ps, &bs);
  2042.     
  2043.     if (error_protection)
  2044. encode_CRC (crc, &bs);
  2045.     II_encode_bit_alloc (bit_alloc, &fr_ps, &bs);
  2046.    
  2047.     k = 0;
  2048.     i = stereo;
  2049.     II_encode_scale (bit_alloc, scfsi, scalar, lfe_alloc,
  2050.      lfe_scalar, &fr_ps, &bs, &k , &i);
  2051.     II_subband_quantization (scalar, sb_sample, j_scale, *j_sample,
  2052.      bit_alloc, *subband, &fr_ps);
  2053.     II_sample_encoding (*subband, bit_alloc, &fr_ps, &bs);
  2054.         
  2055. /*******************************************************/
  2056. /* 08/03/1995 JMZ Multilingual */
  2057.     if (info.multiling_ch > 0)
  2058.     {
  2059. k = 7;
  2060. i = info.multiling_ch + 7;  
  2061. II_encode_bit_alloc_ml (bit_alloc, &fr_ps, &bs);
  2062. II_encode_scale_ml (bit_alloc, scfsi, scalar, &fr_ps, &bs, &k, &i);
  2063. II_subband_quantization_ml (scalar, sb_sample, j_scale,
  2064.     *j_sample, bit_alloc, *subband, &fr_ps);
  2065. II_sample_encoding_ml (*subband, bit_alloc, &fr_ps, &bs);
  2066.     }
  2067. /* 08/03/1995 JMZ Multilingual */
  2068. /*******************************************************/
  2069.     /* YBKim060695 ancillary */
  2070.     if (ancillaryUse)
  2071.    ancillary_encode (&fr_ps, &bs, adb);
  2072.     else
  2073. for (i = 0; i < adb; i++)
  2074.     put1bit (&bs, 0);
  2075. }
  2076. /*********************** Now Layer 2 with MC extension **************************/
  2077. else
  2078. {
  2079.     if (verbosity >= 2)
  2080. printf ("Adb1: %ldn", adb);
  2081.     if (lfe)
  2082.     {
  2083. lfe_bits = adb;
  2084. lfe_filter (&win_buf[fr_ps.lfe_pos], *lfe_sample);
  2085. lf_scalefactor (*lfe_sample, &lfe_scalar);
  2086. lfe_allocation (&lfe_alloc, &adb);
  2087. lfe_bits -= adb;     
  2088.     }
  2089.        
  2090.     for (i = 0; i < 3; i++)
  2091. for (j = 0; j < 12; j++)
  2092. {
  2093.     l = 0;
  2094.    
  2095.     for (k = 0; k < 7; k++)
  2096.     {
  2097. if (lfe && (k == fr_ps.lfe_pos))
  2098.     l +=1; 
  2099. window_subband (&win_buf[l], &(*win_que)[k][0], k);
  2100. filter_subband (&(*win_que)[k][0], &(sb_sample)[k][i][j][0]);
  2101. l++;
  2102.     }
  2103. }
  2104. #ifdef Augmentation_7ch
  2105.     if (stereoaug == 2)
  2106.     {
  2107. normalizing_aug (sb_sample, &fr_ps);
  2108. matricing_aug (sb_sample, &fr_ps);
  2109.     }
  2110.     else
  2111. #endif
  2112. normalizing (sb_sample, &fr_ps);
  2113.     
  2114.     matricing (sb_sample, &fr_ps);
  2115.     
  2116.     l = 0;
  2117.     if (stereoaug == 2) m = 12;
  2118.     else m = 7;
  2119.     II_scale_factor_calc (&fr_ps, sb_sample, scalar, fr_ps.sblimit, 0, stereo);
  2120.     II_scale_factor_calc (&fr_ps, sb_sample, scalar, fr_ps.sblimit_mc, stereo, m);
  2121.     if (info.multiling_ch > 0)
  2122.         II_scale_factor_calc (&fr_ps, sb_sample, scalar, fr_ps.sblimit_ml, 7, 7 + info.multiling_ch);
  2123.     pick_scale (scalar, &fr_ps, max_sc, cha_sw, aug_cha_sw, aiff);
  2124.     
  2125.     if (fr_ps.actual_mode == MPG_MD_JOINT_STEREO)
  2126.     {
  2127. if (verbosity >= 2)
  2128. {
  2129.     printf ("JOINT!!n");
  2130.     fflush (stdout);
  2131. }
  2132. i = 0;
  2133. II_combine_LR (sb_sample, *j_sample, fr_ps.sblimit);
  2134. II_scale_factor_calc1 (*j_sample, j_scale, fr_ps.sblimit, i);
  2135.     }
  2136.     
  2137.     II_Psycho_One (buffer_matr, max_sc, ltmin, &fr_ps, smr, spiki, aiff);
  2138.     if (info.multiling_ch > 0)
  2139.     {
  2140. if (odd_ml)
  2141.     II_Psycho_One_ml (buffer_matr, max_sc, ltmin, &fr_ps, smr, spiki);
  2142.     
  2143. if (info.multiling_fs)
  2144. {
  2145.     pick_scale_ml_2 (&fr_ps, sb_sample, max_sc);
  2146.     for (k = 7; k < 7 + info.multiling_ch; k++) 
  2147. II_smr (&ltmin[k][0], &smr[k][0], &spiki[k][0], &max_sc[k][0], fr_ps.sblimit_ml, 0, fr_ps.sblimit_ml);
  2148. }
  2149.     }
  2150.     
  2151.     II_transmission_pattern (scalar, scfsi, &fr_ps);
  2152.     
  2153.     /*in case of ext_bit_stream adb is the complete number of bits!! 06/22/94, SR*/
  2154.      
  2155.     II_main_bit_allocation (smr, ltmin, scfsi, bit_alloc, &adb,
  2156.     &fr_ps, &aiff, sb_sample, scalar,
  2157.     max_sc, buffer_matr, spiki,
  2158.     *j_sample, j_scale, dyn_cr, aug_dyn_cr, scfsi_dyn, scalar_dyn);
  2159.     if (verbosity >= 2)
  2160. printf ("Adb2: %ldn", adb);
  2161.     
  2162.     if (info.mc_prediction_on)
  2163. set_mc_pred (&fr_ps);
  2164.     /* PREDISTORTION, 4/7/94, SR*/
  2165.     if (fr_ps.config == 320 &&
  2166. FALSE &&     /* still a problem 7/2/97 FdB */
  2167.      info.matrix == 0 &&
  2168. info.mode != MPG_MD_JOINT_STEREO &&
  2169. info.dyn_cross_on == 0 &&
  2170. #ifdef Augmentation_7ch
  2171. stereoaug == 0 &&
  2172. #endif
  2173. info.mc_prediction_on == 0)
  2174.     {
  2175. adb = (whole_SpF + extra_slot) * bitsPerSlot - lfe_bits;
  2176. predistortion (sb_sample, scalar, bit_alloc, *subband,
  2177.        &fr_ps, smr, scfsi, &adb, scfsi_dyn);
  2178. predis = 1; 
  2179. if (verbosity >= 2)
  2180.     printf ("Adb3: %ldn", adb);
  2181.     }     
  2182. /*
  2183. */
  2184.     /********** PREDISTORTION-END*****/
  2185.     
  2186.     if (error_protection)
  2187. II_CRC_calc (&fr_ps, bit_alloc, scfsi, &crc);
  2188.     
  2189.     lfe_alloc = 4;
  2190.     II_CRC_calc_mc (&fr_ps, bit_alloc, lfe_alloc, scfsi, &crcmc);
  2191.     lfe_alloc = 0;
  2192. #ifdef Augmentation_7ch
  2193.     if (stereoaug == 2)
  2194. II_CRC_calc_aug (&fr_ps, bit_alloc, scfsi, &crcaug);
  2195. #endif
  2196.     encode_info (&fr_ps, &bs);
  2197.    
  2198.     if (error_protection)
  2199. encode_CRC (crc, &bs);
  2200.    
  2201.     II_encode_bit_alloc (bit_alloc, &fr_ps, &bs);
  2202.     k = 0;
  2203.     i = stereo;  
  2204.    
  2205.     II_encode_scale (bit_alloc, scfsi, scalar, lfe_alloc, lfe_scalar, &fr_ps, &bs, &k, &i);
  2206.     
  2207.     II_subband_quantization (scalar, sb_sample, j_scale,
  2208.      *j_sample, bit_alloc, *subband, &fr_ps);
  2209.      
  2210.      
  2211.     II_sample_encoding (*subband, bit_alloc, &fr_ps, &bs);
  2212.     /***** Now bitstream for the surround channels **************/
  2213.     encode_info_mc1 (&fr_ps, &bs);
  2214.     
  2215.     encode_CRC (crcmc, &bs);
  2216.     
  2217.     encode_info_mc2 (&fr_ps, &bs);    /*new draft 5.7.93 SR*/
  2218.     
  2219.     if (lfe)
  2220.     {
  2221.         lfe_alloc = 4;
  2222.         II_encode_lfe_alloc (lfe_alloc, &fr_ps, &bs);
  2223.     }
  2224.     
  2225.     II_encode_bit_alloc_mc (bit_alloc, &fr_ps, &bs);
  2226.     k = stereo;
  2227.     i = stereo + stereomc;
  2228.     
  2229.     II_encode_scale (bit_alloc, scfsi, scalar, lfe_alloc, lfe_scalar, &fr_ps, &bs, &k, &i);
  2230.    
  2231.     II_subband_quantization_mc (scalar, sb_sample, j_scale,
  2232.        *j_sample, bit_alloc, *subband, &fr_ps);
  2233.    
  2234.     if (lfe) 
  2235.         II_lfe_quantisation (lfe_scalar, *lfe_sample, lfe_alloc,
  2236.      *lfe_sbband, &fr_ps);
  2237.        
  2238.     II_sample_encoding_mc (*subband, *lfe_sbband, bit_alloc, lfe_alloc, &fr_ps, &bs);
  2239.     if (info.multiling_ch > 0)
  2240.     {
  2241. k = 7;
  2242. i = info.multiling_ch + 7;  
  2243. II_encode_bit_alloc_ml (bit_alloc, &fr_ps, &bs);
  2244. II_encode_scale_ml (bit_alloc, scfsi, scalar, &fr_ps, &bs, &k, &i);
  2245. II_subband_quantization_ml (scalar, sb_sample, j_scale,
  2246.     *j_sample, bit_alloc, *subband, &fr_ps);
  2247. II_sample_encoding_ml (*subband, bit_alloc, &fr_ps, &bs);
  2248.     }
  2249. #ifdef Augmentation_7ch
  2250.     if (stereoaug == 2)
  2251.     {
  2252. /* bitstream for the augmentation channels */
  2253. encode_info_aug (&fr_ps, &bs);
  2254. encode_CRC (crcaug, &bs);
  2255. II_encode_bit_alloc_aug (bit_alloc, &fr_ps, &bs);
  2256. k = stereo + stereomc;
  2257. i = stereo + stereomc + stereoaug;
  2258. II_encode_scale (bit_alloc, scfsi, scalar, lfe_alloc, lfe_scalar, &fr_ps, &bs, &k, &i);
  2259.        
  2260. II_subband_quantization_aug (scalar, sb_sample, j_scale,
  2261.      *j_sample, bit_alloc, *subband, &fr_ps);
  2262.        
  2263. II_sample_encoding_aug (*subband, bit_alloc, &fr_ps, &bs);
  2264.     }
  2265. #endif
  2266.     frameBits = sstell (&bs) - sentBits;
  2267.     frameBits += info.n_ad_bytes * 8;
  2268.     if (info.ext_bit_stream_present)
  2269. frameBits += 40;
  2270.     if (frameBits < (whole_SpF + extra_slot) * bitsPerSlot)
  2271.     {
  2272. adb = (whole_SpF + extra_slot) * bitsPerSlot - frameBits;
  2273. if (verbosity >= 2)
  2274.     printf ("Adb4: %ldn", adb);
  2275. adb += info.n_ad_bytes * 8;
  2276. if (info.ext_bit_stream_present)
  2277.     adb += 40;
  2278.     }
  2279.     else if (verbosity >= 2)
  2280. printf ("Adb4: %ld but %ld bits overflown",
  2281. adb, frameBits - (whole_SpF + extra_slot) * bitsPerSlot);
  2282.    
  2283.     /* YBKim060695 ancillary */
  2284.     if (ancillaryUse)
  2285. ancillary_encode (&fr_ps, &bs, adb);
  2286.     else
  2287. for (i = 0; i < adb; i++)
  2288.     put1bit (&bs, 0);
  2289. }
  2290. break;
  2291. /***************************** Layer 3, not done yet!!*******************/
  2292. /* case 3: break; */
  2293. }
  2294.  
  2295. frameBits = sstell (&bs) - sentBits;
  2296. if (frameBits % bitsPerSlot)   /* a program failure */
  2297.     fprintf (stderr, "Sent %ld bits = %ld slots plus %ld adb: %ldn",
  2298.      frameBits, frameBits / bitsPerSlot,
  2299.      frameBits % bitsPerSlot, adb);
  2300. sentBits += frameBits;
  2301. #ifdef DEBUG
  2302. if (verbosity >= 3)
  2303. {
  2304.    if ( (info.lay==2) && 
  2305. ((int) aiff_ptr.sampleRate == 48000) && 
  2306. (info.ext_bit_stream_present == 0) && 
  2307. (frameBits != 24*bitrate[info.lay-1][info.bitrate_index]) 
  2308.       ) /* for debugging purposes WtK */
  2309.       fprintf (stderr, "n***Error. %d bits have been written instead of %d bits.n",
  2310.      frameBits, 24*bitrate[info.lay-1][info.bitrate_index]);
  2311. }
  2312. #endif
  2313. #ifdef PRINTOUT
  2314. if (verbosity >= 3)
  2315. {
  2316. #ifdef Augmentation_7ch
  2317.     if (stereoaug == 2)
  2318. printf ("nFrame %4lu   channel 1  channel 2  channel 3  channel 4  channel 5  channel 6  channel 7n", frameNum-1);
  2319.     else
  2320. #endif
  2321. printf ("nFrame %4lu   channel 1  channel 2  channel 3  channel 4  channel 5n", frameNum-1);
  2322.     
  2323.     for (loop_subband = 0; loop_subband < SBLIMIT; loop_subband++)
  2324.     {
  2325. l = sbgrp[i];
  2326. printf ("subband %2d :", loop_subband);
  2327. for (loop_channel = 0; loop_channel < stereo + stereomc + stereoaug; loop_channel++)
  2328. {
  2329.     /* make loop_alloc point to the alloc-table in fr_ps */
  2330.     k = transmission_channel (&fr_ps, l, loop_channel);
  2331.     if (loop_channel < stereo)
  2332.      loop_alloc = fr_ps.alloc;
  2333.     else
  2334.      loop_alloc = fr_ps.alloc_mc;
  2335.     loop_bits = (* loop_alloc)[loop_subband][bit_alloc[k][loop_subband]].bits;
  2336.     if ((k == 1) && 
  2337. (info.mode == MPG_MD_JOINT_STEREO) &&
  2338. (loop_subband >= fr_ps.jsbound))
  2339. printf ("      js   ");
  2340.     else
  2341.     {
  2342. if ((* loop_alloc)[loop_subband][bit_alloc[k][loop_subband]].steps == 0)
  2343.     printf("    - bits ");
  2344. else
  2345. {
  2346.     if ((* loop_alloc)[loop_subband][bit_alloc[k][loop_subband]].group == 1)
  2347.     loop_bits /= 3;
  2348.     printf ("%5.1f bits ", loop_bits);
  2349. }
  2350.     }
  2351. } /* for (loop_channel..) */
  2352. printf("n");
  2353.     } /* for (loop_subband..) */
  2354.     
  2355.     /* Now the ML part , WtK */
  2356.     if (info.multiling_ch > 0)
  2357.     {
  2358. printf ("nFrame %4lu ", frameNum - 1);
  2359. for (loop_channel=7;loop_channel<7+info.multiling_ch; loop_channel++)
  2360.     printf("  MLchann %d", loop_channel);
  2361. printf ("n");
  2362. for (loop_subband = 0; loop_subband < SBLIMIT; loop_subband++)
  2363. {
  2364.     printf ("subband %2d :", loop_subband);
  2365.     for (loop_channel = 0; loop_channel < info.multiling_ch; loop_channel++)
  2366.     {
  2367. /* make loop_alloc point to the alloc-table in fr_ps */
  2368. loop_alloc = fr_ps.alloc_ml;
  2369. loop_bits = (* loop_alloc)[loop_subband][bit_alloc[loop_channel][loop_subband]].bits;
  2370. if ((* loop_alloc)[loop_subband][bit_alloc[loop_channel][loop_subband]].steps == 0)
  2371.     printf("    - bits ");
  2372. else
  2373. {
  2374.     if ((* loop_alloc)[loop_subband][bit_alloc[loop_channel][loop_subband]].group == 1)
  2375. loop_bits /= 3;
  2376.     printf ("%5.1f bits ", loop_bits);
  2377. }
  2378.     } /* for (loop_channel..) */
  2379.     printf("n");
  2380. } /* for (loop_subband..) */
  2381.     } /*n_ml_ch>0*/
  2382.     fflush (stdout);
  2383. } /* verbosity */
  2384. #endif
  2385. if (info.multiling_fs == 1)
  2386.     odd_ml = 1 - odd_ml; /* ML half fs */
  2387. /****************************************************************/
  2388. /*                                                              */
  2389. /*                   END OF FRAME LOOP                          */
  2390. /*                                                              */
  2391. /****************************************************************/
  2392.     } /* end of while (get_audio) - loop */
  2393.     close_bit_stream_w (&bs);
  2394.     
  2395.     if (info.ext_bit_stream_present == 1)
  2396.     {
  2397. open_bit_stream_r (&bs, encoded_file_name, BUFFER_SIZE);
  2398. if (encoded_file_name_ext[0] == NULL_CHAR)
  2399.     strcat (strcpy (encoded_file_name_ext, encoded_file_name), DFLT_EXT_EXT);
  2400. if (verbosity >= 2) printf(">>> file name of extension bitstream is: %sn", encoded_file_name_ext);
  2401. open_bit_stream_w (&bs_ext, encoded_file_name_ext, BUFFER_SIZE);
  2402. if (encoded_file_name_mpg[0] == NULL_CHAR)
  2403.     strcat (strcpy (encoded_file_name_mpg, encoded_file_name), DFLT_EXT);
  2404. open_bit_stream_w (&bs_mpg, encoded_file_name_mpg, BUFFER_SIZE);
  2405. for (m = 0; m < frameNum; m++)
  2406. {
  2407.     i = (((double) samplesPerFrame / s_freq[info.sampling_frequency]) *
  2408.   (double) bitrate[info.lay-1][info.bitrate_index]) - (info.n_ad_bytes * 8);
  2409.     for (j = 0; j < i; j++)
  2410.     {
  2411. crc_buffer[0] = get1bit (&bs);
  2412. put1bit (&bs_mpg, crc_buffer[0]);
  2413.     }
  2414.     for (j = 0; j < info.n_ad_bytes * 8; j++)
  2415. put1bit (&bs_mpg, 0);
  2416.   
  2417.     encode_info_ext1 (&fr_ps, &bs_ext);
  2418.     for (i = 0; i < 14; i++)
  2419. crc_buffer[i] = getbits (&bs, 8);
  2420.     crc_buffer[14] = getbits (&bs, 4);
  2421.     II_CRC_calc_ext (&fr_ps, crc_buffer, &crcext);
  2422.     encode_info_ext2 (&fr_ps, &bs_ext, crcext);
  2423.     for (i = 0; i < 14; i++)
  2424. putbits (&bs_ext, crc_buffer[i], 8);
  2425.     putbits (&bs_ext, crc_buffer[14], 4);
  2426.     i = (info.ext_length * 8) - 40 - 116;
  2427.     for (j = 0; j < i; j++)
  2428.     {
  2429. crc_buffer[0] = get1bit (&bs);
  2430. put1bit (&bs_ext, crc_buffer[0]);
  2431.     }
  2432.     for (j = 0; j < 5 + info.n_ad_bytes; j++)
  2433. crc_buffer[i] = getbits (&bs, 8);
  2434. }
  2435. close_bit_stream_r (&bs);
  2436. close_bit_stream_w (&bs_ext);
  2437. close_bit_stream_w (&bs_mpg);
  2438. strcpy (blubb, "rm ");
  2439. strcat (blubb, encoded_file_name);
  2440. #ifdef DEBUG
  2441.         if (verbosity >= 3)
  2442.     printf ("%sn", blubb);
  2443. #endif 
  2444. system (blubb);
  2445. strcpy (blubb, "mv ");
  2446. strcat (blubb, encoded_file_name_mpg);
  2447. strcat (blubb, " ");
  2448. strcat (blubb, encoded_file_name);
  2449. #ifdef DEBUG
  2450.         if (verbosity >= 3)
  2451.     printf ("%sn", blubb);
  2452. #endif 
  2453. system (blubb);
  2454.     }    
  2455.     
  2456.     if (verbosity >= 2)
  2457. printf ("Avg slots/frame = %.3f; b/smp = %.2f; br = %.3f kbpsn",
  2458. (FLOAT) sentBits / (frameNum * bitsPerSlot),
  2459. (FLOAT) sentBits / (frameNum * samplesPerFrame),
  2460. (FLOAT) sentBits / (frameNum * samplesPerFrame) *
  2461. s_freq[info.sampling_frequency]);
  2462.     
  2463.     if (fclose (musicin) != 0)
  2464.     {
  2465. printf ("Could not close "%s".n", original_file_name);
  2466. exit (2);
  2467.     }
  2468.     
  2469. #ifdef  MACINTOSH
  2470. set_mac_file_attr(encoded_file_name, VOL_REF_NUM, CREATOR_ENCODE,
  2471.   FILETYPE_ENCODE);
  2472. #endif
  2473.     if (verbosity >= 2)
  2474.     {
  2475. printf ("Encoding of "%s" with psychoacoustic model %d is finishedn",
  2476.         original_file_name, model);
  2477. if (aiff == 1)
  2478.     printf (" It is a multichannel file !n");
  2479. else
  2480.     printf (" It is a twochannel file!n");    
  2481. printf ("The MPEG encoded output file name is "%s"n",
  2482. encoded_file_name);
  2483.     }
  2484. }
  2485.  
  2486. /************************************************************************
  2487. /*
  2488. /* usage
  2489. /*
  2490. /* PURPOSE:  Writes command line syntax to the file specified by #stderr#
  2491. /*
  2492. /************************************************************************/
  2493. static void usage (void)  /* print syntax & exit */
  2494. {
  2495.     fprintf (stderr, "usage: %s                         queries for all arguments, orn", programName);
  2496.     fprintf (stderr, "       %s [-l lay][-m mode][-r sfrq][-b br][-B br][-d emp][-C config]n", programName);
  2497. #ifdef Augmentation_7ch
  2498.     fprintf (stderr, "          [-x matr][-k tca][-y dynX][-X aug_matr][-K aug_tca][-Y aug_dynX]n");
  2499. #else
  2500.     fprintf (stderr, "          [-x matr][-k tca][-y dynX]n");
  2501. #endif
  2502.     fprintf (stderr, "          [-c][-o][-e][-w][-g][-v verb][-L][-a][-P][-D] inputPCM [outBS]n");
  2503.     fprintf (stderr, "wheren");
  2504.     fprintf (stderr, " -l lay   use layer <lay> coding   (dflt %4u)n", DFLT_LAY);
  2505.     fprintf (stderr, " -m mode  channel mode : s/d/j/m   (dflt %4c)n", DFLT_MOD);
  2506.     fprintf (stderr, " -n mode  surround mode : s/d/j/m  (dflt %4c)n", DFLT_MOD);
  2507.     fprintf (stderr, " -r sfrq  input smpl rate in kHz   (dflt %4.1f)n", DFLT_SFQ);
  2508.     fprintf (stderr, " -b br    total bitrate in kbps    (dflt %4u)n", DFLT_BRT);
  2509.     fprintf (stderr, " -B br    MPEG1 bitrate in kbps    (dflt %4u)n", DFLT_BRT);
  2510.     fprintf (stderr, " -d emp   de-emphasis n/5/c        (dflt %4c)n", DFLT_EMP);
  2511.     fprintf (stderr, " -c       mark as copyrightn");
  2512.     fprintf (stderr, " -o       mark as originaln");
  2513.     fprintf (stderr, " -e       add error protectionn");
  2514.     fprintf (stderr, " -x matr  matrix                   (dflt 0)n");
  2515.     fprintf (stderr, " -k tca   set channel-switching    (dflt -2)n");
  2516.     fprintf (stderr, " -y dynX  set dyn_cross mode       (dflt 0)n");             
  2517. #ifdef Augmentation_7ch
  2518.     fprintf (stderr, " -X Amatr 7.1-ch aug. matrix       (dflt 0)n");
  2519.     fprintf (stderr, " -K Atca  set 7.1-ch aug. tca      (dflt 0)n");
  2520.     fprintf (stderr, " -Y AdynX 7.1-ch aug. DynX mode    (dflt 0)n");             
  2521. #endif
  2522.     fprintf (stderr, " -w       set phantom coding       (dflt off)n");
  2523.     fprintf (stderr, " -L       set LFE on               (dflt off)n");
  2524.     fprintf (stderr, " -C mode  set configuration        (dflt 320)n");
  2525.     fprintf (stderr, " -g       set MultiLingual file    (dflt off) input ML filename = inputPCM+"%s"n", DFLT_ML_EXT);
  2526.     fprintf (stderr, " -P       set mc prediction on     (dflt off)n");
  2527.     fprintf (stderr, " -D       set dyn_cross_LR on      (dflt off)n");
  2528.     fprintf (stderr, " -n nr    number of anc data Bytes (dflt %d)n", DFLT_NADB);
  2529.     fprintf (stderr, " -a       set ancillary data on    (dflt off)n");
  2530.     fprintf (stderr, " -v verb  level of verbosity 0-3   (dflt %d)n", DFLT_VERB);
  2531.     fprintf (stderr, " inputPCM input PCM sound file (standard or AIFF)n");
  2532.     fprintf (stderr, " outBS    output bit stream of encoded audio (dflt inName+%s)n", DFLT_EXT);
  2533.     exit (1);
  2534. }
  2535. /************************************************************************
  2536. /*
  2537. /* aiff_check
  2538. /*
  2539. /* PURPOSE:  Checks AIFF header information to make sure it is valid.
  2540. /*           Exits if not.
  2541. /*
  2542. /************************************************************************/
  2543. void aiff_check (char *file_name, IFF_AIFF *pcm_aiff_data)
  2544.                           /* Pointer to name of AIFF file */
  2545.                           /* Pointer to AIFF data structure */
  2546. {
  2547.     if (strcmp (pcm_aiff_data->sampleType, IFF_ID_SSND) != 0)
  2548.     {
  2549.        printf ("Sound data is not PCM in "%s".n", file_name);
  2550.        exit (1);
  2551.     }
  2552.     if (SmpFrqIndex ((long) pcm_aiff_data->sampleRate) < 0)
  2553.     {
  2554.        printf ("in "%s".n", file_name);
  2555.        exit (1);
  2556.     }
  2557.     if (pcm_aiff_data->sampleSize != sizeof(short) * BITS_IN_A_BYTE)
  2558.     {
  2559.         printf ("Sound data is not %d bits in "%s".n",
  2560.                sizeof(short) * BITS_IN_A_BYTE, file_name);
  2561.         exit(1);
  2562.     }
  2563.     if (pcm_aiff_data->numChannels < 1 || pcm_aiff_data->numChannels > 8)
  2564.     {
  2565.        printf ("Sound data is not 1 - 8 channel in "%s".n", file_name);
  2566.        exit (1);
  2567.     }
  2568.     if (pcm_aiff_data->blkAlgn.blockSize != 0)
  2569.     {
  2570.        printf ("Block size is not %lu bytes in "%s".n", 0, file_name);
  2571.        exit (1);
  2572.     }
  2573.     if (pcm_aiff_data->blkAlgn.offset != 0)
  2574.     {
  2575.        printf ("Block offset is not %lu bytes in "%s".n", 0, file_name);
  2576.        exit (1);
  2577.     }
  2578. }