⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 5 页
字号:
/**********************************************************************
 * 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 + -