📄 musicin.c
字号:
/**********************************************************************Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reservedmusicin.c**********************************************************************//********************************************************************** * MPEG/audio coding/decoding software, work in progress * * NOT for public distribution until verified and approved by the * * MPEG/audio committee. For further information, please contact * * Davis Pan, 508-493-2241, e-mail: pan@3d.enet.dec.com * * * * VERSION 4.0 * * changes made since last update: * * 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 * * 8/07/92 Mike Coleman make exit() codes return error status * * made slight changes for portability * *19 aug 92 Soren H. Nielsen Changed MS-DOS file name extensions. * * 8/25/92 Shaun Astarabadi Replaced rint() function with explicit* * rounding for portability with MSDOS. * * 9/22/92 jddevine@aware.com Fixed _scale_factor_calc() calls. * *10/19/92 Masahiro Iwadare added info->mode and info->mode_ext * * updates for AIFF format files * * 3/10/93 Kevin Peterson In parse_args, only set non default * * bit rate if specified in arg list. * * Use return value from aiff_read_hdrs * * to fseek to start of sound data * * 7/26/93 Davis Pan fixed bug in printing info->mode_ext * * value for joint stereo condition * * 8/27/93 Seymour Shlien, Fixes in Unix and MSDOS ports, * * Daniel Lauzon, and * * Bill Truerniet * * 2004/7/29 Steven Schultz Cleanup and fix the pathname limit * * once and for all. * * 2004/8/22 Steven Schultz Make the code agree with the manpage * * The manpage says that -V _forces_ VCD * * compatible mode. Also, the VCD 2.0 * * specification permits 128, 192 and * * 384 kbit/sec rates for stereo (or dual* * mono) and 64,96 or 192 kbit/sec for * * mono mode. Since VCD2.0 came out in * * 1995 I think it's time to update this * * program ;) * * Make the default sampling rate 48000 * * if -V is NOT used - this will avoid * * problems with folks encoding for DVDs.* **********************************************************************/#ifdef HAVE_CONFIG_H#include "config.h"#endif #include <stdlib.h>#include <string.h>#include "common.h"#include "encoder.h"#include "wav_io.h"/* Global variable definitions for "musicin.c" */FILE *musicin;Bit_stream_struc bs;int verbose = 1;char *programName;/* Global variables */int freq_in=0;int freq_out=48000;int chans_in=0;int chans_out=0;int audio_bits=0;int32_t audio_bytes=0;static void Usage(char *str){ printf("Usage: %s [params] < input.wav\n",str); printf(" where possible params are:\n"); printf( " -v num Level of verbosity. 0 = quiet, 1 = normal 2 = verbose/debug\n"); printf(" -b num Bitrate in KBit/sec (default: 224 KBit/s)\n"); printf(" -l num Layer number 1 or 2 (default: 2)\n"); printf(" -o name Outputfile name (REQUIRED)\n"); printf(" -r num Force output sampling rate to be num Hz (default: 48000)\n"); printf(" num must be one of 32000, 44100, 48000\n"); printf(" -s Force stereo output (default)\n"); printf(" -m Force mono output\n"); printf(" -e Use CRC error protection\n"); printf(" -V Force VCD sampling rate (-r 44100) and perform bitrate/channel validity checks\n"); printf(" -? Print this lot out\n"); exit(0);}static voidget_params(argc, argv,fr_ps,psy,num_samples,encoded_file_name)int argc;char** argv;frame_params *fr_ps;int *psy;unsigned long *num_samples;char **encoded_file_name;{ layer *info = fr_ps->header; int brt=224; char *outfilename = 0; int stereo = 1; int mono = 0; int video_cd = 0; int j, n; int audio_format; /* RJ: We set most params to fixed defaults: */ info->lay = 2; info->emphasis = 0; info->extension = 0; info->error_protection = 0; info->copyright = 0; info->original = 0; info->mode_ext = 0; *psy = 2; *num_samples = MAX_U_32_NUM; /* Unlimited */ while( (n=getopt(argc,argv,"b:o:l:r:smeVv:")) != EOF) { switch(n) { case 'b': brt = atoi(optarg); break; case 'o': outfilename = optarg; break; case 'r': freq_out = atoi(optarg); if (freq_out!=32000 && freq_out!=44100 && freq_out!=48000) mjpeg_error_exit1("-r requires one of 32000 44100 48000!"); break; case 'l': info->lay = atoi(optarg); if (info->lay!=2 && info->lay!=1) mjpeg_error_exit1("-l requires 1 or 2!"); break; case 's': stereo = 1; mono = 0; chans_out = 2; break; case 'm': mono = 1; stereo = 0; chans_out = 1; break; case 'e': info->error_protection = 1; break; case 'V': video_cd = 1; break; case 'v': verbose = atoi(optarg); if( verbose < 0 || verbose > 2 ) Usage(argv[0]); break; case '?': Usage(argv[0]); } } (void)mjpeg_default_handler_verbosity(verbose); if(argc!=optind) Usage(argv[0]); if(outfilename==0) { mjpeg_error("Output file name (-o option) is required!"); Usage(argv[0]); } *encoded_file_name = strdup(outfilename); if (*encoded_file_name == NULL) mjpeg_error_exit1("can not malloc %d bytes", strlen(outfilename)); /* Read the WAV file header, make sanity checks */ if(wav_read_header(stdin,&freq_in,&chans_in,&audio_bits, &audio_format,&audio_bytes)) mjpeg_error_exit1("failure reading WAV file"); mjpeg_info("Opened WAV file, freq = %d Hz, channels = %d, bits = %d", freq_in, chans_in, audio_bits); mjpeg_info("format = 0x%x, audio length = %d bytes",audio_format,audio_bytes); if(audio_format!=1) mjpeg_error_exit1("WAV file is not in PCM format"); if(audio_bits!=8 && audio_bits!=16) mjpeg_error_exit1("audio samples must have 8 or 16 bits"); if(chans_in!=1 && chans_in!=2) mjpeg_error_exit1("can only handle files with 1 or 2 channels"); if(chans_out==0) chans_out = chans_in; if(chans_out==1) info->mode = MPG_MD_MONO; else info->mode = MPG_MD_STEREO; if(video_cd && info->lay != 2 ) mjpeg_error_exit1("Option -V requires layer II!"); if (video_cd) { freq_out=44100; if (chans_out == 2) { switch (brt) { case 128: case 192: case 224: case 384: break; default: mjpeg_error_exit1("-b %d not valid with stereo. Bitrate must be 128, 192, 224 or 384", brt); } } else if (chans_out == 1) { switch (brt) { case 64: case 96: case 192: break; default: mjpeg_error_exit1("-b %d not valid with mono. Bitrate must be 64, 96 or 192", brt); } } } if(freq_out==0) freq_out = freq_in; switch (freq_out) { case 48000 : info->sampling_frequency = 1; break; case 44100 : info->sampling_frequency = 0; break; case 32000 : info->sampling_frequency = 2; break; default: mjpeg_error_exit1("Frequency must be one of 32000 44100 48000" " unless -r is used!");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -