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

📄 encode.c

📁 ISO mp3 sources (distribution 10) Layer 1/2/3, C Source, 512 k Sources of the Mpeg 1,2 layer 1,2
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************************************************************** * ISO MPEG Audio Subgroup Software Simulation Group (1996) * ISO 13818-3 MPEG-2 Audio Multichannel Encoder * * $Id: encode.c 1.9 1996/02/12 07:13:35 rowlands Exp $ * * $Log: encode.c $ * Revision 1.9  1996/02/12 07:13:35  rowlands * Release following Munich meeting * * Revision 1.6.2.1  1995/11/06  04:19:12  rowlands * Received from Uwe Felderhoff (IRT) * * Revision 1.8  1995/08/14  07:53:28  tenkate * ML-LSF added Warner ten Kate 7/8/95 (Philips) * variables "alloc" and "sblimit" changed into "alloc_ml" and * "sblimit_ml" where appropriate. * sample loops adapted to 12 or 6 depending on full or half fs. * II_a_bit_allocation separate summing for ML. * * Revision 1.7  1995/07/31  07:48:55  tenkate * addition of phantom coding, in void matricing(), 25/07/95 WtK * * Revision 1.4.3.1  1995/06/16  08:25:11  rowlands * Input from Sang Wook Kim (Samsung AIT) * * Revision 1.4.2.1  1995/06/16  03:46:42  rowlands * Input from Susanne Ritscher (IRT) * * Revision 1.4.1.6  1995/06/16  02:41:51  rowlands * Added dematrix procedure 2, corrected dematrixing values. * * Added support for dematrix procedure 2, without predistortion. * To implement predistortion will require a delay in the encoder * to be able to calculate the predistorted filtered surround signal * subband samples. * * Modified procedure matricing() to reuse the compatible stereo * channel signals computed by matricing_fft(). This was needed to * avoid calculating the low-pass-filtered surround signal in the * subband domain. The main function of procedure matricing() now * is to weight the multichannels. These channels are unweighted * prior to this for the benefit of the psycho model. * * Corrected weighting values for dematrixing procedures. * Deleted matrixing on multilingual channels. * In the quantization procedures, made quantizing to zero bits * a special case to skip some operations on undefined values. * **********************************************************************//********************************************************************** *   date   programmers         comment                               * * 3/01/91  Douglas Wong,       start of version 1.1 records          * *          Davis Pan                                                 * * 3/06/91  Douglas Wong        rename: setup.h to endef.h            * *                                      efilter to enfilter           * *                                      ewindow to enwindow           * *                              integrated "quantizer", "scalefactor",* *                              and "transmission" files              * *                              update routine "window_subband"       * * 3/31/91  Bill Aspromonte     replaced read_filter by               * *                              create_an_filter                      * * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         * *                              Incorporated Jean-Georges Fritsch's   * *                              "bitstream.c" package.                * *                              Incorporated Bill Aspromonte's        * *                              filterbank coefficient matrix         * *                              calculation routines and added        * *                              roundoff to coincide with specs.      * *                              Modified to strictly adhere to        * *                              encoded bitstream specs, including    * *                              "Berlin changes".                     * *                              Modified PCM sound file handling to   * *                              process all incoming samples and fill * *                              out last encoded frame with zeros     * *                              (silence) if needed.                  * *                              Located and fixed numerous software   * *                              bugs and table data errors.           * * 19jun91  dpwe (Aware)        moved "alloc_*" reader to common.c    * *                              Globals sblimit, alloc replaced by new* *                              struct 'frame_params' passed as arg.  * *                              Added JOINT STEREO coding, layers I,II* *                              Affects: *_bit_allocation,            * *                              subband_quantization, encode_bit_alloc* *                              sample_encoding                       * * 6/10/91  Earle Jennings      modified II_subband_quantization to   * *                              resolve type cast problem for MS_DOS  * * 6/11/91  Earle Jennings      modified to avoid overflow on MS_DOS  * *                              in routine filter_subband             * * 7/10/91  Earle Jennings      port to MsDos from MacIntosh version  * * 8/ 8/91  Jens Spille         Change for MS-C6.00                   * *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 function encode_CRC  * *11/ 8/91  Kathy Wang          Documentation of code                 * *                              All variablenames are referred to     * *                              with surrounding pound (#) signs      * * 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.  * * 92-08-11 Soren H. Nielsen    Fixed bug: allocation of space in the * *                              bitstream for the CRC-word. Fixed     * *                              reading of window from file.          * * 92-11-06 Soren H. Nielsen	Fixed scalefactor calculation.        * ********************************************************************** *                                                                    * *                                                                    * *  MPEG/audio Phase 2 coding/decoding multichannel                   * *                                                                    * *  7/27/93        Susanne Ritscher,  IRT Munich                      * *  8/10/93        changed matricing to 7 channels                    * *	           added void matricing_fft                           * *  8/12/93        added int required_bits,                           * *                       int max_alloc                                * *                 implemented the new mc_header (third working draft)* *  8/13/93        added channel-switching in required_bits and       * *                 II_subband_quantisation, II_encode_scale,          * *                 II_encode_bit_alloc, II_encode_sample,             * *                 encode_info                                        * *                 all channels normalized                            * *  9/20/93        channel-switching is only performed at a           * *                 certain limit of TC_ALLOC dB, which is included    * *                 in encoder.h                                       * *  1/04/94        get out some rubbish                               * *                                                                    * * 01/05/94        implemented the Committee Draft header             * *                                                                    * * 01/12/94        changed matricing procedure according to           * *                 Committee Draft                                    * *                                                                    * *  Version 1.0                                                       * *                                                                    * *  07/12/94       Susanne Ritscher,  IRT Munich                      * *                 Tel: +49 89 32399 458                              * *                 Fax: +49 89 32399 415                              * *                                                                    * *  Version 1.1                                                       * *                                                                    * *  02/23/95	   Susanne Ritscher,  IRT Munich                      * *                 corrected some bugs                                * *                 extension bitstream is working                     * *                                                                    * *  Version 2.0                                                       * *                                                                    * *  01/28/97       Frans de Bont, Philips Sound & Vision, Eindhoven   * *		    - dynamic crosstalk working for all configurations* *		    - prediction working for all configurations	      * *		    - extension bitstream fixed			      * *		    - fully compliant to DIS 13818-3.2                * *                                                                    *				      *		     **********************************************************************//********************************************************************** *                                                                    * *  06/06/95       Yeon Bae Thomas Kim, Samsung AIT                   * *                 ancillary data is working                          * *                                                                    * *  06/06/95       Sang Wook Kim, Samsung AIT                         * *                 corrected some bugs                                * *                                                                    * **********************************************************************/#define VERY_FAST_FILTER  1	/* JMZ 08/03/1995 FILTER */#include "common.h"#include "encoder.h" /*=======================================================================\|                                                                       || This segment contains all the core routines of the encoder,           || except for the psychoacoustic models.                                 ||                                                                       || The user can select either one of the two psychoacoustic              || models. Model I is a simple tonal and noise masking threshold         || generator, and Model II is a more sophisticated cochlear masking      || threshold generator. Model I is recommended for lower complexity      || applications whereas Model II gives better subjective quality at low  || bit rates.                                                            ||                                                                       || Layers I and II of mono, stereo, and joint stereo modes are supported.|| Routines associated with a given layer are prefixed by "I_" for layer || 1 and "II_" for layer 2.                                              |\=======================================================================*/ /************************************************************************//*/* read_samples()/*/* PURPOSE:  reads the PCM samples from a file to the buffer/*/*  SEMANTICS:/* Reads #samples_read# number of shorts from #musicin# filepointer/* into #sample_buffer[]#.  Returns the number of samples read./*/************************************************************************/unsigned long read_samples(FILE *musicin, long int *sample_buffer, long unsigned int num_samples, long unsigned int frame_size, int *byte_per_sample, int *aiff){unsigned long samples_read;static unsigned long samples_to_read;static char init = TRUE;short pcm_sample_buffer[9216];        /*for correct reading of pcm-data*/int i;   if (init) {        samples_to_read = num_samples;        init = FALSE;   }   if (samples_to_read >= frame_size)        samples_read = frame_size;   else		  samples_read = samples_to_read;	if((*aiff==1) &&(*byte_per_sample !=2)){	             if ((samples_read =		  fread(sample_buffer, *byte_per_sample, (int)samples_read, musicin)) == 0)		  if (verbosity >= 2) printf("Hit end of audio data\n");	   	}	else{	 if ((samples_read =		  fread(pcm_sample_buffer, sizeof(short), (int)samples_read, musicin)) == 0)		  if (verbosity >= 2) printf("Hit end of audio data\n");            for(i = 0; i < 9216; ++i) sample_buffer[i] = pcm_sample_buffer[i];        }   samples_to_read -= samples_read;   if (samples_read < frame_size && samples_read > 0) {        if (verbosity >= 2) printf("Insufficient PCM input for one frame - fillout with zeros\n");        for (; samples_read < frame_size; sample_buffer[samples_read++] = 0);        samples_to_read = 0;   }   return(samples_read);}/************************************************************************//*/* get_audio()/*/* PURPOSE:  reads a frame of audio data from a file to the buffer,/*   aligns the data for future processing, and separates the/*   left and right channels/*/*  SEMANTICS:/* Calls read_samples() to read a frame of audio data from filepointer/* #musicin# to #insampl[]#.  The data is shifted to make sure the data/* is centered for the 1024pt window to be used by the psychoacoustic model,/* and to compensate for the 256 sample delay from the filter bank. For/* stereo, the channels are also demultiplexed into #buffer[0][]# and/* #buffer[1][]#/*/* 21/03/1995 JMZ Multimode adaptations/************************************************************************/ unsigned longget_audio (	FILE *musicin,	double (*buffer)[1152],	long unsigned int num_samples,	int stereo,	IFF_AIFF *aiff_ptr,	int stereomc,	int stereoaug,	frame_params *fr_ps,	int *aiff,	int *byte_per_sample,	double (*buffer_matr)[1152]){    int k, j, i;    long insamp[9216];    unsigned long samples_read;    int lay;    int lfe;    layer *info = fr_ps->header;        lay = info->lay;    lfe = info->lfe;    if (lay == 1)    {	if (stereo == 2)	{ /* layer 1, stereo */	    samples_read = read_samples (musicin, insamp, num_samples,				         (unsigned long) 768, byte_per_sample, aiff);	    for (j = 0; j < 448; j++) 	    {		if (j<64) 		{		    buffer[0][j] = buffer[0][j+384];		    buffer[1][j] = buffer[1][j+384];		    buffer[2][j] = 0;		    buffer[3][j] = 0;		    buffer[4][j] = 0;		}		else 		{		    buffer[0][j] = insamp[2*j-128];		    buffer[1][j] = insamp[2*j-127];		    buffer[2][j] = 0;		    buffer[3][j] = 0;		    buffer[4][j] = 0;		}	    }	}	else 	{ /* layer 1, mono */	    samples_read = read_samples (musicin, insamp, num_samples,				         (unsigned long) 384, byte_per_sample, aiff);	    for (j = 0; j < 448; j++)	    {		if (j < 64) 		{		    buffer[0][j] = buffer[0][j+384];		    buffer[1][j] = 0;		    buffer[2][j] = 0;		    buffer[3][j] = 0;		    buffer[4][j] = 0;		}		else 		{		    buffer[0][j] = insamp[j-64];		    buffer[1][j] = 0;		    buffer[2][j] = 0;		    buffer[3][j] = 0;		    buffer[4][j] = 0;		}	    }	}    }    else     {	if (*aiff == 1)	{	    k = aiff_ptr->numChannels;	    samples_read = read_samples (musicin, insamp, num_samples,					     (unsigned long) (k * 1152), byte_per_sample, aiff);	    for (i = 0; i < k; i++)		for (j = 0; j < 1152; j++)		    buffer[i][j] = insamp[k*j+i];	}	else 	{  /* layerII, stereo */	    if (stereo == 2)	    {		samples_read = read_samples (musicin, insamp, num_samples,			(unsigned long) ((2+lfe)*1152), byte_per_sample, aiff);		for (j = 0; j < 1152; j++)		{ /* fixed bug 28.6.93 S.R. */		    buffer[0][j] = insamp[(2+lfe)*j];		    buffer[1][j] = insamp[(2+lfe)*j+1];		    buffer[2][j] = 0;		    buffer[3+lfe][j] = 0;		    buffer[4+lfe][j] = 0;		    if (lfe)		        buffer[3][j] = insamp[(2+lfe)*j+2]; /* ########### */		}	    }	    else	    { /* layer 2 (or 3), mono */		samples_read = read_samples (musicin, insamp, num_samples,			(unsigned long) 1152, byte_per_sample, aiff);		for (j = 0; j < 1152; j++)		{		    buffer[0][j] = insamp[j];		    buffer[1][j] = 0;		    buffer[2][j] = 0;		    buffer[3][j] = 0;		    buffer[4][j] = 0;		}        	    }	}    }    /*     * If LFE is not enabled, "buffer" contains:     *	buffer[0]	L     *	buffer[1]	R     *	buffer[2]	C     *	buffer[3]	Ls     *	buffer[4]	Rs#ifdef Augmentation_7ch     *  optional in 7.1 channel augmentation mode     *	buffer[5]	Lc     *	buffer[6]	Rc#endif     *     * If LFE is enabled, "buffer" contains:     *	buffer[0]	L     *	buffer[1]	R     *	buffer[2]	C     *	buffer[3]	LFE     *	buffer[4]	Ls     *	buffer[5]	Rs#ifdef Augmentation_7ch     *  optional in 7.1 channel augmentation mode     *	buffer[6]	Lc     *	buffer[7]	Rc#endif     */#ifdef Augmentation_7ch    if (stereoaug == 2)    	matricing_aug_fft (buffer, buffer_matr, fr_ps);    else#endif	matricing_fft (buffer, buffer_matr, fr_ps);    /*     * After matrixing, "buffer_matr" contains:     *	buffer_matr[0]	Lo     *	buffer_matr[1]	Ro     *	buffer_matr[2]	C     *	buffer_matr[3]	Ls     *	buffer_matr[4]	Rs     *	buffer_matr[5]	L     *	buffer_matr[6]	R#ifdef Augmentation_7ch     *  optional in 7.1 channel augmentation mode     *	buffer_matr[7]	L7     *	buffer_matr[8]	R7     *	buffer_matr[9]	C7     *	buffer_matr[10]	Lc     *	buffer_matr[11]	Rc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -