📄 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -