?? common.c
字號:
/********************************************************************** * 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)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -