📄 lame.c
字号:
/*
* LAME MP3 encoding engine
*
* Copyright (c) 1999 Mark Taylor
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <assert.h>
#ifdef HAVEGTK
#include "gtkanal.h"
#include <gtk/gtk.h>
#endif
#include "lame.h"
#include "util.h"
#include "timestatus.h"
#include "psymodel.h"
#include "newmdct.h"
#include "quantize.h"
#include "quantize-pvt.h"
#include "l3bitstream.h"
#include "formatBitstream.h"
#include "version.h"
#include "VbrTag.h"
#include "id3tag.h"
#include "tables.h"
#include "brhist.h"
#include "get_audio.h"
#ifdef __riscos__
#include "asmstuff.h"
#endif
/* Global variable definitions for lame.c */
static Bit_stream_struc bs;
static III_side_info_t l3_side;
#define MFSIZE (1152+1152+ENCDELAY-MDCTDELAY)
static short int mfbuf[2][MFSIZE];
static int mf_size;
static int mf_samples_to_encode;
/********************************************************************
* initialize internal params based on data in gf
* (globalflags struct filled in by calling program)
*
********************************************************************/
void lame_init_params(lame_global_flags *gfp)
{
int i;
FLOAT compression_ratio;
memset(&bs, 0, sizeof(Bit_stream_struc));
memset(&l3_side,0x00,sizeof(III_side_info_t));
gfp->frameNum=0;
InitFormatBitStream();
if (gfp->num_channels==1) {
gfp->mode = MPG_MD_MONO;
}
gfp->stereo=2;
if (gfp->mode == MPG_MD_MONO) gfp->stereo=1;
#ifdef BRHIST
if (gfp->silent) {
disp_brhist=0; /* turn of VBR historgram */
}
if (!gfp->VBR) {
disp_brhist=0; /* turn of VBR historgram */
}
#endif
/* set the output sampling rate, and resample options if necessary
samplerate = input sample rate
resamplerate = ouput sample rate
*/
if (gfp->out_samplerate==0) {
/* user did not specify output sample rate */
gfp->out_samplerate=gfp->in_samplerate; /* default */
/* if resamplerate is not valid, find a valid value */
if (gfp->out_samplerate>=48000) gfp->out_samplerate=48000;
else if (gfp->out_samplerate>=44100) gfp->out_samplerate=44100;
else if (gfp->out_samplerate>=32000) gfp->out_samplerate=32000;
else if (gfp->out_samplerate>=24000) gfp->out_samplerate=24000;
else if (gfp->out_samplerate>=22050) gfp->out_samplerate=22050;
else gfp->out_samplerate=16000;
if (gfp->brate>0) {
/* check if user specified bitrate requires downsampling */
compression_ratio = gfp->out_samplerate*16*gfp->stereo/(1000.0*gfp->brate);
if (!gfp->VBR && compression_ratio > 13 ) {
/* automatic downsample, if possible */
gfp->out_samplerate = (10*1000.0*gfp->brate)/(16*gfp->stereo);
if (gfp->out_samplerate<=16000) gfp->out_samplerate=16000;
else if (gfp->out_samplerate<=22050) gfp->out_samplerate=22050;
else if (gfp->out_samplerate<=24000) gfp->out_samplerate=24000;
else if (gfp->out_samplerate<=32000) gfp->out_samplerate=32000;
else if (gfp->out_samplerate<=44100) gfp->out_samplerate=44100;
else gfp->out_samplerate=48000;
}
}
}
gfp->mode_gr = (gfp->out_samplerate <= 24000) ? 1 : 2; /* mode_gr = 2 */
gfp->encoder_delay = ENCDELAY;
gfp->framesize = gfp->mode_gr*576;
if (gfp->brate==0) { /* user didn't specify a bitrate, use default */
gfp->brate=128;
if (gfp->mode_gr==1) gfp->brate=64;
}
gfp->resample_ratio=1;
if (gfp->out_samplerate != gfp->in_samplerate) gfp->resample_ratio = (FLOAT)gfp->in_samplerate/(FLOAT)gfp->out_samplerate;
/* estimate total frames. must be done after setting sampling rate so
* we know the framesize. */
gfp->totalframes=0;
gfp->totalframes = 2+ gfp->num_samples/(gfp->resample_ratio*gfp->framesize);
/* 44.1kHz at 56kbs/channel: compression factor of 12.6
44.1kHz at 64kbs/channel: compression factor of 11.025
44.1kHz at 80kbs/channel: compression factor of 8.82
22.05kHz at 24kbs: 14.7
22.05kHz at 32kbs: 11.025
22.05kHz at 40kbs: 8.82
16kHz at 16kbs: 16.0
16kHz at 24kbs: 10.7
compression_ratio
11 .70?
12 sox resample .66
14.7 sox resample .45
*/
if (gfp->brate >= 320) gfp->VBR=0; /* dont bother with VBR at 320kbs */
compression_ratio = gfp->out_samplerate*16*gfp->stereo/(1000.0*gfp->brate);
/* for VBR, take a guess at the compression_ratio */
/* VBR_q compression like
0 4.4 320kbs
1 5.4 256kbs
3 7.4 192kbs
4 8.8 160kbs
6 10.4 128kbs
*/
if (gfp->VBR && compression_ratio>11) {
compression_ratio = 4.4 + gfp->VBR_q;
}
/* At higher quality (lower compression) use STEREO instead of JSTEREO.
* (unless the user explicitly specified a mode ) */
if ( (!gfp->mode_fixed) && (gfp->mode !=MPG_MD_MONO)) {
if (compression_ratio < 9 ) {
gfp->mode = MPG_MD_STEREO;
}
}
/****************************************************************/
/* if a filter has not been enabled, see if we should add one: */
/****************************************************************/
if (gfp->lowpassfreq == 0) {
/* If the user has not selected their own filter, add a lowpass
* filter based on the compression ratio. Formula based on
44.1 /160 4.4x
44.1 /128 5.5x keep all bands
44.1 /96kbs 7.3x keep band 28
44.1 /80kbs 8.8x keep band 25
44.1khz/64kbs 11x keep band 21 22?
16khz/24kbs 10.7x keep band 21
22kHz/32kbs 11x keep band ?
22kHz/24kbs 14.7x keep band 16
16 16 16x keep band 14
*/
/* Should we use some lowpass filters? */
int band = 1+floor(.5 + 14-18*log(compression_ratio/16.0));
if (band < 31) {
gfp->lowpass1 = band/31.0;
gfp->lowpass2 = band/31.0;
}
}
/****************************************************************/
/* apply user driven filters*/
/****************************************************************/
if ( gfp->highpassfreq > 0 ) {
gfp->highpass1 = 2.0*gfp->highpassfreq/gfp->out_samplerate; /* will always be >=0 */
if ( gfp->highpasswidth >= 0 ) {
gfp->highpass2 = 2.0*(gfp->highpassfreq+gfp->highpasswidth)/gfp->out_samplerate;
} else {
/* 15% above on default */
/* gfp->highpass2 = 1.15*2.0*gfp->highpassfreq/gfp->out_samplerate; */
gfp->highpass2 = 1.00*2.0*gfp->highpassfreq/gfp->out_samplerate;
}
gfp->highpass1 = Min( 1, gfp->highpass1 );
gfp->highpass2 = Min( 1, gfp->highpass2 );
}
if ( gfp->lowpassfreq > 0 ) {
gfp->lowpass2 = 2.0*gfp->lowpassfreq/gfp->out_samplerate; /* will always be >=0 */
if ( gfp->lowpasswidth >= 0 ) {
gfp->lowpass1 = 2.0*(gfp->lowpassfreq-gfp->lowpasswidth)/gfp->out_samplerate;
if ( gfp->lowpass1 < 0 ) { /* has to be >= 0 */
gfp->lowpass1 = 0;
}
} else {
/* 15% below on default */
/* gfp->lowpass1 = 0.85*2.0*gfp->lowpassfreq/gfp->out_samplerate; */
gfp->lowpass1 = 1.00*2.0*gfp->lowpassfreq/gfp->out_samplerate;
}
gfp->lowpass1 = Min( 1, gfp->lowpass1 );
gfp->lowpass2 = Min( 1, gfp->lowpass2 );
}
/***************************************************************/
/* compute info needed for polyphase filter */
/***************************************************************/
if (gfp->filter_type==0) {
int band,maxband,minband;
FLOAT8 amp,freq;
if (gfp->lowpass1 > 0) {
minband=999;
maxband=-1;
for (band=0; band <=31 ; ++band) {
freq = band/31.0;
amp = 1;
/* this band and above will be zeroed: */
if (freq >= gfp->lowpass2) {
gfp->lowpass_band= Min(gfp->lowpass_band,band);
amp=0;
}
if (gfp->lowpass1 < freq && freq < gfp->lowpass2) {
minband = Min(minband,band);
maxband = Max(maxband,band);
amp = cos((PI/2)*(gfp->lowpass1-freq)/(gfp->lowpass2-gfp->lowpass1));
}
/* printf("lowpass band=%i amp=%f \n",band,amp);*/
}
/* compute the *actual* transition band implemented by the polyphase filter */
if (minband==999) gfp->lowpass1 = (gfp->lowpass_band-.75)/31.0;
else gfp->lowpass1 = (minband-.75)/31.0;
gfp->lowpass2 = gfp->lowpass_band/31.0;
}
/* make sure highpass filter is within 90% of whan the effective highpass
* frequency will be */
if (gfp->highpass2 > 0)
if (gfp->highpass2 < .9*(.75/31.0) ) {
gfp->highpass1=0; gfp->highpass2=0;
fprintf(stderr,"Warning: highpass filter disabled. highpass frequency to small\n");
}
if (gfp->highpass2 > 0) {
minband=999;
maxband=-1;
for (band=0; band <=31; ++band) {
freq = band/31.0;
amp = 1;
/* this band and below will be zereod */
if (freq <= gfp->highpass1) {
gfp->highpass_band = Max(gfp->highpass_band,band);
amp=0;
}
if (gfp->highpass1 < freq && freq < gfp->highpass2) {
minband = Min(minband,band);
maxband = Max(maxband,band);
amp = cos((PI/2)*(gfp->highpass2-freq)/(gfp->highpass2-gfp->highpass1));
}
/* printf("highpass band=%i amp=%f \n",band,amp);*/
}
/* compute the *actual* transition band implemented by the polyphase filter */
gfp->highpass1 = gfp->highpass_band/31.0;
if (maxband==-1) gfp->highpass2 = (gfp->highpass_band+.75)/31.0;
else gfp->highpass2 = (maxband+.75)/31.0;
}
/*
printf("lowpass band with amp=0: %i \n",gfp->lowpass_band);
printf("highpass band with amp=0: %i \n",gfp->highpass_band);
*/
}
/***************************************************************/
/* compute info needed for FIR filter */
/***************************************************************/
if (gfp->filter_type==1) {
}
gfp->mode_ext=MPG_MD_LR_LR;
gfp->stereo = (gfp->mode == MPG_MD_MONO) ? 1 : 2;
gfp->samplerate_index = SmpFrqIndex((long)gfp->out_samplerate, &gfp->version);
if( gfp->samplerate_index < 0) {
display_bitrates(stderr);
exit(1);
}
if( (gfp->bitrate_index = BitrateIndex(gfp->brate, gfp->version,gfp->out_samplerate)) < 0) {
display_bitrates(stderr);
exit(1);
}
/* choose a min/max bitrate for VBR */
if (gfp->VBR) {
/* if the user didn't specify VBR_max_bitrate: */
if (0==gfp->VBR_max_bitrate_kbps) {
/* default max bitrate is 256kbs */
/* we do not normally allow 320bps frams with VBR, unless: */
gfp->VBR_max_bitrate=13; /* default: allow 256kbs */
if (gfp->VBR_min_bitrate_kbps>=256) gfp->VBR_max_bitrate=14;
if (gfp->VBR_q == 0) gfp->VBR_max_bitrate=14; /* allow 320kbs */
if (gfp->VBR_q >= 4) gfp->VBR_max_bitrate=12; /* max = 224kbs */
if (gfp->VBR_q >= 8) gfp->VBR_max_bitrate=9; /* low quality, max = 128kbs */
}else{
if( (gfp->VBR_max_bitrate = BitrateIndex(gfp->VBR_max_bitrate_kbps, gfp->version,gfp->out_samplerate)) < 0) {
display_bitrates(stderr);
exit(1);
}
}
if (0==gfp->VBR_min_bitrate_kbps) {
gfp->VBR_min_bitrate=1; /* 32 kbps */
}else{
if( (gfp->VBR_min_bitrate = BitrateIndex(gfp->VBR_min_bitrate_kbps, gfp->version,gfp->out_samplerate)) < 0) {
display_bitrates(stderr);
exit(1);
}
}
}
if (gfp->VBR) gfp->quality=Min(gfp->quality,2); /* always use quality <=2 with VBR */
/* dont allow forced mid/side stereo for mono output */
if (gfp->mode == MPG_MD_MONO) gfp->force_ms=0;
/* Do not write VBR tag if VBR flag is not specified */
if (gfp->VBR==0) gfp->bWriteVbrTag=0;
/* some file options not allowed if output is: not specified or stdout */
if (gfp->outPath!=NULL && gfp->outPath[0]=='-' ) {
gfp->bWriteVbrTag=0; /* turn off VBR tag */
}
if (gfp->outPath==NULL || gfp->outPath[0]=='-' ) {
id3tag.used=0; /* turn of id3 tagging */
}
if (gfp->gtkflag) {
gfp->bWriteVbrTag=0; /* disable Xing VBR tag */
}
init_bit_stream_w(&bs);
/* set internal feature flags. USER should not access these since
* some combinations will produce strange results */
/* no psymodel, no noise shaping */
if (gfp->quality==9) {
gfp->filter_type=0;
gfp->psymodel=0;
gfp->quantization=0;
gfp->noise_shaping=0;
gfp->noise_shaping_stop=0;
gfp->use_best_huffman=0;
}
if (gfp->quality==8) gfp->quality=7;
/* use psymodel (for short block and m/s switching), but no noise shapping */
if (gfp->quality==7) {
gfp->filter_type=0;
gfp->psymodel=1;
gfp->quantization=0;
gfp->noise_shaping=0;
gfp->noise_shaping_stop=0;
gfp->use_best_huffman=0;
}
if (gfp->quality==6) gfp->quality=5;
if (gfp->quality==5) {
/* the default */
gfp->filter_type=0;
gfp->psymodel=1;
gfp->quantization=0;
gfp->noise_shaping=1;
gfp->noise_shaping_stop=0;
gfp->use_best_huffman=0;
}
if (gfp->quality==4) gfp->quality=2;
if (gfp->quality==3) gfp->quality=2;
if (gfp->quality==2) {
gfp->filter_type=0;
gfp->psymodel=1;
gfp->quantization=1;
gfp->noise_shaping=1;
gfp->noise_shaping_stop=0;
gfp->use_best_huffman=1;
}
if (gfp->quality==1) {
gfp->filter_type=0;
gfp->psymodel=1;
gfp->quantization=1;
gfp->noise_shaping=1;
gfp->noise_shaping_stop=1;
gfp->use_best_huffman=1;
}
if (gfp->quality==0) {
/* 0..1 quality */
gfp->filter_type=1; /* not yet coded */
gfp->psymodel=1;
gfp->quantization=1;
gfp->noise_shaping=3; /* not yet coded */
gfp->noise_shaping_stop=2; /* not yet coded */
gfp->use_best_huffman=2; /* not yet coded */
exit(-99);
}
for (i = 0; i < SBMAX_l + 1; i++) {
scalefac_band.l[i] =
sfBandIndex[gfp->samplerate_index + (gfp->version * 3)].l[i];
}
for (i = 0; i < SBMAX_s + 1; i++) {
scalefac_band.s[i] =
sfBandIndex[gfp->samplerate_index + (gfp->version * 3)].s[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -