📄 musicin.c
字号:
} *num_samples = audio_bytes/(audio_bits/8); if (brt==0) { if (info->lay==2) brt = (info->mode == MPG_MD_MONO) ? 112 : 224; else brt = (info->mode == MPG_MD_MONO) ? 192 : 384; } for(j=0;j<15;j++) if (bitrate[info->lay-1][j] == brt) break; if (j==15) mjpeg_error_exit1("Bitrate of %d KBit/s not allowed!",brt); info->bitrate_index = j; if(info->lay==2 && brt>192 && info->mode==MPG_MD_MONO) mjpeg_error_exit1("Bitrate of %d KBit/s not allowed for MONO",brt); open_bit_stream_w(&bs, *encoded_file_name, BUFFER_SIZE);}/* * print_config * * PURPOSE: Prints the encoding parameters used*/voidprint_config(fr_ps, psy, num_samples, outPath)frame_params *fr_ps;int *psy;unsigned long *num_samples;char *outPath;{ layer *info = fr_ps->header; mjpeg_debug("Encoding configuration:"); if(info->mode != MPG_MD_JOINT_STEREO) mjpeg_debug("Layer=%s mode=%s extn=%d psy model=%d", layer_names[info->lay-1], mode_names[info->mode], info->mode_ext, *psy); else mjpeg_debug("Layer=%s mode=%s extn=data dependant psy model=%d", layer_names[info->lay-1], mode_names[info->mode], *psy); mjpeg_debug("samp frq=%.1f kHz total bitrate=%d kbps", s_freq[info->sampling_frequency], bitrate[info->lay-1][info->bitrate_index]); mjpeg_debug("de-emph=%d c/right=%d orig=%d errprot=%d", info->emphasis, info->copyright, info->original, info->error_protection); mjpeg_debug("output file: '%s'", outPath);} /* * main * * PURPOSE: MPEG I Encoder supporting layers 1 and 2, and * psychoacoustic models 1 (MUSICAM) and 2 (AT&T) * * 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)*/ int main(argc, argv)int argc;char **argv;{typedef double SBS[2][3][SCALE_BLOCK][SBLIMIT]; SBS *sb_sample;typedef double JSBS[3][SCALE_BLOCK][SBLIMIT]; JSBS *j_sample;typedef double IN[2][HAN_SIZE]; IN *win_que;typedef unsigned int SUB[2][3][SCALE_BLOCK][SBLIMIT]; SUB *subband; frame_params fr_ps; layer info; char *encoded_file_name; short **win_buf;static short buffer[2][1152];static unsigned int bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT];static unsigned int scalar[2][3][SBLIMIT], j_scale[3][SBLIMIT];static double ltmin[2][SBLIMIT], lgmin[2][SBLIMIT], max_sc[2][SBLIMIT]; FLOAT snr32[32]; short sam[2][1056]; int whole_SpF, extra_slot = 0; double avg_slots_per_frame, frac_SpF, slot_lag; int model, stereo, error_protection;static unsigned int crc; int i, j, k, adb; unsigned long bitsPerSlot, samplesPerFrame, frameNum = 0; unsigned long frameBits, sentBits = 0; unsigned long num_samples; /* Most large variables are declared dynamically to ensure compatibility with smaller machines */ sb_sample = (SBS *) mem_alloc(sizeof(SBS), "sb_sample"); 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"); win_buf = (short **) mem_alloc(sizeof(short *)*2, "win_buf"); /* 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; fr_ps.tab_num = -1; /* no table loaded */ fr_ps.alloc = NULL; info.version = MPEG_AUDIO_ID; programName = argv[0]; get_params(argc, argv, &fr_ps, &model, &num_samples, &encoded_file_name); print_config(&fr_ps, &model, &num_samples, encoded_file_name); hdr_to_frps(&fr_ps); stereo = fr_ps.stereo; 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. */ avg_slots_per_frame = ((double)samplesPerFrame / s_freq[info.sampling_frequency]) * ((double)bitrate[info.lay-1][info.bitrate_index] / (double)bitsPerSlot); whole_SpF = (int) avg_slots_per_frame; frac_SpF = avg_slots_per_frame - (double)whole_SpF; slot_lag = -frac_SpF; mjpeg_info("SpF=%d, frac SpF=%.3f, bitrate=%d kbps, sfreq=%.1f kHz", whole_SpF, frac_SpF, bitrate[info.lay-1][info.bitrate_index], s_freq[info.sampling_frequency]); if (frac_SpF != 0) mjpeg_info("Fractional number of slots, padding required"); else info.padding = 0; while (get_audio(musicin, buffer, num_samples, stereo, info.lay) != 0) { frameNum++; win_buf[0] = &buffer[0][0]; win_buf[1] = &buffer[1][0]; if (frac_SpF != 0) { if (slot_lag > (frac_SpF-1.0) ) { slot_lag -= frac_SpF; extra_slot = 0; info.padding = 0; } else { extra_slot = 1; info.padding = 1; slot_lag += (1-frac_SpF); } } adb = (whole_SpF+extra_slot) * bitsPerSlot; switch (info.lay) { /***************************** Layer I **********************************/ case 1 : for (j=0;j<SCALE_BLOCK;j++) for (k=0;k<stereo;k++) { window_subband(&win_buf[k], &(*win_que)[k][0], k); filter_subband(&(*win_que)[k][0], &(*sb_sample)[k][0][j][0]); } I_scale_factor_calc(*sb_sample, scalar, stereo); if(fr_ps.actual_mode == MPG_MD_JOINT_STEREO) { I_combine_LR(*sb_sample, *j_sample); I_scale_factor_calc(j_sample, &j_scale, 1); } put_scale(scalar, &fr_ps, max_sc); if (model == 1) I_Psycho_One(buffer, max_sc, ltmin, &fr_ps); else { for (k=0;k<stereo;k++) { psycho_anal(&buffer[k][0],&sam[k][0], k, info.lay, snr32, (FLOAT)s_freq[info.sampling_frequency]*1000); for (i=0;i<SBLIMIT;i++) ltmin[k][i] = (double) snr32[i]; } } I_main_bit_allocation(ltmin, bit_alloc, &adb, &fr_ps); if (error_protection) I_CRC_calc(&fr_ps, bit_alloc, &crc); encode_info(&fr_ps, &bs); if (error_protection) encode_CRC(crc, &bs); I_encode_bit_alloc(bit_alloc, &fr_ps, &bs); I_encode_scale(scalar, bit_alloc, &fr_ps, &bs); I_subband_quantization(scalar, *sb_sample, j_scale, *j_sample, bit_alloc, *subband, &fr_ps); I_sample_encoding(*subband, bit_alloc, &fr_ps, &bs); for (i=0;i<adb;i++) put1bit(&bs, 0); break; /***************************** Layer 2 **********************************/ case 2 : for (i=0;i<3;i++) for (j=0;j<SCALE_BLOCK;j++) for (k=0;k<stereo;k++) { window_subband(&win_buf[k], &(*win_que)[k][0], k); filter_subband(&(*win_que)[k][0], &(*sb_sample)[k][i][j][0]); } II_scale_factor_calc(*sb_sample, scalar, stereo, fr_ps.sblimit); pick_scale(scalar, &fr_ps, max_sc); if(fr_ps.actual_mode == MPG_MD_JOINT_STEREO) { II_combine_LR(*sb_sample, *j_sample, fr_ps.sblimit); II_scale_factor_calc(j_sample, &j_scale, 1, fr_ps.sblimit); } /* this way we calculate more mono than we need */ /* but it is cheap */ if (model == 1) II_Psycho_One(buffer, max_sc, ltmin, &fr_ps); else { for (k=0;k<stereo;k++) { psycho_anal(&buffer[k][0],&sam[k][0], k, info.lay, snr32, (FLOAT)s_freq[info.sampling_frequency]*1000); for (i=0;i<SBLIMIT;i++) ltmin[k][i] = (double) snr32[i]; } } II_transmission_pattern(scalar, scfsi, &fr_ps); II_main_bit_allocation(ltmin, scfsi, bit_alloc, &adb, &fr_ps); if (error_protection) II_CRC_calc(&fr_ps, bit_alloc, scfsi, &crc); encode_info(&fr_ps, &bs); if (error_protection) encode_CRC(crc, &bs); II_encode_bit_alloc(bit_alloc, &fr_ps, &bs); II_encode_scale(bit_alloc, scfsi, scalar, &fr_ps, &bs); II_subband_quantization(scalar, *sb_sample, j_scale, *j_sample, bit_alloc, *subband, &fr_ps); II_sample_encoding(*subband, bit_alloc, &fr_ps, &bs); for (i=0;i<adb;i++) put1bit(&bs, 0); break; /***************************** Layer 3 **********************************/ case 3 : break; } frameBits = sstell(&bs) - sentBits; if(frameBits%bitsPerSlot) /* a program failure */ mjpeg_error("Sent %ld bits = %ld slots plus %ld", frameBits, frameBits/bitsPerSlot, frameBits%bitsPerSlot); sentBits += frameBits; } close_bit_stream_w(&bs); mjpeg_info("Num frames %ld Avg slots/frame = %.3f; b/smp = %.2f; br = %.3f kbps", frameNum, (FLOAT) sentBits / (frameNum * bitsPerSlot), (FLOAT) sentBits / (frameNum * samplesPerFrame), (FLOAT) sentBits / (frameNum * samplesPerFrame) * s_freq[info.sampling_frequency]); mjpeg_info("Encoding to layer %d with psychoacoustic model %d is finished", info.lay, model); mjpeg_info("The MPEG encoded output file name is \"%s\"", encoded_file_name); exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -