📄 decode.c
字号:
/**********************************************************************
* ISO MPEG Audio Subgroup Software Simulation Group (1996)
* ISO 13818-3 MPEG-2 Audio Multichannel Decoder
*
* $Id: decode.c 1.12 1997/01/17 04:26:01 rowlands Exp $
*
* $Log: decode.c $
* Revision 1.12 1997/01/17 04:26:01 rowlands
* Fixed base bitstream joint stereo bugs.
* Fixed PCM output file cleanup bugs.
*
* Revision 1.11 1996/04/18 05:37:23 rowlands
* Release following Florence meeting
*
* Revision 1.10 1996/02/12 07:13:06 rowlands
* Release following Munich meeting
*
* Revision 1.9.1.4 1996/01/29 03:36:47 rowlands
* Fixed problem with dynamic crosstalk in 2/2 configuration
* Fixed bug in dynamic crosstalk for 3/1 configuration.
*
* Revision 1.9.1.1 1996/01/20 17:28:45 rowlands
* Received from Ralf Schwalbe (Telekom FTZ) - includes prediction
*
* Revision 1.7.1.3 1995/08/14 08:12:10 tenkate
* ML-LSF added Warner ten Kate 7/8/95 (Philips)
* change "alloc" and "sblimit" into "alloc_ml" and
* "sblimit_ml" where appropriate.
*
* Revision 1.7.1.1 1995/07/14 06:12:46 rowlands
* Updated dynamic crosstalk from FTZ: revision FTZ_03
*
* Revision 1.3.3.1 1995/06/16 08:00:46 rowlands
* Input from Sang Wook Kim (Samsung AIT)
*
* Revision 1.3.2.1 1995/06/16 03:27:20 rowlands
* Corrected prediction select syntax according to IS
* Added dematrixing procedure 2. Corrected dematrix weighting values.
*
**********************************************************************/
/**********************************************************************
* 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 Yeon Bae Thomas Kim, Samsung AIT *
* ancillary data is working *
* *
**********************************************************************/
/*********************************************************************/
#include "common.h"
#include "decoder.h"
/***************************************************************
/*
/* This module contains the core of the decoder ie all the
/* computational routines. (Layer I and II only)
/* Functions are common to both layer unless
/* otherwise specified.
/*
/***************************************************************/
/*****************************************************************
/*
/* The following routines decode the system information
/*
/****************************************************************/
/************************* Layer II ****************************/
void decode_info(Bit_stream *bs,
frame_params *fr_ps)
{
layer *hdr = fr_ps->header;
hdr->version = get1bit (bs);
hdr->lay = 4 - getbits (bs, 2);
hdr->error_protection = !get1bit (bs); /* error protect. TRUE/FALSE */
hdr->bitrate_index = getbits (bs, 4);
hdr->sampling_frequency = getbits (bs, 2);
hdr->padding = get1bit (bs);
hdr->extension = get1bit (bs);
hdr->mode = getbits (bs, 2);
hdr->mode_ext = getbits (bs, 2);
hdr->copyright = get1bit (bs);
hdr->original = get1bit (bs);
hdr->emphasis = getbits (bs, 2);
}
/**********************************************************************/
/* */
/* 7.7.93 Susanne Ritscher Systeminformation for multi-channel */
/* 27.5.94 Ralf Schwalbe Systeminformation and names due to */
/* MPEG 2 DIS from March 1994 */
/* */
/**********************************************************************/
void mc_header(Bit_stream *bs,
frame_params *fr_ps)
{
layer *hdr = fr_ps->header;
hdr->ext_bit_stream_present = get1bit (bs);
if( hdr->ext_bit_stream_present == 1)
hdr->n_ad_bytes = getbits (bs, 8);
hdr->center = getbits (bs, 2);
hdr->surround = getbits (bs, 2);
hdr->lfe = get1bit (bs);
hdr->audio_mix = get1bit (bs); /* large or small room R.S. */
hdr->dematrix_procedure = getbits (bs, 2);
hdr->no_of_multi_lingual_ch = getbits (bs, 3);
hdr->multi_lingual_fs = get1bit (bs);
hdr->multi_lingual_layer = get1bit (bs);
hdr->copyright_ident_bit = get1bit (bs);
hdr->copyright_ident_start = get1bit (bs);
}
/* R.S. prediction table MPEG-2 IS November, 1995 */
/* FdB prediction table MPEG-2 CD 13818-3.2 March, 1996 */
int pred_coef_table[6][16] = {{6,4,4,4,2,2,2,0,2,2,2,0,0,0,0,0},
{4,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{4,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
void mc_composite_status_info(Bit_stream *bs,
frame_params *fr_ps, int tca_log, int dynx_log)
{
layer *hdr = fr_ps->header;
int sbgr, j, pci;
hdr->tc_sbgr_select = get1bit (bs);
hdr->dyn_cross_on = get1bit (bs);
hdr->mc_prediction_on = get1bit (bs);
if(hdr->tc_sbgr_select == 1)
{
hdr->tc_allocation = getbits (bs, fr_ps->alloc_bits);
/* tc_allocation is valid for all sbgr R.S. */
for(sbgr = 0; sbgr < 12; sbgr++)
hdr->tc_alloc[sbgr] = hdr->tc_allocation;
}
else
{
hdr->tc_allocation = 0;
for(sbgr = 0; sbgr < 12; sbgr++)
hdr->tc_alloc[sbgr] = getbits (bs, fr_ps->alloc_bits);
}
if (tca_log)
for (sbgr = 0; sbgr < 12; sbgr++)
printf ("tc_alloc[ %2d ] = %2d\n", sbgr, hdr->tc_alloc[sbgr]);
if( hdr->dyn_cross_on == 1)
{
hdr->dyn_cross_LR = get1bit (bs);
for(sbgr = 0; sbgr < 12; sbgr++)
{
hdr->dyn_cross_mode[sbgr] = getbits (bs, fr_ps->dyn_cross_bits);
/* 960816 FdB dyn_second_stereo added */
if (hdr->surround == 3)
hdr->dyn_second_stereo[sbgr] = get1bit (bs);
}
}
else
{
hdr->dyn_cross_LR = 0;
for(sbgr = 0; sbgr < 12; sbgr++)
hdr->dyn_cross_mode[sbgr] = 0;
}
if (dynx_log)
for (sbgr = 0; sbgr < 12; sbgr++)
printf ("dynx_mod[ %2d ] = %2d\n", sbgr, hdr->dyn_cross_mode[sbgr]);
if( hdr->mc_prediction_on == 1)
{
for(sbgr = 0; sbgr < 8; sbgr++)
{
if( (hdr->mc_prediction[sbgr] = get1bit (bs)) == 1 )
{
/* R.S. read from npredcoef-table max number of coef. for 3/2 configuration */
/* and then the predsi info -> 0 : no prediction */
/* -> 1..3 : 1..3 coefficient */
for(pci=0; pci< pred_coef_table[fr_ps->pred_mode][hdr->dyn_cross_mode[sbgr]] ; pci++)
hdr->mc_predsi[sbgr][pci] = getbits (bs, 2);
}
}
}
}
#ifdef Augmentation_7ch
void mc_aug_composite_status_info (Bit_stream *bs, frame_params *fr_ps, int tca_log, int dynx_log)
{
layer *hdr = fr_ps->header;
int sbgr, j, pci;
hdr->aug_mtx_proc = getbits (bs, 2);
hdr->aug_dyn_cross_on = get1bit (bs);
hdr->aug_future_ext = get1bit (bs);
if(hdr->aug_mtx_proc == 0)
{
for(sbgr = 0; sbgr < 12; sbgr++)
hdr->tc_aug_alloc[sbgr] = getbits (bs, 3);
}
else if(hdr->aug_mtx_proc == 1)
{
for(sbgr = 0; sbgr < 12; sbgr++)
hdr->tc_aug_alloc[sbgr] = getbits (bs, 2);
}
else
for(sbgr = 0; sbgr < 12; sbgr++)
hdr->tc_aug_alloc[sbgr] = 0;
if (tca_log)
for (sbgr = 0; sbgr < 12; sbgr++)
printf ("tc_aug_alloc[ %2d ] = %2d\n", sbgr, hdr->tc_aug_alloc[sbgr]);
if( hdr->aug_dyn_cross_on == 1)
{
for(sbgr = 0; sbgr < 12; sbgr++)
hdr->dyn_cross_aug_mode[sbgr] = getbits (bs, 5);
}
else
for(sbgr = 0; sbgr < 12; sbgr++)
hdr->dyn_cross_aug_mode[sbgr] = 0;
if (dynx_log)
for (sbgr = 0; sbgr < 12; sbgr++)
printf ("dynx_aug_mod[ %2d ] = %2d\n", sbgr, hdr->dyn_cross_aug_mode[sbgr]);
}
#endif
/*******************************************************************
/*
/* The bit allocation information is decoded. Layer I
/* has 4 bit per subband whereas Layer II is Ws and bit rate
/* dependent.
/*
/********************************************************************/
void I_decode_bitalloc (Bit_stream *bs,
frame_params *fr_ps,
unsigned int bit_alloc[7][SBLIMIT],
int bits_log)
{
int i,j;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
int b;
for (i=0;i<jsbound;i++)
for (j=0;j<stereo;j++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -