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

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Multichannel Decoder
  4.  *
  5.  * $Id: common.c 1.12 1997/01/17 04:25:12 rowlands Exp $
  6.  *
  7.  * $Log: common.c $
  8.  * Revision 1.12  1997/01/17 04:25:12  rowlands
  9.  * Fixed base bitstream joint stereo bugs.
  10.  *
  11.  * Removed incorrect dependence on jsbound in the calculation of the
  12.  * mc crc.
  13.  *
  14.  * Revision 1.11  1996/06/18 22:47:29  rowlands
  15.  * Added extra debug output
  16.  *
  17.  * Revision 1.10  1996/04/18 05:37:23  rowlands
  18.  * Release following Florence meeting
  19.  *
  20.  * Revision 1.9  1996/02/12 07:13:06  rowlands
  21.  * Release following Munich meeting
  22.  *
  23.  * Revision 1.8.1.1  1996/01/20  17:28:45  rowlands
  24.  * Received from Ralf Schwalbe (Telekom FTZ) - includes prediction
  25.  *
  26.  * Revision 1.6.1.3  1995/08/14  08:10:19  tenkate
  27.  * ML-LSF added Warner ten Kate 7/8/95 (Philips)
  28.  * "alloc_4" table copied from LSF-directory.
  29.  * SmpFrqIndex() extended.
  30.  *
  31.  * Revision 1.6.1.1  1995/07/14  06:12:46  rowlands
  32.  * Updated dynamic crosstalk from FTZ: revision FTZ_03
  33.  *
  34.  * Revision 1.6  1995/06/22  01:23:00  rowlands
  35.  * Merged FTZ dynamic crosstalk
  36.  *
  37.  * Revision 1.3.3.1  1995/06/16  08:40:12  rowlands
  38.  * Input from Sang Wook Kim (Samsung AIT)
  39.  *
  40.  **********************************************************************/
  41. /**********************************************************************
  42.  *   date   programmers                comment                        *
  43.  * 2/25/91  Douglas Wong        start of version 1.0 records          *
  44.  * 3/06/91  Douglas Wong        rename setup.h to dedef.h             *
  45.  *                              removed extraneous variables          *
  46.  *                              removed window_samples (now part of   *
  47.  *                              filter_samples)                       *
  48.  * 3/07/91  Davis Pan           changed output file to "codmusic"     *
  49.  * 5/10/91  Vish (PRISM)        Ported to Macintosh and Unix.         *
  50.  *                              Incorporated new "out_fifo()" which   *
  51.  *                              writes out last incomplete buffer.    *
  52.  *                              Incorporated all AIFF routines which  *
  53.  *                              are also compatible with SUN.         *
  54.  *                              Incorporated user interface for       *
  55.  *                              specifying sound file names.          *
  56.  *                              Also incorporated user interface for  *
  57.  *                              writing AIFF compatible sound files.  *
  58.  * 27jun91  dpwe (Aware)        Added musicout and &sample_frames as  *
  59.  *                              args to out_fifo (were glob refs).    *
  60.  *                              Used new 'frame_params' struct.       *
  61.  *                              Clean,simplify, track clipped output  *
  62.  *                              and total bits/frame received.        *
  63.  * 7/10/91  Earle Jennings      changed to floats to FLOAT            *
  64.  *10/ 1/91  S.I. Sudharsanan,   Ported to IBM AIX platform.           *
  65.  *          Don H. Lee,                                               *
  66.  *          Peter W. Farrett                                          *
  67.  *10/ 3/91  Don H. Lee          implemented CRC-16 error protection   *
  68.  *                              newly introduced functions are        *
  69.  *                              buffer_CRC and recover_CRC_error      *
  70.  *                              Additions and revisions are marked    *
  71.  *                              with "dhl" for clarity                *
  72.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  73.  *                              important fixes involved changing     *
  74.  *                              16-bit ints to long or unsigned in    *
  75.  *                              bit alloc routines for quant of 65535 *
  76.  *                              and passing proper function args.     *
  77.  *                              Removed "Other Joint Stereo" option   *
  78.  *                              and made bitrate be total channel     *
  79.  *                              bitrate, irrespective of the mode.    *
  80.  *                              Fixed many small bugs & reorganized.  *
  81.  **********************************************************************
  82.  *                                                                    *
  83.  *                                                                    *
  84.  *  MPEG/audio Phase 2 coding/decoding multichannel                   *
  85.  *                                                                    *
  86.  *  Version 1.0                                                       *
  87.  *                                                                    *
  88.  *  7/27/93        Susanne Ritscher,  IRT Munich                      *
  89.  *                                                                    *
  90.  *                  thanks to                                         *
  91.  *                  Ralf Schwalbe,    Telekom FTZ Berlin              *
  92.  *                  Heiko Purnhagen,  Uni Hannover                    *
  93.  *                                                                    *
  94.  *  Version 2.0                                                       *
  95.  *                                                                    *
  96.  *  8/27/93        Susanne Ritscher, IRT Munich                       *
  97.  *                 Channel-Switching is working                       *
  98.  *                                                                    *
  99.  *  Version 2.1                                                       *
  100.  *                                                                    *
  101.  *  9/1/93         Susanne Ritscher,  IRT Munich                      *
  102.  *                 all channels normalized                            *
  103.  *                                                                    *
  104.  *  Version 3.0                                                       *
  105.  *                                                                    *
  106.  *  06/16/94       Ralf Schwalbe, Telekom FTZ Berlin                  *
  107.  *                 all sources and variables adapted due to MPEG-2 -  *
  108.  *                 DIS from March 1994                                *
  109.  *                  - dematrix and denormalize procedure              *
  110.  *                  - new tc - allocation (0-7)                       *
  111.  *                  - some new structures and variables as a basis    *
  112.  *                    for further decoding modes                      *
  113.  **********************************************************************
  114.  *       *
  115.  *  Version 1.0                                                       *
  116.  *                                                                    *
  117.  *  11/04/94       Ralf Schwalbe,  Telekom FTZ Berlin                 *
  118.  *                  - decoding tc-allocation                          *
  119.  *                  - some new subroutines, globale variables and     *
  120.  *                    structures (important to handle the ext. bitst.)*
  121.  *                  - changed all functions to ANSI-C funktion header *
  122.  *     - corrected some bugs to decode bitstreams > 512kB*
  123.  *       *
  124.  *  Version 1.1                                                       *
  125.  *                                                                    *
  126.  *  12/07/94       Ralf Schwalbe,  Telekom FTZ Berlin                 *
  127.  *                  - decoding extension bitstream                    *
  128.  *                                                                    *
  129.  *  Version 1.1.1                                                     *
  130.  *                 Ralf Schwalbe, Telekom FTZ Berlin                  *
  131.  *                  - fixed some bugs                                 *
  132.  *                                                                    *
  133.  *  Version 1.2                                                       *
  134.  *                                                                    *
  135.  *  6/21/95       Ralf Schwalbe, Deutsche Telekom FTZ Berlin          *
  136.  *                 - decoding dynamic crosstalk                      *
  137.  *                  - decoding phantom center                         * 
  138.  *                  - decoding MPEG1 compatible part only (stereo)    *
  139.  *                  - corrected some settings and bugs                *
  140.  *                                                                    *  
  141.  *  7/12/95   Ralf Schwalbe, Deutsche Telekom FTZ Berlin          *
  142.  *     - corrected dynamic crosstalk        *
  143.  *     - 3/2,3/1,3/0,2/1, channel configurations         *
  144.  *                    are working                                     *
  145.  *          *
  146.  * 10/31/95   Ralf Schwalbe, Deutsche Telekom FTZ Berlin       *
  147.  *     - decoding of LFE-channel is working         *
  148.  *     - corrected any settings and bugs       *
  149.  *     - corrected table-switch for channel mode < 3/2   *
  150.  *       and tc-allocation / dyn-crosstalk       *
  151.  *     - still a problem with compl. bitstream 18/19     *
  152.  *       *
  153.  * 01/12/96   Ralf Schwalbe, Deutsche Telekom TZ Darmstadt       *
  154.  *     - decoder prediction installed       *
  155.  *     - problem with compl. bitstream 19 solved,        *
  156.  *       *  
  157.  *  Version 2.0                                                       *
  158.  *                                                                    *
  159.  * 01/28/97       Frans de Bont, Philips Sound & Vision, Eindhoven    *
  160.  *     - simultaneous use of tc allocation and dynamic   *
  161.  *       crosstalk working for all configurations       *
  162.  *     - prediction working for all configurations       *
  163.  *     - layer 1 MC working       *
  164.  *     - variable bit rate and extension bitstreams      *
  165.  *     - fully compliant to 13818-3.2                    *
  166.  *                                                                    *       *     
  167.  **********************************************************************/
  168. /**********************************************************************
  169.  *                                                                    *
  170.  *  06/06/95       Sang Wook Kim,  Samsung AIT                        *
  171.  *                 Bug corrected in pick_table                        *
  172.  *       *
  173.  **********************************************************************/
  174. /***********************************************************************
  175. *
  176. *  Global Include Files
  177. *
  178. ***********************************************************************/
  179. #include        "common.h"
  180. #include        "decoder.h" /* 23/03/1995 JMZ Test_bit_stream */
  181. #ifdef  MACINTOSH
  182. #include        <SANE.h>
  183. #include        <pascal.h>
  184. #endif
  185. #include <string.h>
  186. #include <ctype.h>
  187. /***********************************************************************
  188. *
  189. *  Global Variable Definitions
  190. *
  191. ***********************************************************************/
  192. char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "single-ch" };
  193. char *layer_names[3] = { "I", "II", "III" };
  194. double  s_freq[4] = {44.1, 48, 32, 0};
  195. int   bitrate[3][15] = {
  196.  {1000,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
  197.  {1000,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
  198.  {1000,32,40,48,56,64,80,96,112,128,160,192,224,256,320}
  199.         };
  200. double multiple[64] = {
  201. 2.00000000000000, 1.58740105196820, 1.25992104989487,
  202. 1.00000000000000, 0.79370052598410, 0.62996052494744, 0.50000000000000,
  203. 0.39685026299205, 0.31498026247372, 0.25000000000000, 0.19842513149602,
  204. 0.15749013123686, 0.12500000000000, 0.09921256574801, 0.07874506561843,
  205. 0.06250000000000, 0.04960628287401, 0.03937253280921, 0.03125000000000,
  206. 0.02480314143700, 0.01968626640461, 0.01562500000000, 0.01240157071850,
  207. 0.00984313320230, 0.00781250000000, 0.00620078535925, 0.00492156660115,
  208. 0.00390625000000, 0.00310039267963, 0.00246078330058, 0.00195312500000,
  209. 0.00155019633981, 0.00123039165029, 0.00097656250000, 0.00077509816991,
  210. 0.00061519582514, 0.00048828125000, 0.00038754908495, 0.00030759791257,
  211. 0.00024414062500, 0.00019377454248, 0.00015379895629, 0.00012207031250,
  212. 0.00009688727124, 0.00007689947814, 0.00006103515625, 0.00004844363562,
  213. 0.00003844973907, 0.00003051757813, 0.00002422181781, 0.00001922486954,
  214. 0.00001525878906, 0.00001211090890, 0.00000961243477, 0.00000762939453,
  215. 0.00000605545445, 0.00000480621738, 0.00000381469727, 0.00000302772723,
  216. 0.00000240310869, 0.00000190734863, 0.00000151386361, 0.00000120155435,
  217. 1E-20
  218. };
  219. int sb_groups[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 15, 26};
  220. /*int transmission_channel[8][5] = {{0, 1, 2, 3, 4},
  221.     {0, 1, 5, 3, 4},
  222.     {0, 1, 6, 3, 4},
  223.     {0, 1, 2, 5, 4},
  224.     {0, 1, 2, 3, 6},
  225.     {0, 1, 2, 5, 6},
  226.     {0, 1, 6, 5, 4},
  227.     {0, 1, 5, 3, 6}};
  228. */
  229. /***********************************************************************
  230. *
  231. *  Global Function Definitions
  232. *
  233. ***********************************************************************/
  234. /* The system uses a variety of data files.  By opening them via this
  235.    function, we can accommodate various locations. */
  236. FILE *OpenTableFile(char *name)
  237. {
  238. char fulname[80];
  239. char *envdir;
  240. FILE *f;
  241.  fulname[0] = '';
  242. #ifdef TABLES_PATH
  243.    strcpy(fulname, TABLES_PATH);   /* default relative path for tables */
  244. #endif /* TABLES_PATH */          /* (includes terminal path seperator */
  245. #ifdef UNIX                       /* envir. variables for UNIX only */
  246.    {
  247. char *getenv(const char *);
  248.         envdir = getenv(MPEGTABENV);   /* check for environment */
  249.         if(envdir != NULL)
  250.             strcpy(fulname, envdir);
  251.         strcat(fulname, PATH_SEPARATOR);  /* add a "/" on the end */
  252.       }
  253. #endif /* UNIX */
  254. strcat(fulname, name);
  255.     if( (f=fopen(fulname,"r"))==NULL ) {
  256.         fprintf(stderr,"OpenTable: could not find %sn", fulname);
  257. #ifdef UNIX
  258.           if(envdir != NULL)
  259. fprintf(stderr,"Check %s directory '%s'n",MPEGTABENV, envdir);
  260.           else
  261.             fprintf(stderr,"Check local directory './%s' or setenv %sn",
  262.                     TABLES_PATH, MPEGTABENV);
  263. #else /* not unix : no environment variables */
  264. #ifdef TABLES_PATH
  265.             fprintf(stderr,"Check local directory './%s'n",TABLES_PATH);
  266. #endif /* TABLES_PATH */
  267. #endif /* UNIX */
  268.     }
  269.     return f;
  270. }
  271. /***********************************************************************
  272. /*
  273. /* Read one of the data files ("alloc_*") specifying the bit allocation/
  274. /* quatization parameters for each subband in layer II encoding
  275. /*
  276. /**********************************************************************/
  277. /* read in table, return # subbands */
  278. int read_bit_alloc(int table, al_table *alloc)  
  279. {
  280.         long a, b, c, d, i, j;
  281. FILE *fp;
  282.         char name[16], t[80];
  283.         int sblim;
  284.         strcpy(name, "alloc_0");
  285. switch (table) {
  286.                 case 0 : name[6] = '0';         break;
  287.                 case 1 : name[6] = '1';         break;
  288.                 case 2 : name[6] = '2';         break;
  289.                 case 3 : name[6] = '3';         break;
  290.                 case 4 : name[6] = '4';         break; /* for MultiLingual-LSF , WtK 7/8/95 */
  291.                 default : name[6] = '0';
  292. }
  293.         if (!(fp = OpenTableFile(name))) {
  294.                 fprintf (stderr, "Please check bit allocation table %sn", name);
  295.                 exit (1);
  296.         }
  297. #ifdef PrintBitDebug
  298. printf("using bit allocation table %sn", name);
  299. #endif
  300.         fgets(t, 80, fp);
  301.         sscanf(t, "%dn", &sblim);
  302.         while (!feof(fp)) {
  303. fgets(t, 80, fp);
  304.                 sscanf(t, "%ld %ld %ld %ld %ld %ldn", &i, &j, &a, &b, &c, &d);
  305. (*alloc)[i][j].steps = a;
  306.                         (*alloc)[i][j].bits  = b;
  307.                         (*alloc)[i][j].group = c;
  308.                         (*alloc)[i][j].quant = d;
  309.         }
  310.         fclose(fp);
  311. return sblim;
  312. }
  313. /***********************************************************************
  314. /*
  315. /* Using the decoded info the appropriate possible quantization per
  316. /* subband table is loaded
  317. /*
  318. /**********************************************************************/
  319. /* choose table, load if necess, return # sb's */
  320. int pick_table (frame_params *fr_ps)   
  321. {
  322.    int table, tableml, lay, ws, bsp, br_per_ch, sfrq;
  323.    int sblim = fr_ps->sblimit;     /* return current value if no load */
  324.    lay = fr_ps->header->lay - 1;
  325.    bsp = fr_ps->header->bitrate_index;
  326.    /* BUG corrected SWKim060695 */
  327.    br_per_ch = bitrate[lay][bsp] / (fr_ps->stereo /* + fr_ps->mc_channel*/);
  328.    ws = fr_ps->header->sampling_frequency;
  329.    sfrq = s_freq[ws];
  330.    /* decision rules refer to per-channel bitrates (kbits/sec/chan) */
  331.    if ((sfrq == 48 && br_per_ch >= 56) ||
  332.        (br_per_ch >= 56 && br_per_ch <= 80)) table = 0;
  333.    else if (sfrq != 48 && br_per_ch >= 96) table = 1;
  334.    else if (sfrq != 32 && br_per_ch <= 48) table = 2;
  335.    else table = 3;
  336.    if (fr_ps->tab_num != table)
  337.    {
  338.       if (fr_ps->tab_num >= 0)
  339.         mem_free ((void **) &(fr_ps->alloc));
  340.       fr_ps->alloc = (al_table *) mem_alloc (sizeof(al_table), "alloc");
  341.       sblim = read_bit_alloc (fr_ps->tab_num = table, fr_ps->alloc);
  342.    }
  343.    return sblim;
  344. }
  345. /* choose MC and ML tables, load if necess, return # sb's */
  346. void mc_pick_table (frame_params *fr_ps)   
  347. {
  348.    int tablemc, tableml, ws, sfrq;
  349.    /* BUG corrected SWKim060695 */
  350.    ws = fr_ps->header->sampling_frequency;
  351.    sfrq = s_freq[ws];
  352.    /* decision rules refer to sampling frequency */
  353.    if (sfrq == 48)
  354.       tablemc = 0;
  355.    else
  356.       tablemc = 1;
  357.    if (fr_ps->tab_num_mc != tablemc)
  358.    {
  359.       if (fr_ps->tab_num >= 0)
  360.  mem_free ((void **)& (fr_ps->alloc_mc));
  361.       fr_ps->alloc_mc = (al_table *) mem_alloc (sizeof(al_table), "alloc_mc");
  362.       fr_ps->sblimit_mc = read_bit_alloc (fr_ps->tab_num_mc = tablemc, fr_ps->alloc_mc);
  363.    }
  364.    if (fr_ps->header->no_of_multi_lingual_ch > 0)
  365.    {
  366.       /* LSF MultiLingual 7/8/95 WtK */
  367.       if (fr_ps->header->multi_lingual_fs == 0)
  368.       {
  369.  fr_ps->tab_num_ml = fr_ps->tab_num_mc;
  370.  fr_ps->alloc_ml   = fr_ps->alloc_mc;
  371.  fr_ps->sblimit_ml = fr_ps->sblimit_mc;
  372.       }
  373.       else
  374.       {
  375.  tableml = 4;
  376.  if (fr_ps->tab_num_ml != tableml)
  377.  {
  378.     if (fr_ps->tab_num_ml >= 0)
  379.        mem_free ((void **)&(fr_ps->alloc_ml));
  380.     fr_ps->alloc_ml = (al_table *) mem_alloc (sizeof(al_table), "alloc_ml");
  381.     fr_ps->sblimit_ml = read_bit_alloc (fr_ps->tab_num_ml = tableml, fr_ps->alloc_ml);
  382.  }
  383.       } /* ml_fs==0 */
  384.    } /* ml_ch>0 */
  385. }
  386. int js_bound(int lay, int m_ext)
  387. {
  388. static int jsb_table[3][4] =  { { 4, 8, 12, 16 }, { 4, 8, 12, 16},
  389. { 0, 4, 8, 16} };  /* lay+m_e -> jsbound */
  390.     if(lay<1 || lay >3 || m_ext<0 || m_ext>3) {
  391.         fprintf (stderr, "js_bound bad layer/modext (%d/%d)n", lay, m_ext);
  392.         exit (1);
  393.     }
  394.     return(jsb_table[lay-1][m_ext]);
  395. }
  396. /* interpret data in hdr str to fields in fr_ps */
  397. void hdr_to_frps (frame_params *fr_ps)
  398. {
  399. layer *hdr = fr_ps->header;     /* (or pass in as arg?) */
  400. fr_ps->actual_mode = hdr->mode;
  401. if (hdr->mode != MPG_MD_NONE)
  402. fr_ps->stereo = (hdr->mode == MPG_MD_MONO) ? 1 : 2;
  403. else
  404. fr_ps->stereo = 0;
  405. Bitrate = bitrate[hdr->lay-1][hdr->bitrate_index];
  406. S_freq = s_freq[hdr->sampling_frequency];
  407. if (hdr->lay == 2)
  408. fr_ps->sblimit = pick_table (fr_ps);
  409. else
  410. fr_ps->sblimit = SBLIMIT;
  411. if (hdr->mode == MPG_MD_JOINT_STEREO)
  412. fr_ps->jsbound = js_bound (hdr->lay, hdr->mode_ext);
  413. else
  414. fr_ps->jsbound = fr_ps->sblimit;
  415. }
  416. /* interpret data in hdr str to fields in fr_ps */
  417. void mc_hdr_to_frps (frame_params *fr_ps)
  418. {
  419. layer *hdr = fr_ps->header;     /* (or pass in as arg?) */
  420. if (fr_ps->header->surround == 3) /* second stereo program */
  421. if (fr_ps->header->center == 1 || fr_ps->header->center == 3)
  422. {
  423. fr_ps->mc_channel = 3;     /* 3 + 2 */
  424. fr_ps->alloc_bits = 2;     /* 2 bits for tc_alloc */
  425. fr_ps->dyn_cross_bits = 1;
  426. fr_ps->pred_mode = 2; /* FdB for prediction  3/0 */
  427. }
  428. else
  429. {
  430. fr_ps->mc_channel = 2;     /* 2 + 2 or 1 + 2 */
  431. fr_ps->alloc_bits = 0;     /* 0 bits for tc_alloc */
  432. fr_ps->dyn_cross_bits = 0;
  433. fr_ps->pred_mode = 5; /* FdB for prediction  2/0 */
  434. }
  435. else if (fr_ps->header->surround == 2) /* stereo surround */
  436. if (fr_ps->header->center == 1 || fr_ps->header->center == 3)
  437. {
  438. fr_ps->mc_channel = 3;  /* 3 mc-channels 3/2 */
  439. fr_ps->alloc_bits = 3;  /* 3 bits for tc_alloc */
  440. fr_ps->dyn_cross_bits = 4; 
  441. fr_ps->pred_mode = 0; /* 7/4/95 R.S. for prediction  3/2 */
  442. }
  443. else
  444. {
  445. fr_ps->mc_channel = 2;  /* 2 mc-channels 2/2 */
  446. fr_ps->alloc_bits = 2;  /* 2 bits for tc_alloc */
  447. fr_ps->dyn_cross_bits = 3;
  448. fr_ps->pred_mode = 3; /* 7/4/95 R.S. for prediction  2/2 */
  449. }
  450. else if (fr_ps->header->surround == 1) /* mono surround */
  451. if (fr_ps->header->center == 1 || fr_ps->header->center == 3)
  452. {
  453. fr_ps->mc_channel = 2;  /* 3/1 */
  454. fr_ps->alloc_bits = 3;  /* 3 bits for tc_alloc */
  455. fr_ps->dyn_cross_bits = 3;
  456. fr_ps->pred_mode = 1; /* 7/4/95 R.S. for prediction 3/1 */
  457. }
  458. else
  459. {
  460. fr_ps->mc_channel = 1; /* 2/1 */
  461. fr_ps->alloc_bits = 2;  /* 2 bits for tc_alloc */
  462. fr_ps->dyn_cross_bits = 1;
  463. fr_ps->pred_mode = 4; /* 7/4/95 R.S. for prediction 2/1 */
  464. }
  465. else /* no surround */
  466. if (fr_ps->header->center == 1 || fr_ps->header->center == 3)
  467. {
  468. fr_ps->mc_channel = 1; /* 3/0 */
  469. fr_ps->alloc_bits = 2; /* 2 bits for tc_alloc */ 
  470. fr_ps->dyn_cross_bits = 1;
  471. fr_ps->pred_mode = 2;         /* 3/0 */
  472. }
  473. else
  474. {
  475. fr_ps->mc_channel = 0; /* 2/0 or 1/0 */
  476. fr_ps->alloc_bits = 0;  /* 2 bits for tc_alloc */
  477. fr_ps->dyn_cross_bits = 0;
  478. fr_ps->pred_mode = 5; /* FdB for prediction  2/0 */
  479. }
  480. if ( (hdr->no_of_multi_lingual_ch>0) && (hdr->multi_lingual_layer>0) )
  481. {
  482. fprintf (stderr, "MultiLingual not in Layer 2!n exit.n");
  483. exit (1);
  484. }
  485. if (fr_ps->mc_channel > 0 || hdr->lfe || hdr->no_of_multi_lingual_ch > 0)
  486. mc_pick_table (fr_ps);
  487. }
  488. void WriteHdr(frame_params *fr_ps, FILE *s)
  489. {
  490. layer *info = fr_ps->header;
  491.    fprintf(s, "HDR:  s=FFF, id=%X, l=%X, ep=%X, br=%X, sf=%X, pd=%X, ",
  492.    info->version, info->lay, !info->error_protection,
  493.    info->bitrate_index, info->sampling_frequency, info->padding);
  494.    fprintf(s, "pr=%X, m=%X, js=%X, c=%X, o=%X, e=%Xn",
  495.    info->extension, info->mode, info->mode_ext,
  496.    info->copyright, info->original, info->emphasis);
  497.    fprintf(s, "layer=%s, MPEG1-bitrate=%d, sfrq=%.1f, mode=%s, ",
  498.    layer_names[info->lay-1],Bitrate=bitrate[info->lay-1][info->bitrate_index],
  499.    S_freq=s_freq[info->sampling_frequency], mode_names[info->mode]);
  500.    fprintf(s, "sblim=%d, jsbd=%d, MPEG1-ch=%dn",
  501.    fr_ps->sblimit, fr_ps->jsbound, fr_ps->stereo);
  502.    fflush(s);
  503. }
  504. /*******************************************************************************
  505. *
  506. *  Allocate number of bytes of memory equal to "block".
  507. *
  508. *******************************************************************************/
  509. void    *mem_alloc(unsigned long block, char *item)
  510. {
  511. void   *ptr;
  512. #ifdef  MACINTOSH
  513.     ptr = NewPtr(block);
  514. #endif
  515. #ifdef  MSDOS
  516.  ptr = (void *)_fmalloc((unsigned int)block); /* far memory, 92-07-08 sr */
  517. #endif
  518. #if ! defined (MACINTOSH) && ! defined (MSDOS)
  519.     ptr = (void *) malloc(block);
  520. #endif
  521.  if (ptr != NULL){
  522. #ifdef  MSDOS
  523. _fmemset(ptr, 0, (unsigned int)block); /* far memory, 92-07-08 sr */
  524. #else
  525. memset(ptr, 0, block);
  526. #endif
  527.     }
  528.     else{
  529.         fprintf (stderr, "Unable to allocate %sn", item);
  530.         exit (1);
  531.     }
  532.     return(ptr);
  533. }
  534. /****************************************************************************
  535. *
  536. *  Free memory pointed to by "*ptr_addr".
  537. *
  538. *****************************************************************************/
  539. void    mem_free(void **ptr_addr)
  540. {
  541.     if (*ptr_addr != NULL){
  542. #ifdef  MACINTOSH
  543.         DisposPtr(*ptr_addr);
  544. #else
  545.         free(*ptr_addr);
  546. #endif
  547.         *ptr_addr = NULL;
  548.     }
  549. }
  550. /****************************************************************************
  551. *
  552. *  Routines to convert between the Apple SANE extended floating point format
  553. *  and the IEEE double precision floating point format.  These routines are
  554. *  called from within the Audio Interchange File Format (AIFF) routines.
  555. *
  556. *****************************************************************************/
  557. /*
  558. *** Apple's 80-bit SANE extended has the following format:
  559.  1       15      1            63
  560. +-+-------------+-+-----------------------------+
  561. |s|       e     |i|            f                |
  562. +-+-------------+-+-----------------------------+
  563.   msb        lsb   msb                       lsb
  564. The value v of the number is determined by these fields as follows:
  565. If 0 <= e < 32767,              then v = (-1)^s * 2^(e-16383) * (i.f).
  566. If e == 32767 and f == 0,       then v = (-1)^s * (infinity), regardless of i.
  567. If e == 32767 and f != 0,       then v is a NaN, regardless of i.
  568. *** IEEE Draft Standard 754 Double Precision has the following format:
  569. MSB
  570. +-+---------+-----------------------------+
  571. |1| 11 Bits |           52 Bits           |
  572. +-+---------+-----------------------------+
  573.  ^     ^                ^
  574.  |     |                |
  575.  Sign  Exponent         Mantissa
  576. */
  577. /*****************************************************************************
  578. *
  579. *  double_to_extended()
  580. *
  581. *  Purpose:     Convert from IEEE double precision format to SANE extended
  582. *               format.
  583. *
  584. *  Passed:      Pointer to the double precision number and a pointer to what
  585. *               will hold the Apple SANE extended format value.
  586. *
  587. *  Outputs:     The SANE extended format pointer will be filled with the
  588. *               converted value.
  589. *
  590. *  Returned:    Nothing.
  591. *
  592. *****************************************************************************/
  593. void    double_to_extended(double *pd, char ps[10])
  594. {
  595. #ifdef  MACINTOSH
  596.         x96tox80(pd, (extended *) ps);
  597. #else
  598. /* fixed bus alignment error, HP 27-may-93 */
  599. register unsigned long  top2bits;
  600. register unsigned short *ps2;
  601. register IEEE_DBL       *p_dbl;
  602. register SANE_EXT       *p_ext;
  603. SANE_EXT ext_align;
  604. char *c_align;
  605. int i;
  606.    p_dbl = (IEEE_DBL *) pd;
  607.    p_ext = &ext_align;
  608.    top2bits = p_dbl->hi & 0xc0000000L;
  609.    p_ext->l1 = ((p_dbl->hi >> 4) & 0x3ff0000L) | top2bits;
  610.    p_ext->l1 |= ((p_dbl->hi >> 5) & 0x7fffL) | 0x8000L;
  611.    p_ext->l2 = (p_dbl->hi << 27) & 0xf8000000L;
  612.    p_ext->l2 |= ((p_dbl->lo >> 5) & 0x07ffffffL);
  613.    ps2 = (unsigned short *) & (p_dbl->lo);
  614.    ps2++;
  615.    p_ext->s1 = (*ps2 << 11) & 0xf800;
  616.    c_align = (char *) p_ext;
  617.    for (i=0;i<10;i++)
  618.  ps[i] = c_align[i];
  619. #endif
  620. }
  621. /*****************************************************************************
  622. *
  623. *  extended_to_double()
  624. *
  625. *  Purpose:     Convert from SANE extended format to IEEE double precision
  626. *               format.
  627. *
  628. *  Passed:      Pointer to the Apple SANE extended format value and a pointer
  629. *               to what will hold the the IEEE double precision number.
  630. *
  631. *  Outputs:     The IEEE double precision format pointer will be filled with
  632. *               the converted value.
  633. *
  634. *  Returned:    Nothing.
  635. *
  636. *****************************************************************************/
  637. void    extended_to_double(char ps[10], double *pd)
  638. {
  639. #ifdef  MACINTOSH
  640.    x80tox96((extended *) ps, pd);
  641. #else
  642. /* fixed bus alignment error, HP 27-may-93 */
  643. register unsigned long  top2bits;
  644. register IEEE_DBL       *p_dbl;
  645. register SANE_EXT       *p_ext;
  646. SANE_EXT ext_align;
  647. char *c_align;
  648. int i;
  649.    p_dbl = (IEEE_DBL *) pd;
  650.    p_ext = &ext_align;
  651.    c_align = (char *) p_ext;
  652.    for (i=0;i<10;i++)
  653.  c_align[i] = ps[i];
  654.    top2bits = p_ext->l1 & 0xc0000000L;
  655.    p_dbl->hi = ((p_ext->l1 << 4) & 0x3ff00000L) | top2bits;
  656.    p_dbl->hi |= (p_ext->l1 << 5) & 0xffff0L;
  657.    p_dbl->hi |= (p_ext->l2 >> 27) & 0x1f;
  658.    p_dbl->lo = (p_ext->l2 << 5) & 0xffffffe0L;
  659.    p_dbl->lo |= (unsigned long) ((p_ext->s1 >> 11) & 0x1f);
  660. #endif
  661. }
  662. /*****************************************************************************
  663. *
  664. *  Read Audio Interchange File Format (AIFF) headers.
  665. *
  666. *****************************************************************************/
  667. int aiff_read_headers(FILE *file_ptr,
  668.       IFF_AIFF *aiff_ptr, 
  669.       int *byte_per_sample)
  670. {
  671. register char   i;
  672. register long   seek_offset;
  673. char temp_sampleRate[10];
  674. char *dummy;
  675. char holder;
  676. Chunk           FormChunk;
  677. CommonChunk     CommChunk;
  678. SoundDataChunk  SndDChunk;
  679. identifier ident;
  680.    if (fseek(file_ptr, 0, SEEK_SET) != 0)
  681.   return(-1);
  682.    if (fread(&FormChunk, sizeof(Chunk), 1, file_ptr) != 1)
  683.   return(-1);
  684. #ifdef MSDOS
  685.   holder = FormChunk.ckID[0];
  686.   FormChunk.ckID[0] = FormChunk.ckID[3];
  687.   FormChunk.ckID[3] = holder;
  688.   holder = FormChunk.ckID[1];
  689.   FormChunk.ckID[1] = FormChunk.ckID[2];
  690.   FormChunk.ckID[2] = holder;
  691. /* fixed bug in next line, HP 27-may-93 */
  692.   holder = FormChunk.formType[0];
  693.   FormChunk.formType[0] = FormChunk.formType[3];
  694.   FormChunk.formType[3] = holder;
  695.   holder = FormChunk.formType[1];
  696.   FormChunk.formType[1] = FormChunk.formType[2];
  697.   FormChunk.formType[2] = holder;
  698.   FormChunk.ckSize = _lrotl(FormChunk.ckSize, 8);
  699. #endif
  700. /* fixed bug in next line, HP 27-may-93 */
  701. if (strncmp(FormChunk.ckID,IFF_ID_FORM,4) != 0 ||
  702.  strncmp(FormChunk.formType,IFF_ID_AIFF,4) != 0)
  703.       return(-1);  /* warning: different levels of indirection.7/8/92.sr*/
  704. if (fread(&ident,sizeof(identifier), 1, file_ptr) != 1)
  705. return(-1);
  706. #ifdef MSDOS
  707. holder = ident.name[0];
  708. ident.name[0] = ident.name[3];
  709. ident.name[3] = holder;
  710. holder = ident.name[1];
  711. ident.name[1] = ident.name[2];
  712. ident.name[2] = holder;
  713. ident.ck_length = _lrotl(ident.ck_length, 8);
  714. #endif
  715. /* fixed bug in next line, HP 27-may-93 */
  716. while(strncmp(ident.name,IFF_ID_COMM,4) != 0)
  717. {
  718. dummy = calloc( ident.ck_length, sizeof(char));
  719. /* changed "fread( &dummy," to "fread ( dummy,", HP 26-may-93 */
  720. if(fread( dummy, ident.ck_length, 1, file_ptr) != 1)
  721.   return(-1);
  722. free(dummy);
  723. /* fixed bug in next line, HP 27-may-93 */
  724. if(fread( &ident, sizeof(identifier),1, file_ptr) != 1)
  725.   return(-1);
  726. #ifdef MSDOS
  727. holder = ident.name[0];
  728. ident.name[0] = ident.name[3];
  729. ident.name[3] = holder;
  730. holder = ident.name[1];
  731. ident.name[1] = ident.name[2];
  732. ident.name[2] = holder;
  733. ident.ck_length = _lrotl(ident.ck_length, 8);
  734. #endif
  735. }
  736. for( i = 0; i < 4; ++i)
  737. CommChunk.ckID[i] = ident.name[i];
  738. CommChunk.ckSize = ident.ck_length;
  739. if (fread(&CommChunk.numChannels, sizeof(short), 1, file_ptr) != 1)
  740. return(-1);
  741. if (fread(&CommChunk.numSampleFrames, sizeof(unsigned long), 1,
  742.  file_ptr) != 1)
  743. return(-1);
  744. if (fread(&CommChunk.sampleSize, sizeof(short), 1, file_ptr) != 1)
  745. return(-1);
  746. if (fread(CommChunk.sampleRate, sizeof(char[10]), 1, file_ptr) != 1)
  747. return(-1);
  748. #ifdef MSDOS
  749.   CommChunk.sampleSize = _rotl(CommChunk.sampleSize, 8);
  750.   CommChunk.ckSize = _lrotl(CommChunk.ckSize, 8);
  751.   CommChunk.numChannels = _rotl(CommChunk.numChannels, 8);
  752.   CommChunk.numSampleFrames = _lrotl(CommChunk.numSampleFrames, 8);
  753. #endif
  754.   *byte_per_sample = ceil((double)CommChunk.sampleSize / 8);
  755.   for (i = 0; i < sizeof(char[10]); i++)
  756. temp_sampleRate[i] = CommChunk.sampleRate[i];
  757.   extended_to_double(temp_sampleRate, &aiff_ptr->sampleRate);
  758. /* to start the search again from the beginning, HP 27-may-93 */
  759.          fseek (file_ptr, sizeof(Chunk), SEEK_SET);
  760.  if (fread(&ident, sizeof(identifier), 1, file_ptr) != 1)
  761. return(-1);
  762. #ifdef MSDOS
  763. holder = ident.name[0];
  764. ident.name[0] = ident.name[3];
  765. ident.name[3] = holder;
  766. holder = ident.name[1];
  767. ident.name[1] = ident.name[2];
  768. ident.name[2] = holder;
  769. ident.ck_length = _lrotl(ident.ck_length, 8);
  770. #endif
  771. /* fixed bug in next line, HP 27-may-93 */
  772. while(strncmp(ident.name,IFF_ID_SSND,4) != 0)
  773. {
  774. dummy = calloc( ident.ck_length, sizeof(char));
  775. /* changed "fread( &dummy," to "fread ( dummy,", HP 26-may-93 */
  776. if(fread( dummy, ident.ck_length, 1, file_ptr) != 1)
  777.   return(-1);
  778. free(dummy);
  779. if(fread( &ident, sizeof(identifier),1, file_ptr) != 1)
  780.   return (-1);
  781. /* the following lines are not necessary, HP 27-may-93 */
  782. /*
  783.   {
  784.   fseek(file_ptr, 0, SEEK_SET);
  785.   if(fread( &ident, sizeof(identifier), 1, file_ptr) != 1)
  786.   return(-1);
  787.   }
  788. */
  789. #ifdef MSDOS
  790. holder = ident.name[0];
  791. ident.name[0] = ident.name[3];
  792. ident.name[3] = holder;
  793. holder = ident.name[1];
  794. ident.name[1] = ident.name[2];
  795. ident.name[2] = holder;
  796. ident.ck_length = _lrotl(ident.ck_length, 8);
  797. #endif
  798. }
  799. for(i = 0; i < 4; ++i)
  800. SndDChunk.ckID[i] = ident.name[i];
  801. SndDChunk.ckSize = ident.ck_length;
  802. if (fread(&SndDChunk.offset, sizeof(unsigned long), 1, file_ptr) != 1)
  803. return(-1);
  804. if (fread(&SndDChunk.blockSize, sizeof(unsigned long), 1,
  805.              file_ptr) != 1)
  806. return(-1);
  807. #ifdef MSDOS
  808.   SndDChunk.offset = _lrotl(SndDChunk.offset, 8);
  809.   SndDChunk.blockSize = _lrotl(SndDChunk.blockSize, 8);
  810. #endif
  811. /* why seek behinde the SSND Chunk ????, HP 27-may-93 */
  812. /*
  813.    seek_offset = SndDChunk.ckSize - sizeof(SoundDataChunk) +
  814.       sizeof(ChunkHeader);
  815.    if (fseek(file_ptr, seek_offset, SEEK_CUR) != 0)
  816.   return(-1);
  817. */
  818.    aiff_ptr->numChannels       = CommChunk.numChannels;
  819.    aiff_ptr->numSampleFrames   = CommChunk.numSampleFrames;
  820.    aiff_ptr->sampleSize        = CommChunk.sampleSize;
  821.    aiff_ptr->blkAlgn.offset    = SndDChunk.offset;
  822.    aiff_ptr->blkAlgn.blockSize = SndDChunk.blockSize;
  823.    strncpy(aiff_ptr->sampleType, SndDChunk.ckID, 4);
  824.    return(0);
  825. }
  826. /*****************************************************************************
  827. *
  828. *  Seek past some Audio Interchange File Format (AIFF) headers to sound data.
  829. *
  830. *****************************************************************************/
  831. int aiff_seek_to_sound_data(FILE *file_ptr)
  832. {
  833. /*   if (fseek(file_ptr, sizeof(Chunk) + sizeof(SoundDataChunk), SEEK_SET) != 0) */
  834.    if (fseek(file_ptr, sizeof(Chunk) + sizeof(CommonChunk) + sizeof(SoundDataChunk), SEEK_SET) != 0)
  835.       return(-1);
  836.    else
  837.       return(0);
  838. }
  839. /*******************************************************************************
  840. *
  841. *  Write Audio Interchange File Format (AIFF) headers.
  842. *
  843. *******************************************************************************/
  844. int aiff_write_headers(FILE *file_ptr,
  845.        IFF_AIFF *aiff_ptr)
  846. {
  847. register char   i;
  848. register long   seek_offset;
  849. char            temp_sampleRate[10];
  850. Chunk           FormChunk;
  851. CommonChunk     CommChunk;
  852. SoundDataChunk  SndDChunk;
  853. strcpy( FormChunk.ckID, IFF_ID_FORM);
  854. strcpy( FormChunk.formType, IFF_ID_AIFF);
  855. strcpy( CommChunk.ckID, IFF_ID_COMM);  /*7/7/93,SR,changed FormChunk to CommChunk*/
  856.    double_to_extended(&aiff_ptr->sampleRate, temp_sampleRate);
  857.    for (i = 0; i < sizeof(char[10]); i++)
  858.       CommChunk.sampleRate[i] = temp_sampleRate[i];
  859.    CommChunk.numChannels             = aiff_ptr->numChannels;
  860.    CommChunk.numSampleFrames         = aiff_ptr->numSampleFrames;
  861.    CommChunk.sampleSize              = aiff_ptr->sampleSize;
  862.    SndDChunk.offset                  = aiff_ptr->blkAlgn.offset + 2;
  863.    SndDChunk.blockSize               = aiff_ptr->blkAlgn.blockSize;
  864.    strncpy(/*(unsigned long *)*/ SndDChunk.ckID, aiff_ptr->sampleType,  4);
  865.    CommChunk.ckSize = sizeof(CommChunk.numChannels) +
  866.       sizeof(CommChunk.numSampleFrames) + sizeof(CommChunk.sampleSize) +
  867.       sizeof(CommChunk.sampleRate);
  868.    SndDChunk.ckSize = sizeof(SoundDataChunk) - sizeof(ChunkHeader) +
  869.       (CommChunk.sampleSize + BITS_IN_A_BYTE - 1) / BITS_IN_A_BYTE *
  870.       CommChunk.numChannels * CommChunk.numSampleFrames;
  871.    FormChunk.ckSize = sizeof(Chunk) + SndDChunk.ckSize + sizeof(ChunkHeader) +
  872.   CommChunk.ckSize;
  873.    if (fseek(file_ptr, 0, SEEK_SET) != 0)
  874.       return(-1);
  875.    if (fwrite(&FormChunk, sizeof(Chunk), 1, file_ptr) != 1)
  876.       return(-1);
  877. /*
  878.    if (fwrite(&SndDChunk, sizeof(SoundDataChunk), 1, file_ptr) != 1)
  879.       return(-1);
  880.    seek_offset = SndDChunk.ckSize - sizeof(SoundDataChunk) +
  881.       sizeof(ChunkHeader);
  882.    if (fseek(file_ptr, seek_offset, SEEK_CUR) != 0)
  883.       return(-1);
  884. */
  885.    if (fwrite(CommChunk.ckID, sizeof(ID), 1, file_ptr) != 1)
  886.       return(-1);
  887.    if (fwrite(&CommChunk.ckSize, sizeof(long), 1, file_ptr) != 1)
  888.       return(-1);
  889.    if (fwrite(&CommChunk.numChannels, sizeof(short), 1, file_ptr) != 1)
  890.       return(-1);
  891.    if (fwrite(&CommChunk.numSampleFrames, sizeof(unsigned long), 1,
  892.       file_ptr) != 1)
  893.   return(-1);
  894.    if (fwrite(&CommChunk.sampleSize, sizeof(short), 1, file_ptr) != 1)
  895.   return(-1);
  896.    if (fwrite(CommChunk.sampleRate, sizeof(char[10]), 1, file_ptr) != 1)
  897.       return(-1);
  898.    /* 960815 FdB put the sound data chunk after the common chunk */
  899.    if (fwrite(&SndDChunk, sizeof(SoundDataChunk), 1, file_ptr) != 1)
  900.       return(-1);
  901.    return(0);
  902. }
  903. /*****************************************************************************
  904. *
  905. *  bit_stream.c package
  906. *  Author:  Jean-Georges Fritsch, C-Cube Microsystems
  907. *
  908. *****************************************************************************/
  909. /********************************************************************
  910.   This package provides functions to write (exclusive or read)
  911.   information from (exclusive or to) the bit stream.
  912.   If the bit stream is opened in read mode only the get functions are
  913.   available. If the bit stream is opened in write mode only the put
  914.   functions are available.
  915. ********************************************************************/
  916. static char *he = "0123456789ABCDEF";
  917. /* open the device to read the bit stream from it */
  918. int open_bit_stream_r (Bit_stream *bs,   /* bit stream structure */
  919.        char *bs_filenam,       /* name of the bit stream file */
  920.        int size                /* size of the buffer */)
  921. {
  922.    register unsigned long n;
  923.    register int i=0,j=0;
  924.    register unsigned char flag = 1;
  925.    unsigned char val;
  926.    if ((bs->pt = fopen (bs_filenam, "rb")) == NULL)
  927.    {
  928.   printf("Could not find "%s".n", bs_filenam);
  929.   return (0);
  930.    }
  931.    fseek (bs->pt, bs->header_size, 0);
  932.    do
  933.    {
  934.  n = fread (&val, sizeof (unsigned char), 1, bs->pt);
  935.  switch (val)
  936.  {
  937.   case 0x30:
  938.   case 0x31:
  939.   case 0x32:
  940.   case 0x33:
  941.   case 0x34:
  942.   case 0x35:
  943.   case 0x36:
  944.   case 0x37:
  945.   case 0x38:
  946.   case 0x39:
  947.   case 0x41:
  948.   case 0x42:
  949.   case 0x43:
  950.   case 0x44:
  951.   case 0x45:
  952.   case 0x46:  j++;
  953.   case 0xa:  /* n */
  954.   break;
  955.   default: /* detection of an binary character */
  956.   flag--;
  957.   i = 300;
  958.   break;
  959.  }
  960.    } while (flag & n);
  961.    if (flag)
  962.    {
  963.   printf ("the bit stream file %s is an ASCII filen", bs_filenam);
  964.   printf ("ASCII files are not supported in this versionn");
  965.   exit (1);
  966.   bs->format = ASCII;
  967.    }
  968.    else
  969.    {
  970.   bs->format = BINARY;
  971.   printf ("the bit stream file %s is a BINARY filen", bs_filenam);
  972.    }
  973.    fclose (bs->pt);
  974.    if ((bs->pt = fopen (bs_filenam, "rb")) == NULL)
  975.    {
  976.       printf("Could not find "%s".n", bs_filenam);
  977.       return(0);
  978.    }
  979.    fseek (bs->pt, bs->header_size, 0);
  980.    bs->curpos=0;
  981.    bs->totbits=0;
  982.    bs->mode = READ_MODE;
  983.    bs->eobs = FALSE;
  984.    return(1);
  985. }
  986. /*close the device containing the bit stream after a read process*/
  987. void close_bit_stream_r(Bit_stream *bs)
  988. {
  989.    fclose(bs->pt);
  990. }
  991. unsigned int get1bit(Bit_stream *bs)
  992. {
  993.    if (bs->curpos < bs->totbits)
  994.    {
  995. #ifdef PrintBitDebug
  996.       printf ("pos: %5d bits: %2d code: %4x val: %5dn",
  997. bs->curpos,  1, bs->bits[bs->curpos], bs->bits[bs->curpos]);
  998.       fflush (stdout);
  999. #endif
  1000.       return (bs->bits[bs->curpos++]);
  1001.    }
  1002.    else
  1003.    {
  1004.       fprintf (stderr, "get1bits: bs->curpos = %4d bs->totbits = %4d bitsn",
  1005.        bs->curpos, bs->totbits);
  1006.       exit (1);
  1007.    }
  1008. }
  1009. unsigned long getbits(Bit_stream *bs, int n)
  1010. {
  1011.    unsigned long val;
  1012.    int i;
  1013.    if (bs->curpos + n <= bs->totbits)
  1014.    {
  1015.       for (i = val = 0; i < n; i++)
  1016.          val = 2*val + bs->bits[bs->curpos++];
  1017. #ifdef PrintBitDebug
  1018.       printf ("pos: %5d bits: %2d code: %4x val: %5dn", 
  1019.  bs->curpos - n,  n, val, val);
  1020.       fflush (stdout);
  1021. #endif
  1022.       return (val);
  1023.    }
  1024.    else
  1025.    {
  1026.       fprintf (stderr, "getbits: n: %4d bs->curpos: %4d bs->totbits = %4d bitsn",
  1027.        n, bs->curpos, bs->totbits);
  1028.       exit (1);
  1029.    }
  1030. }
  1031. void program_information(void)
  1032. {
  1033.  printf("ISO MPEG Audio Subgroup Software Simulation Group (1996)n");
  1034.  printf("ISO 13818-3 MPEG-2 Audio Multichannel Decodern");
  1035.  printf("%sn", VERSION);
  1036. }
  1037. /*******************************************************************/
  1038. /*return the status of the bit stream*/
  1039. /* returns 1 if end of bit stream was reached */
  1040. /* returns 0 if end of bit stream was not reached */
  1041. int end_bs(Bit_stream *bs)
  1042. {
  1043.   return(bs->eobs);
  1044. }
  1045. static void bytes_to_bits (char *w_code, unsigned char *in, int nbytes)
  1046. {
  1047.   int i, j, bpos, d;
  1048.   bpos = 0;
  1049.   for (i = 0; i < nbytes; i++) {
  1050.     d = in[i];
  1051.     for (j = 7; j >= 0; j--) {
  1052.       w_code[bpos+j] = d & 1;
  1053.       d = d / 2;
  1054.     }
  1055.     bpos += 8;
  1056.   }
  1057. }
  1058. /*this function seeks for a byte aligned sync word in the bit stream and
  1059.   places the bit stream pointer right after the sync.
  1060.   This function returns 1 if the sync was found otherwise it returns 0 */
  1061. int seek_sync_mpg (Bit_stream *bs)   /* bit stream structure */
  1062. {
  1063.    unsigned long val = 0;
  1064.    unsigned char byte;
  1065.    unsigned char bytes[2000]; /* bytes of an MPEG-1 frame */
  1066.    long sync = SYNC_WORD; /* sync word maximum 32 bits */
  1067.    int N = SYNC_WORD_LNGTH; /* sync word length */
  1068.    int i, sync_bytes = N / 8;
  1069.    int version, layer, br_index, bit_rate, c, f_sampl, padding, slots, nbytes;
  1070.    if (fread (bytes, 1, 4, bs->pt) != 4)
  1071.    {
  1072.       printf ("next mpg header not foundn");
  1073.       return (0);
  1074.    }
  1075.    for (i = 0; i < sync_bytes; i++)
  1076.    {
  1077.       val <<= 8;
  1078.       val |= bytes[i];
  1079.    }
  1080.    if ((N % 8) != 0)
  1081.    {
  1082.       val <<= N % 8;
  1083.       byte = bytes[sync_bytes] >> (8 - (N % 8));
  1084.       val |= byte;
  1085.    }
  1086.   
  1087.    if (val != sync)
  1088.    {
  1089.       printf ("no mpg sync found: %4xn", val);
  1090.       return (0);
  1091.    }
  1092.    bytes_to_bits (bs->bits, bytes, 4);
  1093.   
  1094.    version = bs->bits[12];
  1095.    if (version == 0)
  1096.    {
  1097.       fprintf (stderr, "Error: Illegal version bit.n");
  1098.       exit (1);
  1099.    }
  1100.    layer = 4 - 2*bs->bits[13] - bs->bits[14];
  1101.    for (i = 16, br_index = 0; i < 20; i++)
  1102.       br_index = 2*br_index + bs->bits[i];
  1103.    if (br_index == 0 || br_index == 15)
  1104.    {
  1105.       fprintf (stderr, "Error: Illegal bit_rate index (0 or 15).n");
  1106.       exit (1);
  1107.    }
  1108.    bit_rate = bitrate[layer-1][br_index] * 1000;
  1109.    c = 2*bs->bits[20] + bs->bits[21];
  1110.    switch (c) {
  1111.    case 0: f_sampl = 44100;
  1112.    break;
  1113.    case 1: f_sampl = 48000;
  1114.    break;
  1115.    case 2: f_sampl = 32000;
  1116.    break;
  1117.    case 3: fprintf (stderr, "Error: reserved sampling rate.n");
  1118.    exit (1);
  1119.    }
  1120.    padding = bs->bits[22];
  1121.    if (layer == 1)
  1122.       slots = bit_rate * 12 / f_sampl;
  1123.    else
  1124.       slots = bit_rate * 144 / f_sampl;
  1125.    slots += padding;
  1126.    if (layer == 1)
  1127.       nbytes = slots * 4;
  1128.    else
  1129.       nbytes = slots;
  1130.    if (fread (&bytes[4], 1, nbytes-4, bs->pt) != nbytes-4)
  1131.    {
  1132.       printf ("no n-4 bytesn");
  1133.       return (0);
  1134.    }
  1135.    bytes_to_bits (&bs->bits[32], &bytes[4], nbytes-4);
  1136.    bs->curpos = 12;
  1137.    bs->totbits = nbytes * 8;
  1138.    bs->eobs = 0;
  1139.    return (1);
  1140. }
  1141. int seek_sync_ext (Bit_stream *bs, frame_params *fr_ps)   /* bit stream structure */
  1142. {
  1143.    layer *info = fr_ps->header;
  1144.    unsigned long val = 0;
  1145.    unsigned char byte;
  1146.    unsigned char bytes[2048]; /* bytes of an MPEG-2 extention frame */
  1147.    long sync = EXT_SYNCWORD; /* sync word maximum 32 bits */
  1148.    int N = SYNC_WORD_LNGTH; /* sync word length */
  1149.    int i, sync_bytes = N / 8;
  1150.    int nbytes, lcrc, la_bytes, la_bits;
  1151.    if (fread (bytes, 1, 5, bs->pt) != 5)
  1152.    {
  1153.       printf ("next ext header not foundn");
  1154.       return (0);
  1155.    }
  1156.    for (i = 0; i < sync_bytes; i++)
  1157.    {
  1158.       val <<= 8;
  1159.       val |= bytes[i];
  1160.    }
  1161.    if ((N % 8) != 0)
  1162.    {
  1163.       val <<= N % 8;
  1164.       byte = bytes[sync_bytes] >> (8 - (N % 8));
  1165.       val |= byte;
  1166.    }
  1167.   
  1168.    if (val != sync)
  1169.    {
  1170.       printf ("no ext sync found: %4xn", val);
  1171.       return (0);
  1172.    }
  1173.    nbytes = (((int) (bytes[3] & 0x0f) * 256) + bytes[4]) / 2;
  1174.    if (fread (&bytes[5], 1, nbytes-5, bs->pt) != nbytes-5)
  1175.       return (0);
  1176.    bytes_to_bits (bs->bits, bytes, nbytes);
  1177.    bs->totbits = nbytes * 8;
  1178.    bs->curpos = 12;
  1179.    bs->eobs = 0;
  1180.    info->ext_crc_check = getbits (bs, 16);
  1181.    info->ext_length = getbits (bs, 11);
  1182.    info->reserved_bit = get1bit (bs);
  1183. #ifdef EXTENSION_CRC_CHECK
  1184.    lcrc = info->ext_length * 8 - 28;
  1185.    if (lcrc > 128) lcrc = 128;
  1186.    la_bytes = (lcrc - 12) / 8;
  1187.    la_bits = (lcrc - 12) % 8;
  1188.    for (i = 0; i < la_bytes; i++)
  1189.       info->ext_crc_bits[i] = getbits (bs, 8);
  1190.    info->ext_crc_bits[la_bytes] = getbits (bs, la_bits);
  1191.    bs->curpos = 40;
  1192.    if (mc_ext_error_check (fr_ps, la_bytes, la_bits) == 0)
  1193.       return (0);
  1194. #endif
  1195.    return (1);
  1196. }
  1197. /*****************************************************************************
  1198. *
  1199. *  End of bit_stream.c package
  1200. *
  1201. *****************************************************************************/
  1202. /*****************************************************************************
  1203. *
  1204. *  CRC error protection package
  1205. *
  1206. *****************************************************************************/
  1207. void update_CRC(unsigned int data,
  1208. unsigned int length,
  1209. unsigned int *crc)
  1210. {
  1211. unsigned int  masking, carry;
  1212. masking = 1 << length;
  1213. while((masking >>= 1)){
  1214. carry = *crc & 0x8000;
  1215. *crc <<= 1;
  1216. if (!carry ^ !(data & masking))
  1217. *crc ^= CRC16_POLYNOMIAL;
  1218. }
  1219. *crc &= 0xffff;
  1220. #ifdef PrintCRCDebug
  1221. printf ("crc_len: %2d code: %4x crc: %4xn", length, data, *crc);
  1222. fflush (stdout);
  1223. #endif
  1224. }
  1225. void I_CRC_calc (frame_params *fr_ps,
  1226.  unsigned int bit_alloc[7][SBLIMIT], 
  1227.  unsigned int *crc)
  1228. {
  1229.    int i, k;
  1230.    layer *info = fr_ps->header;
  1231.    int stereo  = fr_ps->stereo;
  1232.    int jsbound = fr_ps->jsbound;
  1233.    *crc = 0xffff; /* changed from '0' 92-08-11 shn */
  1234.    update_CRC (info->bitrate_index, 4, crc);
  1235.    update_CRC (info->sampling_frequency, 2, crc);
  1236.    update_CRC (info->padding, 1, crc);
  1237.    update_CRC (info->extension, 1, crc);
  1238.    update_CRC (info->mode, 2, crc);
  1239.    update_CRC (info->mode_ext, 2, crc);
  1240.    update_CRC (info->copyright, 1, crc);
  1241.    update_CRC (info->original, 1, crc);
  1242.    update_CRC (info->emphasis, 2, crc);
  1243.    for (i=0; i<SBLIMIT; i++)
  1244.       for (k=0; k<((i<jsbound)?stereo:1); k++)
  1245.  update_CRC (bit_alloc[k][i], 4, crc);
  1246. }
  1247. void II_CRC_calc(frame_params *fr_ps,
  1248.  unsigned int bit_alloc[7][SBLIMIT], 
  1249.  unsigned int scfsi[7][SBLIMIT],
  1250.  unsigned int *crc)
  1251. {
  1252.    int i, k;
  1253.    layer *info = fr_ps->header;
  1254.    int stereo  = fr_ps->stereo;
  1255.    int sblimit = fr_ps->sblimit;
  1256.    int jsbound = fr_ps->jsbound;
  1257.    al_table *alloc = fr_ps->alloc;
  1258.    *crc = 0xffff; /* changed from '0' 92-08-11 shn */
  1259.    update_CRC (info->bitrate_index, 4, crc);
  1260.    update_CRC (info->sampling_frequency, 2, crc);
  1261.    update_CRC (info->padding, 1, crc);
  1262.    update_CRC (info->extension, 1, crc);
  1263.    update_CRC (info->mode, 2, crc);
  1264.    update_CRC (info->mode_ext, 2, crc);
  1265.    update_CRC (info->copyright, 1, crc);
  1266.    update_CRC (info->original, 1, crc);
  1267.    update_CRC (info->emphasis, 2, crc);
  1268.    for (i=0; i<sblimit; i++)
  1269.       for (k=0; k<((i<jsbound)?stereo:1); k++)
  1270.  update_CRC (bit_alloc[k][i], (*alloc)[i][0].bits, crc);
  1271.    for (i=0; i<sblimit; i++)
  1272.       for (k=0; k<stereo; k++)
  1273.  if (bit_alloc[k][i])
  1274.     update_CRC (scfsi[k][i], 2, crc);
  1275. }
  1276. void mc_error_check(frame_params *fr_ps,
  1277.     unsigned int bit_alloc[7][SBLIMIT], 
  1278.     unsigned int scfsi[7][SBLIMIT],
  1279.     unsigned int *crc,
  1280.      int ch_start,
  1281.      int channels)
  1282. {
  1283.  int i, m, l, pci,c,sbgr;
  1284.  layer *info = fr_ps->header;
  1285.  int sblimit = fr_ps->sblimit_mc;
  1286.  al_table *alloc = fr_ps->alloc_mc;
  1287.  *crc = 0xffff; /* changed from '0' 92-08-11 shn */
  1288.  update_CRC(info->ext_bit_stream_present, 1, crc);
  1289.  if ( info->ext_bit_stream_present == 1)
  1290. update_CRC(info->n_ad_bytes, 8, crc);
  1291.  update_CRC(info->center, 2, crc);
  1292.  update_CRC(info->surround, 2, crc);
  1293.  update_CRC(info->lfe, 1, crc);
  1294.  update_CRC(info->audio_mix, 1,crc);
  1295.  update_CRC(info->dematrix_procedure, 2, crc);
  1296.  update_CRC(info->no_of_multi_lingual_ch, 3, crc);
  1297.  update_CRC(info->multi_lingual_fs, 1, crc);
  1298.  update_CRC(info->multi_lingual_layer, 1, crc);
  1299.  update_CRC(info->copyright_ident_bit, 1, crc);
  1300.  update_CRC(info->copyright_ident_start, 1, crc);
  1301.  
  1302.  update_CRC(info->tc_sbgr_select, 1, crc);
  1303.  update_CRC(info->dyn_cross_on, 1, crc);
  1304.  update_CRC(info->mc_prediction_on, 1, crc);
  1305.  if (info->tc_sbgr_select == 1)
  1306.     update_CRC (info->tc_allocation, fr_ps->alloc_bits, crc);
  1307.  else
  1308.     for (i = 0; i < 12; i++)
  1309.        update_CRC (info->tc_alloc[i], fr_ps->alloc_bits, crc);
  1310.    
  1311.  if (info->dyn_cross_on == 1)
  1312.  {
  1313. update_CRC(info->dyn_cross_LR, 1, crc);
  1314. for(i = 0; i < 12; i++)
  1315. {
  1316. update_CRC(info->dyn_cross_mode[i], fr_ps->dyn_cross_bits, crc);
  1317. if (info->surround == 3)
  1318. update_CRC(info->dyn_second_stereo[i], 1, crc);
  1319. }
  1320.  }
  1321.  if (info->mc_prediction_on == 1)
  1322.  {
  1323. for(i = 0; i < 8; i++)
  1324. {  /* new sbgr < 8 */
  1325. update_CRC(info->mc_prediction[i], 1, crc);
  1326. if( info->mc_prediction[i] == 1 )
  1327. {
  1328.    for(pci=0; pci< pred_coef_table[fr_ps->pred_mode][info->dyn_cross_mode[i]]; pci++)
  1329. update_CRC(info->mc_predsi[i][pci], 2, crc);
  1330. }
  1331. }
  1332.  }
  1333.  if( info->lfe )
  1334. update_CRC(info->lfe_alloc, (*alloc)[0][0].bits, crc);
  1335.  for (i=0;i<sblimit;i++)
  1336.    if( info->dyn_cross_on == 0)
  1337. for(m = ch_start; m < channels; ++m)
  1338. {
  1339. if((i < 12) || (m != 2) || (fr_ps->header->center != 3))
  1340. update_CRC(bit_alloc[m][i], (*alloc)[i][0].bits, crc);
  1341. /* to limit the CRC calc., if the phant. center valid */
  1342. }
  1343.    else
  1344.    {
  1345. if(i == 0) sbgr = 0;
  1346. else
  1347.        for(c = 1; c < 12; c++)
  1348.        {
  1349.        if((sb_groups[c-1] < i) && (i <= sb_groups[c]))
  1350.        {
  1351.       sbgr = c;  /* search the valid subband group */
  1352.       break;
  1353.           }
  1354.    }
  1355. /* 960816 FdB new setup for dyn. crosstalk modes */
  1356. if (info->dyn_cross_mode[sbgr] == 0)
  1357. {
  1358.    for (m = ch_start; m < channels; m++)
  1359.       if ((info->center != 3) || (i < 12) || (m !=2))
  1360.  if (info->surround == 3 && info->dyn_second_stereo[sbgr] == 1)
  1361.  {
  1362.     if ((info->center == 0 || m != 4) && (info->center != 0 || m != (ch_start+1)))
  1363.        update_CRC (bit_alloc[m][i], (*alloc)[i][0].bits, crc);
  1364.  }
  1365.  else
  1366.     update_CRC (bit_alloc[m][i], (*alloc)[i][0].bits, crc);
  1367. }
  1368. else if (fr_ps->dyn_cross_bits == 1)   /* for channel mode 3/0 and 2/1 */
  1369. {
  1370.    if (info->surround == 3) /* 3/0 + 2/0 */
  1371.    {
  1372.       update_CRC (bit_alloc[3][i], (*alloc)[i][0].bits, crc);
  1373.       if (info->dyn_second_stereo[sbgr] == 0)
  1374.          update_CRC (bit_alloc[4][i], (*alloc)[i][0].bits, crc);
  1375.    }
  1376. }
  1377. else if (fr_ps->dyn_cross_bits == 3)   /* for channel mode 3/1 and 2/2 */
  1378. {
  1379.    if ((info->center != 3) || (i < 12))    /* 3/2 + no phantom center */
  1380.       if ((info->dyn_cross_mode[sbgr] == 1) || (info->dyn_cross_mode[sbgr] == 4))
  1381.          update_CRC (bit_alloc[2][i], (*alloc)[i][0].bits, crc);
  1382.    if (info->dyn_cross_mode[sbgr] == 2)
  1383.       update_CRC (bit_alloc[3][i], (*alloc)[i][0].bits, crc);
  1384. else if (fr_ps->dyn_cross_bits == 4)   /* for channel mode 3/2 */
  1385. {
  1386.    /* T2 */
  1387.    if ((info->center != 3) || (i < 12))    /* 3/2 + no phantom center */
  1388.       switch (info->dyn_cross_mode[sbgr])
  1389.    {
  1390.    case 1 :   /* T2 contains bitalloc info */
  1391.    case 2 :
  1392.    case 4 :
  1393.    case 8 :
  1394.    case 9 :
  1395.    case 10: 
  1396.    case 11: 
  1397.    case 12: 
  1398.    case 14: 
  1399.       update_CRC (bit_alloc[2][i], (*alloc)[i][0].bits, crc);
  1400.       break;
  1401.    }
  1402.    /* T3 */
  1403.    switch (info->dyn_cross_mode[sbgr])
  1404.    {
  1405.    case 1 :   /* T3 contains bitalloc info */
  1406.    case 3 :
  1407.    case 5 :
  1408.    case 8 :
  1409.    case 10: 
  1410.    case 13: 
  1411.       update_CRC (bit_alloc[3][i], (*alloc)[i][0].bits, crc);
  1412.       break;
  1413.    }
  1414.    /* T4 */
  1415.    switch (info->dyn_cross_mode[sbgr])
  1416.    {
  1417.    case 2 :   /* T4 contains bitalloc info */
  1418.    case 3 :
  1419.    case 6 :
  1420.    case 9 : 
  1421.       update_CRC (bit_alloc[4][i], (*alloc)[i][0].bits, crc);
  1422.       break;
  1423.    }
  1424. }
  1425.    }
  1426.      for (i = 0; i < sblimit; i++)
  1427. for (m = ch_start; m < channels; m++)
  1428. if (bit_alloc[m][i])
  1429. update_CRC (scfsi[m][i], 2, crc); 
  1430. }
  1431. #ifdef Augmentation_7ch
  1432. void mc_aug_error_check(frame_params *fr_ps,
  1433.     unsigned int bit_alloc[7][SBLIMIT], 
  1434.     unsigned int scfsi[7][SBLIMIT],
  1435.     unsigned int *crc)
  1436. {
  1437.    int i, m, l, pci,c,sbgr;
  1438.    layer *info = fr_ps->header;
  1439.    int sblimit = fr_ps->sblimit_mc;
  1440.    al_table *alloc = fr_ps->alloc_mc;
  1441.    *crc = 0xffff; /* changed from '0' 92-08-11 shn */
  1442.    update_CRC(info->aug_mtx_proc, 2, crc);
  1443.    update_CRC(info->aug_dyn_cross_on, 1, crc);
  1444.    update_CRC(info->aug_future_ext, 1, crc);
  1445.    if(info->aug_mtx_proc == 0)
  1446.       for(i = 0; i < 12; i++)
  1447.  update_CRC(info->tc_aug_alloc[i], 3, crc);
  1448.    else if(info->aug_mtx_proc == 1)
  1449.       for(i = 0; i < 12; i++)
  1450.  update_CRC(info->tc_aug_alloc[i], 2, crc);
  1451.      
  1452.    if(info->aug_dyn_cross_on == 1)
  1453.       for(i = 0; i < 12; i++)
  1454.  update_CRC(info->dyn_cross_aug_mode[i], 5, crc);
  1455.    for (i=0;i<sblimit;i++)
  1456.    {
  1457.       if(i == 0) sbgr = 0;
  1458.       else
  1459.  for(c = 1; c < 12; c++)
  1460.  {
  1461.     if((sb_groups[c-1] < i) && (i <= sb_groups[c]))
  1462.     {
  1463.       sbgr = c;  /* search the valid subband group */
  1464.       break;
  1465.     }
  1466.  }
  1467.  
  1468.       /* check bitalloc info */
  1469.       switch (info->dyn_cross_aug_mode[sbgr])
  1470.       {
  1471.       case  0: /* T5 and T6 contains bitalloc info */
  1472.        update_CRC(bit_alloc[5][i], (*alloc)[i][0].bits, crc);
  1473.        update_CRC(bit_alloc[6][i], (*alloc)[i][0].bits, crc);
  1474.        break;
  1475.       case  1: /* T5 contains bitalloc info */
  1476.       case  2:
  1477.       case  3:
  1478.       case  4:
  1479.        update_CRC(bit_alloc[5][i], (*alloc)[i][0].bits, crc);
  1480.        break;
  1481.       case  5:   /* T6 contains bitalloc info */
  1482.       case 10:
  1483.       case 14:
  1484.        update_CRC(bit_alloc[6][i], (*alloc)[i][0].bits, crc);
  1485.        break;
  1486.       }
  1487.    }
  1488.    for (i = 0; i < sblimit; i++)
  1489.       for (m = 5; m < 7; m++)
  1490.  if (bit_alloc[m][i])
  1491.  update_CRC (scfsi[m][i], 2, crc); 
  1492. }
  1493. #endif
  1494. int mc_ext_error_check (frame_params *fr_ps, int bytes, int bits)
  1495. {
  1496. layer *info = fr_ps->header;
  1497. int i;
  1498. unsigned int crc;
  1499. crc = 0xffff;
  1500. update_CRC(info->ext_length, 11, &crc);
  1501. update_CRC(info->reserved_bit, 1, &crc);
  1502. for( i = 0; i < bytes; i++)
  1503. update_CRC(info->ext_crc_bits[i], 8, &crc);
  1504. update_CRC(info->ext_crc_bits[bytes], bits, &crc);
  1505. if (crc != info->ext_crc_check)
  1506. {
  1507. printf ("nERROR in EXT.-CRC n");
  1508. return (0);
  1509. }
  1510. else
  1511. return(1);
  1512. }
  1513. /*****************************************************************************
  1514. *
  1515. *  End of CRC error protection package
  1516. *
  1517. *****************************************************************************/
  1518. #ifdef  MACINTOSH
  1519. /*****************************************************************************
  1520. *
  1521. *  Set Macintosh file attributes.
  1522. *
  1523. *****************************************************************************/
  1524. void    set_mac_file_attr(char fileName[MAX_NAME_SIZE],
  1525.   short vRefNum,
  1526.   OsType creator,
  1527.   OsType fileType)
  1528. {
  1529. short   theFile;
  1530. char    pascal_fileName[MAX_NAME_SIZE];
  1531. FInfo   fndrInfo;
  1532. CtoPstr(strcpy(pascal_fileName, fileName));
  1533.         FSOpen(pascal_fileName, vRefNum, &theFile);
  1534.         GetFInfo(pascal_fileName, vRefNum, &fndrInfo);
  1535. fndrInfo.fdCreator = creator;
  1536.         fndrInfo.fdType = fileType;
  1537.         SetFInfo(pascal_fileName, vRefNum, &fndrInfo);
  1538.         FSClose(theFile);
  1539. }
  1540. #endif