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

📄 musicin.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 5 页
字号:
/**********************************************************************
 * ISO MPEG Audio Subgroup Software Simulation Group (1996)
 * ISO 13818-3 MPEG-2 Audio Multichannel Encoder
 *
 * $Id: musicin.c 1.9 1996/02/12 07:13:35 rowlands Exp $
 *
 * $Log: musicin.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:57:11  tenkate
 * ML-LSF added Warner ten Kate 7/8/95 (Philips)
 * debugging (whole packet)
 * obtain_params() and parse_args() cleaned up.
 * get_audio_ml() and Psycho_one_ml() only add odd frames upon LSF-ML.
 * II_smr() is called separately because of that.
 * sample shifting is added because of that.
 *
 * Revision 1.7  1995/07/31  07:49:58  tenkate
 * addition of phantom coding, at sevral lines, 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.4  1995/06/16  02:49:33  rowlands
 * Added dematrix procedure 2
 *
 * Added support for dematrix procedure 2, without predistortion yet.
 * Calculated the compatible stereo signal subband samples by
 * transforming the compatible signal used for the psychoacoustics,
 * instead of recalculating in the subband domain from the other
 * channels.
 *
 **********************************************************************/

/**********************************************************************
 *   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            *
 *                              removed extraneous variables          *
 * 3/21/91  J.Georges Fritsch   introduction of the bit-stream        *
 *                              package. This package allows you      *
 *                              to generate the bit-stream in a       *
 *                              binary or ascii format                *
 * 3/31/91  Bill Aspromonte     replaced the read of the SB matrix    *
 *                              by an "code generated" one            *
 * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         *
 *                              Incorporated Jean-Georges Fritsch's   *
 *                              "bitstream.c" package.                *
 *                              Modified to strictly adhere to        *
 *                              encoded bitstream specs, including    *
 *                              "Berlin changes".                     *
 *                              Modified user interface dialog & code *
 *                              to accept any input & output          *
 *                              filenames desired.  Also added        *
 *                              de-emphasis prompt and final bail-out *
 *                              opportunity before encoding.          *
 *                              Added AIFF PCM sound file reading     *
 *                              capability.                           *
 *                              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.           *
 * 27jun91  dpwe (Aware Inc)    Used new frame_params struct.         *
 *                              Clear all automatic arrays.           *
 *                              Changed some variable names,          *
 *                              simplified some code.                 *
 *                              Track number of bits actually sent.   *
 *                              Fixed padding slot, stereo bitrate    *
 *                              Added joint-stereo : scales L+R.      *
 * 6/12/91  Earle Jennings      added fix for MS_DOS in obtain_param  *
 * 6/13/91  Earle Jennings      added stack length adjustment before  *
 *                              main for MS_DOS                       *
 * 7/10/91  Earle Jennings      conversion of all float to FLOAT      *
 *                              port to MsDos from MacIntosh completed*
 * 8/ 8/91  Jens Spille         Change for MS-C6.00                   *
 * 8/22/91  Jens Spille         new obtain_parameters()               *
 *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        *
 *                              I_CRC_calc, II_CRC_calc and encode_CRC*
 *                              Additions and revisions are marked    *
 *                              with "dhl" for clarity                *
 *11/11/91 Katherine Wang       Documentation of code.                *
 *                                (variables in documentation are     *
 *                                surround by the # symbol, and an '*'*
 *                                denotes layer I or II versions)     *
 * 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.  *
 * 2/25/92  Masahiro Iwadare    made code cleaner and more consistent *
 *10 jul 92 Susanne Ritscher    Bug fix in main, scale factor calc.   *
 * 5 aug 92 Soren H. Nielsen    Printout of bit allocation.           *
 *19 aug 92 Soren H. Nielsen	Changed MS-DOS file name extensions.  *
 * 2 dec 92 Susanne Ritscher	Start of changes to multi-channel with*
 *                                                  several options   *										 *
 **********************************************************************
 *                                                                    *
 *                                                                    *
 *  MPEG/audio Phase 2 coding/decoding multichannel                   *
 *                                                                    *
 *                                                                    *
 *  7/27/93        Susanne Ritscher,  IRT Munich                      *
 *                                                                    *
 *	                                                              *
 *  8/13/93        implemented channel-switching by changing          *
 *                 a lot in encode.c                                  *
 *                                                                    *
 *  8/27/93        Susanne Ritscher, IRT Munich                       *
 *                 Channel-Switching is working                       *
 *  9/1/93         Susanne Ritscher,  IRT Munich                      *
 *                 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        try get all the rubbish out!                       *
 *                                                                    *
 *                                                                    *
 *  Version 1.0                                                       *
 *                                                                    *
 *  07/12/94       Susanne Ritscher,  IRT Munich                      *
 *                                                                    *
 *  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                                *
 *                                                                    *
 **********************************************************************/
#ifdef MS_DOS
#include <dos.h>
#endif
#include "common.h"
#include "encoder.h"
#include <math.h>

/* Global variable definitions for "musicin.c" */

FILE               *musicin;
FILE               *musicin_ml;	/* 08/03/1995 JMZ Multilingual */
Bit_stream_struc   bs;
Bit_stream_struc   bs_ext;
Bit_stream_struc   bs_mpg;
char               *programName;
int		   mesg_index=0; /* YBKim060695 ancillary */
int		   verbosity;

char multilingual_file_name[MAX_NAME_SIZE];	/* 08/03/1995 JMZ Multilingual */

/* Implementations */

/************************************************************************
/*
/* obtain_parameters
/*
/* PURPOSE:  Prompts for and reads user input for encoding parameters
/*
/* SEMANTICS:  The parameters read are:
/* - input and output filenames
/* - sampling frequency (if AIFF file, will read from the AIFF file header)
/* - layer number
/* - mode (stereo, joint stereo, dual channel or mono)
/* - psychoacoustic model (I or II)
/* - total bitrate, irrespective of the mode
/* - de-emphasis, error protection, copyright and original or copy flags
/*
/************************************************************************/

void
obtain_parameters (
	frame_params *fr_ps,
	int *psy,
	long unsigned int *num_samples,
	long unsigned int *num_samples_ml,
	char *original_file_name,
	char *encoded_file_name,
	IFF_AIFF *pcm_aiff_data,
	IFF_AIFF *pcm_aiff_data_ml,
	int *aiff,
	int *byte_per_sample,
	int *mat_mode,
	int *aug_mat_mode,
	int *cha_sw,
	int *aug_cha_sw,
	char *encoded_file_name_ext,
	int *bit_rate,
	char *encoded_file_name_mpg,
	int *dyn_cr,
	int *dyn_cr_LR,
	int *aug_dyn_cr,
	int *ancillaryUse,
	int *verbosity)
{
    int j, bool, max_rate, max_rate_index;
    long int i;
    int tot_channels = 0;		/* 21/03/1995 JMZ Multimode */ 
    char configuration[50];	/* 21/03/1995 JMZ Multimode */
    char t[50];

    layer *info = fr_ps->header;

    *aiff = 0;	 /* flag for AIFF-Soundfile*/
	 
    do
    {
       printf ("Enter PCM input file name <required>: ");
       gets (original_file_name);
       if (original_file_name[0] == NULL_CHAR)
       printf ("PCM input file name is required.\n");
    } while (original_file_name[0] == NULL_CHAR);

    printf(">>> PCM input file name is: %s\n", original_file_name);
 
    if ((musicin = fopen (original_file_name, "rb")) == NULL)
    {
       printf ("Could not find \"%s\".\n", original_file_name);
       exit (1);
    }

/***************************************************************************/
/* 08/03/1995 Multi lingual extension JMZ                                  */

    printf ("Do you have multi lingual channels? (Y)es, (<N>)o: ");
    gets (multilingual_file_name);
    if ((*multilingual_file_name == 'Y') || (multilingual_file_name[0] == 'y'))
    {
	printf ("Enter multilingual input file name <%s.%s>: ", original_file_name, DFLT_ML_EXT);
	gets (multilingual_file_name);
	if (multilingual_file_name[0] == NULL_CHAR)
	{
	    printf ("Null char\n");
	    strcat (strcpy (multilingual_file_name, original_file_name), DFLT_ML_EXT);
	}
	if ((musicin_ml = fopen (multilingual_file_name, "rb")) == NULL) 
	{
	    printf ("Could not find \"%s\".\n", multilingual_file_name);
	    exit (1);
	}

	/*remplir fr_ps il y a au moins un multilingual*/
	if (aiff_read_headers (musicin_ml, pcm_aiff_data_ml, byte_per_sample) == 0) 
	{
	    printf (">>> Using Audio IFF multilingual file headers\n");
	    info->multiling_ch = pcm_aiff_data_ml->numChannels;
	    printf (">>> Using %d multilingual channels\n",info->multiling_ch);
	    *num_samples_ml = pcm_aiff_data_ml->numChannels *
			      pcm_aiff_data_ml->numSampleFrames;
	}
	else     /* Not using Audio IFF sound file headers. */
	{
	    printf ("***WARNING: Could not read AIFF header - No MultiLingual coding!!\n");
	    info->multiling_ch = 0;
	}
    }
    else
    {
	printf ("no multi lingual coding!!\n");
	info->multiling_ch = 0;
    }

/* 08/03/1995 Multi lingual extension JMZ                                  */
/***************************************************************************/
	
    printf("Enter MPEG encoded output file name <%s%s>: ",
		original_file_name, DFLT_EXT);

    gets (encoded_file_name);

    if (encoded_file_name[0] == NULL_CHAR)
    {
	strcat (strcpy (encoded_file_name_ext, original_file_name), DFLT_EXT_EXT);
	strcat (strcpy (encoded_file_name, original_file_name), DFLT_EXT);
	strcat (strcpy (encoded_file_name_mpg, encoded_file_name), DFLT_EXT);
    }
    else
    {
	strcat (strcpy (encoded_file_name_ext, encoded_file_name), DFLT_EXT_EXT);
	strcat (encoded_file_name, DFLT_EXT);
	strcat (strcpy (encoded_file_name_mpg, encoded_file_name), DFLT_EXT);
    }
    printf(">>> MPEG encoded output file name is: %s\n", encoded_file_name);
 
    open_bit_stream_w (&bs, encoded_file_name, BUFFER_SIZE);
 
    if (aiff_read_headers (musicin, pcm_aiff_data, byte_per_sample) == 0)
    {

	*aiff = 1;
	printf(">>> Using Audio IFF sound file headers\n");

/**********************************************************/
/* 21/03/1995 JMZ Multimode */

	tot_channels = pcm_aiff_data->numChannels;
	printf (">>> Using %d audio channels\n", tot_channels);

	/********* 27/01/97, FdB, select LFE ********************/
	if (tot_channels > 1)
	{
	    printf ("Do you want to use LFE coding? (y/<n>) ");
	    gets (t);
	    if ((*t == 'y') || (*t == 'Y'))
	    {
		printf (">>> LFE coding is used.\n");
		info->lfe = 1;
	    } 
	    else
	    {
		printf (">>> No LFE coding.\n");	 
		info->lfe = 0;
	    }
        }

#ifdef Augmentation_7ch
	if (tot_channels - info->lfe == 7) 
	{
	    if (info->multiling_ch > 0)
	    {
		printf ("7.1 channel augmentation and multilingual cannot be combined\n");
		exit (1);
	    }
	    fr_ps->stereomc = 3;
	    fr_ps->stereoaug = 2;
	    fr_ps->lfe_pos = 3;
	    info->center = 1; 
	    info->surround = 2; 
	    fr_ps->config = 320;
	    printf (">>> Using 5/2 configuration.\n"); 
	}
	else
#endif
	if (tot_channels - info->lfe == 5) 
	{
	    fr_ps->stereomc = 3;
	    fr_ps->stereoaug = 0;
	    fr_ps->lfe_pos = 3;
	    printf ("Which configuration do you want to use?\n");
	    printf ("Available: 3/2 (<1>), 3/0 + 2/0 (2): ");
	    gets (configuration);
	    switch (*configuration)
    	    {
	    case '1': 
		    info->center = 1; 
		    info->surround = 2; 
		    fr_ps->config = 320;
		    printf (">>> Using 3/2 configuration.\n"); 
		    break;
	    case '2': 
		    info->center = 1; 
		    info->surround = 3; 
		    fr_ps->config = 302;
		    printf (">>> Using 3/0 + 2/0 configuration.\n"); 
		    break;
	    default:  
		    info->center = 1; 
		    info->surround = 2; 

⌨️ 快捷键说明

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