common.c

来自「ISO mp3 sources (distribution 10) Layer」· C语言 代码 · 共 1,831 行 · 第 1/4 页

C
1,831
字号
/********************************************************************** * ISO MPEG Audio Subgroup Software Simulation Group (1996) * ISO 13818-3 MPEG-2 Audio Multichannel Decoder * * $Id: common.c 1.12 1997/01/17 04:25:12 rowlands Exp $ * * $Log: common.c $ * Revision 1.12  1997/01/17 04:25:12  rowlands * Fixed base bitstream joint stereo bugs. * * Removed incorrect dependence on jsbound in the calculation of the * mc crc. * * Revision 1.11  1996/06/18 22:47:29  rowlands * Added extra debug output * * Revision 1.10  1996/04/18 05:37:23  rowlands * Release following Florence meeting * * Revision 1.9  1996/02/12 07:13:06  rowlands * Release following Munich meeting * * Revision 1.8.1.1  1996/01/20  17:28:45  rowlands * Received from Ralf Schwalbe (Telekom FTZ) - includes prediction * * Revision 1.6.1.3  1995/08/14  08:10:19  tenkate * ML-LSF added Warner ten Kate 7/8/95 (Philips) * "alloc_4" table copied from LSF-directory. * SmpFrqIndex() extended. * * Revision 1.6.1.1  1995/07/14  06:12:46  rowlands * Updated dynamic crosstalk from FTZ: revision FTZ_03 * * Revision 1.6  1995/06/22  01:23:00  rowlands * Merged FTZ dynamic crosstalk * * Revision 1.3.3.1  1995/06/16  08:40:12  rowlands * Input from Sang Wook Kim (Samsung AIT) * **********************************************************************//********************************************************************** *   date   programmers                comment                        * * 2/25/91  Douglas Wong        start of version 1.0 records          * * 3/06/91  Douglas Wong        rename setup.h to dedef.h             * *                              removed extraneous variables          * *                              removed window_samples (now part of   * *                              filter_samples)                       * * 3/07/91  Davis Pan           changed output file to "codmusic"     * * 5/10/91  Vish (PRISM)        Ported to Macintosh and Unix.         * *                              Incorporated new "out_fifo()" which   * *                              writes out last incomplete buffer.    * *                              Incorporated all AIFF routines which  * *                              are also compatible with SUN.         * *                              Incorporated user interface for       * *                              specifying sound file names.          * *                              Also incorporated user interface for  * *                              writing AIFF compatible sound files.  * * 27jun91  dpwe (Aware)        Added musicout and &sample_frames as  * *                              args to out_fifo (were glob refs).    * *                              Used new 'frame_params' struct.       * *                              Clean,simplify, track clipped output  * *                              and total bits/frame received.        * * 7/10/91  Earle Jennings      changed to floats to FLOAT            * *10/ 1/91  S.I. Sudharsanan,   Ported to IBM AIX platform.           * *          Don H. Lee,                                               * *          Peter W. Farrett                                          * *10/ 3/91  Don H. Lee          implemented CRC-16 error protection   * *                              newly introduced functions are        * *                              buffer_CRC and recover_CRC_error      * *                              Additions and revisions are marked    * *                              with "dhl" for clarity                * * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   * *                              important fixes involved changing     * *                              16-bit ints to long or unsigned in    * *                              bit alloc routines for quant of 65535 * *                              and passing proper function args.     * *                              Removed "Other Joint Stereo" option   * *                              and made bitrate be total channel     * *                              bitrate, irrespective of the mode.    * *                              Fixed many small bugs & reorganized.  * ********************************************************************** *                                                                    * *                                                                    * *  MPEG/audio Phase 2 coding/decoding multichannel                   * *                                                                    * *  Version 1.0                                                       * *                                                                    * *  7/27/93        Susanne Ritscher,  IRT Munich                      * *                                                                    * *                  thanks to                                         * *                  Ralf Schwalbe,    Telekom FTZ Berlin              * *                  Heiko Purnhagen,  Uni Hannover                    * *                                                                    * *  Version 2.0                                                       * *                                                                    * *  8/27/93        Susanne Ritscher, IRT Munich                       * *                 Channel-Switching is working                       * *                                                                    * *  Version 2.1                                                       * *                                                                    * *  9/1/93         Susanne Ritscher,  IRT Munich                      * *                 all channels normalized                            * *                                                                    * *  Version 3.0                                                       * *                                                                    * *  06/16/94       Ralf Schwalbe, Telekom FTZ Berlin                  * *                 all sources and variables adapted due to MPEG-2 -  * *                 DIS from March 1994                                * *                  - dematrix and denormalize procedure              * *                  - new tc - allocation (0-7)                       * *                  - some new structures and variables as a basis    * *                    for further decoding modes                      * ********************************************************************** *								      * *  Version 1.0                                                       * *                                                                    * *  11/04/94       Ralf Schwalbe,  Telekom FTZ Berlin                 * *                  - decoding tc-allocation                          * *                  - some new subroutines, globale variables and     * *                    structures (important to handle the ext. bitst.)* *                  - changed all functions to ANSI-C funktion header * *		    - corrected some bugs to decode bitstreams > 512kB* *								      * *  Version 1.1                                                       * *                                                                    * *  12/07/94       Ralf Schwalbe,  Telekom FTZ Berlin                 * *                  - decoding extension bitstream                    * *                                                                    * *  Version 1.1.1                                                     * *                 Ralf Schwalbe, Telekom FTZ Berlin                  * *                  - fixed some bugs                                 * *                                                                    * *  Version 1.2                                                       * *                                                                    * *  6/21/95       Ralf Schwalbe, Deutsche Telekom FTZ Berlin          * *            	    - decoding dynamic crosstalk                      * *                  - decoding phantom center                         *  *                  - decoding MPEG1 compatible part only (stereo)    * *                  - corrected some settings and bugs                * *                                                                    *   *  7/12/95	  Ralf Schwalbe, Deutsche Telekom FTZ Berlin          * *		    - corrected dynamic crosstalk 		      * *		    - 3/2,3/1,3/0,2/1, channel configurations         * *                    are working                                     * *		  						      * * 10/31/95	  Ralf Schwalbe, Deutsche Telekom FTZ Berlin	      * *		    - decoding of LFE-channel is working  	      * *		    - corrected any settings and bugs		      * *		    - corrected table-switch for channel mode < 3/2   * *		      and tc-allocation / dyn-crosstalk		      * *		    - still a problem with compl. bitstream 18/19     * *								      *	 * 01/12/96	  Ralf Schwalbe, Deutsche Telekom TZ Darmstadt	      * *		    - decoder prediction installed		      * *		    - problem with compl. bitstream 19 solved,        * *								      *   *  Version 2.0                                                       * *                                                                    * * 01/28/97       Frans de Bont, Philips Sound & Vision, Eindhoven    * *		    - simultaneous use of tc allocation and dynamic   * *		      crosstalk working for all configurations	      * *		    - prediction working for all configurations	      * *		    - layer 1 MC working			      * *		    - variable bit rate and extension bitstreams      * *		    - fully compliant to 13818-3.2                    * *                                                                    *				      *		     **********************************************************************//********************************************************************** *                                                                    * *  06/06/95       Sang Wook Kim,  Samsung AIT                        * *                 Bug corrected in pick_table                        * *								      * **********************************************************************//*************************************************************************  Global Include Files************************************************************************/#include        "common.h"#include        "decoder.h" /* 23/03/1995 JMZ Test_bit_stream */#ifdef  MACINTOSH#include        <SANE.h>#include        <pascal.h>#endif#include <string.h>#include <ctype.h>/*************************************************************************  Global Variable Definitions************************************************************************/char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "single-ch" };char *layer_names[3] = { "I", "II", "III" };double  s_freq[4] = {44.1, 48, 32, 0};int	  bitrate[3][15] = {			 {1000,32,64,96,128,160,192,224,256,288,320,352,384,416,448},			 {1000,32,48,56,64,80,96,112,128,160,192,224,256,320,384},			 {1000,32,40,48,56,64,80,96,112,128,160,192,224,256,320}        };double multiple[64] = {2.00000000000000, 1.58740105196820, 1.25992104989487,1.00000000000000, 0.79370052598410, 0.62996052494744, 0.50000000000000,0.39685026299205, 0.31498026247372, 0.25000000000000, 0.19842513149602,0.15749013123686, 0.12500000000000, 0.09921256574801, 0.07874506561843,0.06250000000000, 0.04960628287401, 0.03937253280921, 0.03125000000000,0.02480314143700, 0.01968626640461, 0.01562500000000, 0.01240157071850,0.00984313320230, 0.00781250000000, 0.00620078535925, 0.00492156660115,0.00390625000000, 0.00310039267963, 0.00246078330058, 0.00195312500000,0.00155019633981, 0.00123039165029, 0.00097656250000, 0.00077509816991,0.00061519582514, 0.00048828125000, 0.00038754908495, 0.00030759791257,0.00024414062500, 0.00019377454248, 0.00015379895629, 0.00012207031250,0.00009688727124, 0.00007689947814, 0.00006103515625, 0.00004844363562,0.00003844973907, 0.00003051757813, 0.00002422181781, 0.00001922486954,0.00001525878906, 0.00001211090890, 0.00000961243477, 0.00000762939453,0.00000605545445, 0.00000480621738, 0.00000381469727, 0.00000302772723,0.00000240310869, 0.00000190734863, 0.00000151386361, 0.00000120155435,1E-20};int sb_groups[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 15, 26};/*int transmission_channel[8][5] = {{0, 1, 2, 3, 4},				    {0, 1, 5, 3, 4},				    {0, 1, 6, 3, 4},				    {0, 1, 2, 5, 4},				    {0, 1, 2, 3, 6},				    {0, 1, 2, 5, 6},				    {0, 1, 6, 5, 4},				    {0, 1, 5, 3, 6}};*//*************************************************************************  Global Function Definitions************************************************************************//* The system uses a variety of data files.  By opening them via this   function, we can accommodate various locations. */FILE *OpenTableFile(char *name){char fulname[80];char *envdir;FILE *f;	 fulname[0] = '\0';#ifdef TABLES_PATH	   strcpy(fulname, TABLES_PATH);   /* default relative path for tables */#endif /* TABLES_PATH */          /* (includes terminal path seperator */#ifdef UNIX                       /* envir. variables for UNIX only */	   {		char *getenv(const char *);        envdir = getenv(MPEGTABENV);   /* check for environment */        if(envdir != NULL)            strcpy(fulname, envdir);        strcat(fulname, PATH_SEPARATOR);  /* add a "/" on the end */      }#endif /* UNIX */	strcat(fulname, name);    if( (f=fopen(fulname,"r"))==NULL ) {        fprintf(stderr,"OpenTable: could not find %s\n", fulname);#ifdef UNIX          if(envdir != NULL)			fprintf(stderr,"Check %s directory '%s'\n",MPEGTABENV, envdir);          else            fprintf(stderr,"Check local directory './%s' or setenv %s\n",                    TABLES_PATH, MPEGTABENV);#else /* not unix : no environment variables */#ifdef TABLES_PATH            fprintf(stderr,"Check local directory './%s'\n",TABLES_PATH);#endif /* TABLES_PATH */#endif /* UNIX */    }    return f;}/***********************************************************************/*/* Read one of the data files ("alloc_*") specifying the bit allocation//* quatization parameters for each subband in layer II encoding/*/**********************************************************************//* read in table, return # subbands */int read_bit_alloc(int table, al_table *alloc)  {        long a, b, c, d, i, j;		FILE *fp;        char name[16], t[80];        int sblim;        strcpy(name, "alloc_0");		switch (table) {                case 0 : name[6] = '0';         break;                case 1 : name[6] = '1';         break;                case 2 : name[6] = '2';         break;                case 3 : name[6] = '3';         break;                case 4 : name[6] = '4';         break; /* for MultiLingual-LSF , WtK 7/8/95 */                default : name[6] = '0';		}        if (!(fp = OpenTableFile(name))) {                fprintf (stderr, "Please check bit allocation table %s\n", name);                exit (1);        }#ifdef	PrintBitDebug	printf("using bit allocation table %s\n", name);#endif        fgets(t, 80, fp);        sscanf(t, "%d\n", &sblim);        while (!feof(fp)) {				fgets(t, 80, fp);                sscanf(t, "%ld %ld %ld %ld %ld %ld\n", &i, &j, &a, &b, &c, &d);						(*alloc)[i][j].steps = a;                        (*alloc)[i][j].bits  = b;                        (*alloc)[i][j].group = c;                        (*alloc)[i][j].quant = d;        }        fclose(fp);		return sblim;}/***********************************************************************/*/* Using the decoded info the appropriate possible quantization per/* subband table is loaded/*/**********************************************************************//* choose table, load if necess, return # sb's */int pick_table (frame_params *fr_ps)   {   int table, tableml, lay, ws, bsp, br_per_ch, sfrq;   int sblim = fr_ps->sblimit;     /* return current value if no load */   lay = fr_ps->header->lay - 1;   bsp = fr_ps->header->bitrate_index;   /* BUG corrected SWKim060695 */   br_per_ch = bitrate[lay][bsp] / (fr_ps->stereo /* + fr_ps->mc_channel*/);   ws = fr_ps->header->sampling_frequency;   sfrq = s_freq[ws];   /* decision rules refer to per-channel bitrates (kbits/sec/chan) */   if ((sfrq == 48 && br_per_ch >= 56) ||       (br_per_ch >= 56 && br_per_ch <= 80)) table = 0;   else if (sfrq != 48 && br_per_ch >= 96) table = 1;   else if (sfrq != 32 && br_per_ch <= 48) table = 2;   else table = 3;   if (fr_ps->tab_num != table)   {      if (fr_ps->tab_num >= 0)        mem_free ((void **) &(fr_ps->alloc));      fr_ps->alloc = (al_table *) mem_alloc (sizeof(al_table), "alloc");      sblim = read_bit_alloc (fr_ps->tab_num = table, fr_ps->alloc);   }   return sblim;}/* choose MC and ML tables, load if necess, return # sb's */void mc_pick_table (frame_params *fr_ps)   {   int tablemc, tableml, ws, sfrq;   /* BUG corrected SWKim060695 */   ws = fr_ps->header->sampling_frequency;   sfrq = s_freq[ws];   /* decision rules refer to sampling frequency */   if (sfrq == 48)      tablemc = 0;   else      tablemc = 1;   if (fr_ps->tab_num_mc != tablemc)   {      if (fr_ps->tab_num >= 0)	 mem_free ((void **)& (fr_ps->alloc_mc));      fr_ps->alloc_mc = (al_table *) mem_alloc (sizeof(al_table), "alloc_mc");      fr_ps->sblimit_mc = read_bit_alloc (fr_ps->tab_num_mc = tablemc, fr_ps->alloc_mc);   }   if (fr_ps->header->no_of_multi_lingual_ch > 0)   {      /* LSF MultiLingual 7/8/95 WtK */      if (fr_ps->header->multi_lingual_fs == 0)      {	 fr_ps->tab_num_ml = fr_ps->tab_num_mc;	 fr_ps->alloc_ml   = fr_ps->alloc_mc;	 fr_ps->sblimit_ml = fr_ps->sblimit_mc;      }      else      {	 tableml = 4;	 if (fr_ps->tab_num_ml != tableml)	 {	    if (fr_ps->tab_num_ml >= 0)	       mem_free ((void **)&(fr_ps->alloc_ml));	    fr_ps->alloc_ml = (al_table *) mem_alloc (sizeof(al_table), "alloc_ml");	    fr_ps->sblimit_ml = read_bit_alloc (fr_ps->tab_num_ml = tableml, fr_ps->alloc_ml);	 }      } /* ml_fs==0 */   } /* ml_ch>0 */}int js_bound(int lay, int m_ext){static int jsb_table[3][4] =  { { 4, 8, 12, 16 }, { 4, 8, 12, 16},								{ 0, 4, 8, 16} };  /* lay+m_e -> jsbound */    if(lay<1 || lay >3 || m_ext<0 || m_ext>3) {        fprintf (stderr, "js_bound bad layer/modext (%d/%d)\n", lay, m_ext);        exit (1);    }    return(jsb_table[lay-1][m_ext]);}/* interpret data in hdr str to fields in fr_ps */void hdr_to_frps (frame_params *fr_ps){	layer *hdr = fr_ps->header;     /* (or pass in as arg?) */	fr_ps->actual_mode = hdr->mode;	if (hdr->mode != MPG_MD_NONE)		fr_ps->stereo = (hdr->mode == MPG_MD_MONO) ? 1 : 2;	else		fr_ps->stereo = 0;	Bitrate = bitrate[hdr->lay-1][hdr->bitrate_index];	S_freq = s_freq[hdr->sampling_frequency];		if (hdr->lay == 2)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?