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

📄 musicin.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 5 页
字号:
	else if (aiff_read_headers (musicin_ml, pcm_aiff_data_ml, byte_per_sample) == 0) 
	{
	    if (*verbosity >= 2)
		printf (">>> Using Audio IFF multilingual file headers\n");
	    info->multiling_ch = pcm_aiff_data_ml->numChannels;
	    if (*verbosity >= 2)
		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 ML AIFF header - No MultiLingual coding!!\n");
	    info->multiling_ch = 0;
	}

	if (info->multiling_ch > 0)
	{
	    switch (SmpFrqIndex ((long) pcm_aiff_data_ml->sampleRate) - info->sampling_frequency)
	    {
		case 16 :   if (*verbosity >= 2)
				printf ("MultiLingual is LSF coded.\n");
			    info->multiling_fs = 1;
			    break;
		case  0 :   if (*verbosity >= 2)
				printf ("MultiLingual sample rate equals that of Audio.\n");
			    info->multiling_fs = 0;
			    break;
		default :   printf ("***WARNING: MultiLingual sample rate unequals (half) mc sample rate.\n");
       			    printf ("            No MultiLingual coding!!!\n");
			    info->multiling_ch = 0;
			    break;
	    } /*switch*/
	} /*if (ml_ch>0)*/
    }
    else
    {
	info->multiling_ch = 0;
    } /* if (ml_present) */

    /* 7/8/95 Multi lingual extension WtK                                      */
    /***************************************************************************/
}

/************************************************************************
/*
/* print_config
/*
/* PURPOSE:  Prints the encoding parameters used
/*
/************************************************************************/
 
void
print_config (frame_params *fr_ps, int *psy, long unsigned int *num_samples, char *inPath, char *outPath, int *aiff)
{
    layer *info = fr_ps->header;
 
    printf ("Encoding configuration:\n");
    if (*aiff == 1)
	printf ("Layer=%s   mode=%s   extn=%d   psy model=%d\n",
	        layer_names[info->lay-1], mode_names[info->mode],
	        info->mode_ext, *psy);
    else
	printf ("Layer=%s   mode=%s   extn=%d    psy model=%d\n",
	        layer_names[info->lay-1], mode_names[info->mode],
	        info->mode_ext, *psy);

    if (info->bitrate_index != 0)
    {
	if (bitrate[info->lay-1][info->bitrate_index] == 1000)
	    printf ("samp frq=%.1f kHz   total bitrate=dynamic bitrate\n",
		    s_freq[info->sampling_frequency]);
	else
	    printf ("samp frq=%.1f kHz   mpeg1 bitrate=%d kbps\n",
		    s_freq[info->sampling_frequency],
		    bitrate[info->lay-1][info->bitrate_index]);
	if (info->ext_bit_stream_present)
	    printf ("ext bitrate=%d kbps\n", (int) (info->ext_length * s_freq[info->sampling_frequency] / 144));
    }

    if (info->multiling_ch > 0)
    {
        printf ("%d multilingual channels ", info->multiling_ch);
        if (info->multiling_fs == 1)
	    printf ("LSF coded.\n");
        else
	    printf ("full sample rate coded.\n");
    }
    else
	printf ("No multilingual coding.\n");

    printf ("de-emph=%d   c/right=%d   orig=%d   errprot=%d\n",
            info->emphasis, info->copyright, info->original,
            info->error_protection);
    printf ("matrix=%d  center=%d  surround=%d  stereo=%d  stereomc=%d  stereoaug=%d\n",
            info->matrix, info->center, info->surround,
	    fr_ps->stereo, fr_ps->stereomc, fr_ps->stereoaug);
    printf ("input file: '%s'   output file: '%s'\n", inPath, outPath);
    fflush (stdout);
}
 
/************************************************************************
/*
/* main
/*
/* PURPOSE:  MPEG I Encoder supporting layers 1 and 2, and
/* psychoacoustic models 1 (MUSICAM) and 2 (AT&T),now portated
/* to multichannel (two front channels, one center and three surround
/* channels. There are different possibilities to code the AIFF-signal,
/* like coding only the surround channels or the front channels,
/* different bitrates for front and surropund channels etc.
/* dec1992 sr.
/*
/* SEMANTICS:  One overlapping frame of audio of up to 2 channels are
/* processed at a time in the following order:
/* (associated routines are in parentheses)
/*
/* 1.  Filter sliding window of data to get 32 subband
/* samples per channel.
/* (window_subband,filter_subband)
/*
/* 2.  If joint stereo mode, combine left and right channels
/* for subbands above #jsbound#.
/* (*_combine_LR)
/*
/* 3.  Calculate scalefactors for the frame, and if layer 2,
/* also calculate scalefactor select information.
/* (*_scale_factor_calc)
/*
/* 4.  Calculate psychoacoustic masking levels using selected
/* psychoacoustic model.
/* (*_Psycho_One, psycho_anal)
/*
/* 5.  Perform iterative bit allocation for subbands with low
/* mask_to_noise ratios using masking levels from step 4.
/* (*_main_bit_allocation)
/*
/* 6.  If error protection flag is active, add redundancy for
/* error protection.
/* (*_CRC_calc)
/*
/* 7.  Pack bit allocation, scalefactors, and scalefactor select
/* information (layer 2) onto bitstream.
/* (*_encode_bit_alloc,*_encode_scale,II_transmission_pattern)
/*
/* 8.  Quantize subbands and pack them into bitstream
/* (*_subband_quantization, *_sample_encoding)
/*
/************************************************************************/

#ifdef MS_DOS
extern unsigned _stklen = 16384;
#endif

typedef double JSBS[2][3][12][SBLIMIT];
typedef double IN[14][HAN_SIZE];		/* JMZ 08/03/1995 */
typedef unsigned int SUB[14][3][12][SBLIMIT]; /* JMZ 08/03/1995 */
typedef double SAM[12];
typedef unsigned int LSB[12];

main (int argc, char **argv)
{
    double  sb_sample[14][3][12][SBLIMIT];	/* JMZ 08/03/1995 */
    JSBS    *j_sample;
    IN	    *win_que;
    SUB	    *subband;
    SAM	    *lfe_sample;
    LSB	    *lfe_sbband;
 
    frame_params fr_ps;
    layer info;    
    char original_file_name[MAX_NAME_SIZE];
    char encoded_file_name[MAX_NAME_SIZE];
    char encoded_file_name_ext[MAX_NAME_SIZE];
    char encoded_file_name_mpg[MAX_NAME_SIZE];
    double *win_buf[14];				/* JMZ 08/03/1995 */
    static double buffer[14][1152];			/* JMZ 08/03/1995 */			
    double spiki[14][SBLIMIT];				/* JMZ 08/03/1995 */
    static unsigned int bit_alloc[14][SBLIMIT], scfsi[14][SBLIMIT], scfsi_dyn[14][SBLIMIT];						/* JMZ 08/03/1995 */
    static unsigned int scalar[14][3][SBLIMIT], j_scale[2][3][SBLIMIT],  scalar_dyn[14][3][SBLIMIT];
    static double ltmin[14][SBLIMIT], lgmin[14][SBLIMIT], max_sc[14][SBLIMIT], smr[14][SBLIMIT];							/* JMZ 08/03/1995 */

    static unsigned int lfe_alloc;
    static unsigned int lfe_scalar; 

    FLOAT snr32[32];
    short sam[14][1056];					/* JMZ 08/03/1995 */
    double buffer_matr[14][1152];			/* JMZ 08/03/1995 */
    int whole_SpF, extra_slot = 0;
    double avg_slots_per_frame, frac_SpF, slot_lag;
    int model, stereo, error_protection, stereomc, stereoaug;
    static unsigned int crc, crcmc, crcaug, crcext;
    int i, j, k, adb, p, l, m, lfe, s;
    unsigned long bitsPerSlot, samplesPerFrame, frameNum = 0;
    unsigned long frameBits, sentBits = 0;
    unsigned long num_samples;
    unsigned long num_samples_ml;	               /* 08/03/1995 JMZ Multilingual */
    int odd_ml = 1;                                    /* LSF MultiLingual: audio inputting only at odd frames , WtK 7/8/95 */
    int ml_eof = 0;                                    /* MultiLingual: frame loop stops if either audio or ML-file has been exhausted , WtK 7/8/95 */

    IFF_AIFF aiff_ptr;
    IFF_AIFF aiff_ptr_ml;	                       /* 08/03/1995 JMZ Multilingual */
    int aiff = 0;                                      /* misused to indicate mc-input */
    int byte_per_sample = 0;

    int mat_mode = 0;
    int aug_mat_mode = 0;
    int cha_sw = -2;
    int aug_cha_sw = 0;
    int dyn_cr = 0;
    int dyn_cr_LR = 0;
    int aug_dyn_cr = 0;
    int predis = 0;
    int bit_rate = 0;
    unsigned int crc_buffer[15];

    int lfe_bits = 0;
    int sentBits1, frameBits1;
    int hi,  hu,  ho;

/*    char *blubb = "rm ";*/	
    char blubb[128];	/* Corrected BUG JMZ 29/03/1995*/

    int  ancillaryUse = 0;  /* YBKim060695 ancillary */
    

#ifdef  PRINTOUT
    int       loop_channel,loop_subband;
    
    al_table  *loop_alloc; /* a pointer to a table */
    sb_alloc  loop_struct; /* a structure of 4 int's */
    alloc_ptr loop_str_ptr; /* a pointer to an sb_alloc structure */
    float     loop_bits;
#endif

#ifdef  MACINTOSH
    console_options.nrows = MAC_WINDOW_SIZE;
    argc = ccommand(&argv);
#endif

    program_information();

    /* Most large variables are declared dynamically to ensure
       compatibility with smaller machines */

    j_sample = (JSBS *) mem_alloc (sizeof (JSBS), "j_sample");   

    win_que = (IN *) mem_alloc (sizeof (IN), "Win_que");       
    subband = (SUB *) mem_alloc (sizeof (SUB),"subband");        

    lfe_sample = (SAM *) mem_alloc (sizeof (SAM), "lfe_sample");
    lfe_sbband = (LSB *) mem_alloc (sizeof (LSB),"lfe_sbband");
 
    /* clear buffers */
    memset ((char *) buffer, 0, sizeof (buffer));
    memset ((char *) bit_alloc, 0, sizeof (bit_alloc));
    memset ((char *) scalar, 0, sizeof (scalar));
    memset ((char *) j_scale, 0, sizeof (j_scale));
    memset ((char *) scfsi, 0, sizeof (scfsi));
    memset ((char *) ltmin, 0, sizeof (ltmin));
    memset ((char *) lgmin, 0, sizeof (lgmin));
    memset ((char *) max_sc, 0, sizeof (max_sc));
    memset ((char *) snr32, 0, sizeof (snr32));
    memset ((char *) sam, 0, sizeof (sam));
 
    fr_ps.header = &info;
    info.mode_ext = 0;
    fr_ps.tab_num = -1;             /* no table loaded */
    fr_ps.tab_num_mc = -1;
    fr_ps.tab_num_ml = -1;
    fr_ps.alloc = NULL;
    fr_ps.alloc_mc = NULL;
    fr_ps.alloc_ml = NULL;

    info.version = MPEG_AUDIO_ID;
    info.bitrate_index = 0;
    info.lfe = 0;	    /* no low frequency effect channel present! */
    info.center = 0; 
    info.surround = 0; 

    info.multiling_ch  = 0;
    info.multiling_fs  = 0;
    info.multiling_lay = 0;

    info.matrix = 0;
#ifdef Augmentation_7ch
    info.aug_mtx_proc = 0;
#endif
    info.ext_bit_stream_present = 0;
    info.n_ad_bytes = DFLT_NADB;
    info.audio_mix = 0;
    info.dyn_cross_LR = 0;    /* C out of Lo */
    info.mc_prediction_on = 0;	       
    info.ext_length = 0;
    info.ext_bit = 0;
    info.copy_ident_bit = 0;
    info.copy_ident_start = 0;

    fr_ps.config = 0;
    fr_ps.phantom_c = 0;
    fr_ps.stereomc = 0;
    fr_ps.stereoaug = 0;

    programName = argv[0];
    if (argc == 1)			    /* no command-line args */
	obtain_parameters (&fr_ps, &model, &num_samples, &num_samples_ml, original_file_name,
			   encoded_file_name, &aiff_ptr, &aiff_ptr_ml, &aiff, &byte_per_sample, 
			   &mat_mode, &aug_mat_mode, &cha_sw, &aug_cha_sw,
			   encoded_file_name_ext, &bit_rate, encoded_file_name_mpg,
			   &dyn_cr, &dyn_cr_LR, &aug_dyn_cr, &ancillaryUse, &verbosity);
    else
        parse_args(argc, argv, &fr_ps, &model, &num_samples, &num_samples_ml, original_file_name,
			   encoded_file_name, &aiff_ptr, &aiff_ptr_ml, &aiff, &byte_per_sample, 
			   &mat_mode, &aug_mat_mode, &cha_sw, &aug_cha_sw,
			   encoded_file_name_ext, &bit_rate, encoded_file_name_mpg,
			   &dyn_cr, &dyn_cr_LR, &aug_dyn_cr, &ancillaryUse, &verbosity);

    hdr_to_frps (&fr_ps);

    if (aiff != 1) fr_ps.stereomc = 0;

    print_config (&fr_ps, &model, &num_samples,
		  original_file_name, encoded_file_name, &aiff);
  
    stereo = fr_ps.stereo;
    stereomc = fr_ps.stereomc;
    stereoaug = fr_ps.stereoaug;
    lfe = info.lfe;
    error_protection = info.error_protection;
 
    if (info.lay == 1) { bitsPerSlot = 32; samplesPerFrame = 384;  }
    else               { bitsPerSlot = 8;  samplesPerFrame = 1152; }
    /* Figure average number of 'slots' per frame. */
    /* Bitrate means TOTAL for both channels, not per side. */
    if (bit_rate == 0) bit_rate = bitrate[info.lay-1][info.bitrate_index];
    if (verbosity >= 2) printf("bit_rate = %d\n", bit_rate);
    fflush(stderr);  
  
    avg_slots_per_frame = ((double) samplesPerFrame / s_freq[info.sampling_frequency]) *
			  ((double) bit_rate / (double) bitsPerSlot);

    whole_SpF = (int) avg_slots_per_frame;	 /* Bytes per frame within datastream*/
    if (verbosity >= 2)
	printf ("slots/frame = %d\n", whole_SpF);
    frac_SpF  = avg_slots_per_frame - (double) whole_SpF;
    slot_lag  = -frac_SpF;
    if (verbosity >= 2)
	printf("frac SpF=%.3f, tot bit_rate=%d kbps, s freq=%.1f kHz\n",
                frac_SpF, bit_rate, s_freq[info.sampling_frequency]);
 
    if (frac_SpF != 0)
    {
	if (verbosity >= 2)
	    printf ("Fractional number of slots, padding required\n");
    }
    else
	info.padding = 0;

#ifdef PRINTOUT
    if (verbosity >= 3)
    {
	printf ("\nFrame ");
	for (loop_subband = 0; loop_subband < SBLIMIT; loop_subband++)
	    printf ("%3d",loop_subband);
	printf ("\n");
    }
#endif
 
    while ( 
             ( get_audio (musicin, buffer, num_samples, stereo, &aiff_ptr,
	                  stereomc, stereoaug, &fr_ps, &aiff, &byte_per_sample,
	                  buffer_matr) > 0 ) &&
	     ( !ml_eof )
	  )
    {
	/****************************************************************/
	/*                                                              */
	/*                  START OF FRAME LOOP                         */
	/*                                                              */
	/****************************************************************/

	/* the following allocation must happen within the while-loop. 1/5/93, SR */
	  
	if (mat_mode == -1)
	{
	    if (fr_ps.config == 320 || fr_ps.config == 310)
		info.matrix = rand () % 4;
	    else
	    {
		info.matrix = rand () % 3

⌨️ 快捷键说明

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