📄 layer3.c
字号:
#include <stdio.h>#include <string.h>#include "types.h"#include "wave.h"#include "error.h"#include "layer3.h"#include "l3psy.h"#include "l3subband.h"#include "l3mdct.h"#include "l3loop.h"#include "l3bitstream.h"#include "bitstream.h"static void update_status(int frames_processed){ printf("\015[Frame %6d of %6ld] (%2.2f%%)", frames_processed,config.mpeg.total_frames, (float)((float)frames_processed/config.mpeg.total_frames)*100); fflush(stdout);}void L3_compress(){ int frames_processed; static short buffer[2][1152]; int channel; int i; int gr; short sam[2][1344]; float snr32[32]; L3_psy_ratio_t ratio; double pe[2][2]; L3_side_info_t side_info; short *buffer_window[2]; double win_que[2][HAN_SIZE]; double l3_sb_sample[2][3][18][SBLIMIT]; double mdct_freq[2][2][576]; int l3_enc[2][2][576]; L3_scalefac_t scalefactor; bitstream_t bs; double avg_slots_per_frame; double frac_slots_per_frame; long whole_slots_per_frame; double slot_lag; int mean_bits; unsigned long sent_bits = 0; unsigned long frame_bits = 0; int sideinfo_len; open_bit_stream_w(&bs, config.outfile, BUFFER_SIZE); memset((char*)snr32,0,sizeof(snr32)); memset((char *)sam,0,sizeof(sam)); memset((char *)&side_info,0,sizeof(L3_side_info_t)); L3_psycho_initialise(); L3_subband_initialise(); L3_mdct_initialise(); L3_loop_initialise(); config.mpeg.mode_gr = (config.mpeg.type==TYPE_MPEG_I)? 2: 1; config.mpeg.samples_per_frame = (config.mpeg.type==TYPE_MPEG_I)?1152:576; config.mpeg.total_frames = config.wave.total_samples/config.mpeg.samples_per_frame; config.mpeg.bits_per_slot = 8; frames_processed = 0; sideinfo_len = 32; if(config.mpeg.type==TYPE_MPEG_I) { /* MPEG 1 */ if(config.wave.channels==1) sideinfo_len += 136; else sideinfo_len += 256; } else { /* MPEG 2 */ if(config.wave.channels==1) sideinfo_len += 72; else sideinfo_len += 136; } if(config.mpeg.crc) sideinfo_len += 16;/* Figure average number of 'slots' per frame. */ avg_slots_per_frame = ((double)config.mpeg.samples_per_frame / ((double)config.wave.samplerate/1000)) * ((double)config.mpeg.bitr / (double)config.mpeg.bits_per_slot); whole_slots_per_frame = (int)avg_slots_per_frame; frac_slots_per_frame = avg_slots_per_frame - (double)whole_slots_per_frame; slot_lag = -frac_slots_per_frame; if(frac_slots_per_frame==0) config.mpeg.padding = 0; while(wave_get(buffer)) { update_status(frames_processed++); buffer_window[0] = buffer[0]; buffer_window[1] = buffer[1]; if(frac_slots_per_frame!=0) if(slot_lag>(frac_slots_per_frame-1.0)) { /* No padding for this frame */ slot_lag -= frac_slots_per_frame; config.mpeg.padding = 0; } else { /* Padding for this frame */ slot_lag += (1-frac_slots_per_frame); config.mpeg.padding = 1; } config.mpeg.bits_per_frame = 8*(whole_slots_per_frame + config.mpeg.padding); mean_bits = (config.mpeg.bits_per_frame - sideinfo_len) / config.mpeg.mode_gr;/* psychoacousic model */
/* for(gr=0;gr<config.mpeg.mode_gr;gr++) for(channel=0;channel<config.wave.channels;channel++) L3_psycho_analize(channel, &buffer[channel][gr*576], &sam[channel][0],&snr32[0], &ratio.l[gr][channel][0], &ratio.s[gr][channel][0], &pe[gr][channel], &side_info.gr[gr].ch[channel].tt);
*//* polyphase filtering */ for(gr=0;gr<config.mpeg.mode_gr;gr++) for(channel=0;channel<config.wave.channels;channel++) for(i=0;i<18;i++) { L3_window_subband(&buffer_window[channel], &win_que[channel][0], channel); L3_filter_subband(&win_que[channel][0], &l3_sb_sample[channel][gr+1][i][0]); }/* apply mdct to the polyphase output */
L3_mdct_sub(l3_sb_sample, mdct_freq, &side_info);/* bit and noise allocation */ L3_iteration_loop(pe,mdct_freq,&ratio,&side_info, l3_enc, mean_bits,&scalefactor);/* write the frame to the bitstream */ L3_format_bitstream(l3_enc,&side_info,&scalefactor, &bs,mdct_freq,NULL,0); frame_bits = sstell(&bs) - sent_bits;/* if(frame_bits%config.mpeg.bits_per_slot) ERROR("This shouldn't happen, program error.");*/ sent_bits += frame_bits; } L3_FlushBitstream(); close_bit_stream_w(&bs);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -