?? 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_7chvoid 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++) bit_alloc[j][i] = getbits (bs, 4); for (i=jsbound; i<SBLIMIT; i++) { b = getbits (bs, 4); for (j=0; j<stereo; j++) bit_alloc[j][i] = b; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -