static void brhist_init_package(lame_global_flags const* gf) { if (global_ui_config.brhist) { if (brhist_init(gf, lame_get_VBR_min_bitrate_kbps(gf), lame_get_VBR_max_bitrate_kbps(gf))) { /* fail to initialize */ global_ui_config.brhist = 0; } } else { brhist_init(gf, 128, 128); /* Dirty hack */ } }
static void brhist_init_package(lame_global_flags * gf) { #ifdef BRHIST if (brhist) { if (brhist_init(gf, lame_get_VBR_min_bitrate_kbps(gf), lame_get_VBR_max_bitrate_kbps(gf))) { /* fail to initialize */ brhist = 0; } } else { brhist_init(gf, 128, 128); /* Dirty hack */ } #endif }
/******************************************************************** * 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]; } if (gfp->bWriteVbrTag) { /* Write initial VBR Header to bitstream */ InitVbrTag(&bs,1-gfp->version,gfp->mode,gfp->samplerate_index); } #ifdef HAVEGTK gtkflag=gfp->gtkflag; #endif #ifdef BRHIST if (gfp->VBR) { if (disp_brhist) brhist_init(gfp,1, 14); } else disp_brhist = 0; #endif return; }