123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616 |
- /*
- * lame utility library include file
- *
- * Copyright (c) 1999 Albert L Faber
- * Copyright (c) 2008 Robert Hegemann
- *
- * 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.
- */
- #ifndef LAME_UTIL_H
- #define LAME_UTIL_H
- #include "l3side.h"
- #include "id3tag.h"
- #include "lame_global_flags.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /***********************************************************************
- *
- * Global Definitions
- *
- ***********************************************************************/
- #ifndef FALSE
- #define FALSE 0
- #endif
- #ifndef TRUE
- #define TRUE (!FALSE)
- #endif
- #ifdef UINT_MAX
- # define MAX_U_32_NUM UINT_MAX
- #else
- # define MAX_U_32_NUM 0xFFFFFFFF
- #endif
- #ifndef PI
- # ifdef M_PI
- # define PI M_PI
- # else
- # define PI 3.14159265358979323846
- # endif
- #endif
- #ifdef M_LN2
- # define LOG2 M_LN2
- #else
- # define LOG2 0.69314718055994530942
- #endif
- #ifdef M_LN10
- # define LOG10 M_LN10
- #else
- # define LOG10 2.30258509299404568402
- #endif
- #ifdef M_SQRT2
- # define SQRT2 M_SQRT2
- #else
- # define SQRT2 1.41421356237309504880
- #endif
- #define CRC16_POLYNOMIAL 0x8005
- #define MAX_BITS_PER_CHANNEL 4095
- #define MAX_BITS_PER_GRANULE 7680
- /* "bit_stream.h" Definitions */
- #define BUFFER_SIZE LAME_MAXMP3BUFFER
- #define Min(A, B) ((A) < (B) ? (A) : (B))
- #define Max(A, B) ((A) > (B) ? (A) : (B))
- /* log/log10 approximations */
- #ifdef USE_FAST_LOG
- #define FAST_LOG10(x) (fast_log2(x)*(LOG2/LOG10))
- #define FAST_LOG(x) (fast_log2(x)*LOG2)
- #define FAST_LOG10_X(x,y) (fast_log2(x)*(LOG2/LOG10*(y)))
- #define FAST_LOG_X(x,y) (fast_log2(x)*(LOG2*(y)))
- #else
- #define FAST_LOG10(x) log10(x)
- #define FAST_LOG(x) log(x)
- #define FAST_LOG10_X(x,y) (log10(x)*(y))
- #define FAST_LOG_X(x,y) (log(x)*(y))
- #endif
- struct replaygain_data;
- #ifndef replaygain_data_defined
- #define replaygain_data_defined
- typedef struct replaygain_data replaygain_t;
- #endif
- struct plotting_data;
- #ifndef plotting_data_defined
- #define plotting_data_defined
- typedef struct plotting_data plotting_data;
- #endif
- /***********************************************************************
- *
- * Global Type Definitions
- *
- ***********************************************************************/
- typedef struct {
- void *aligned; /* pointer to ie. 128 bit aligned memory */
- void *pointer; /* to use with malloc/free */
- } aligned_pointer_t;
- void calloc_aligned(aligned_pointer_t * ptr, unsigned int size, unsigned int bytes);
- void free_aligned(aligned_pointer_t * ptr);
- /* "bit_stream.h" Type Definitions */
- typedef struct bit_stream_struc {
- unsigned char *buf; /* bit stream buffer */
- int buf_size; /* size of buffer (in number of bytes) */
- int totbit; /* bit counter of bit stream */
- int buf_byte_idx; /* pointer to top byte in buffer */
- int buf_bit_idx; /* pointer to top bit of top byte in buffer */
- /* format of file in rd mode (BINARY/ASCII) */
- } Bit_stream_struc;
- typedef struct {
- int sum; /* what we have seen so far */
- int seen; /* how many frames we have seen in this chunk */
- int want; /* how many frames we want to collect into one chunk */
- int pos; /* actual position in our bag */
- int size; /* size of our bag */
- int *bag; /* pointer to our bag */
- unsigned int nVbrNumFrames;
- unsigned long nBytesWritten;
- /* VBR tag data */
- unsigned int TotalFrameSize;
- } VBR_seek_info_t;
- /**
- * ATH related stuff, if something new ATH related has to be added,
- * please plugg it here into the ATH_t struct
- */
- typedef struct {
- int use_adjust; /* method for the auto adjustment */
- FLOAT aa_sensitivity_p; /* factor for tuning the (sample power)
- point below which adaptive threshold
- of hearing adjustment occurs */
- FLOAT adjust_factor; /* lowering based on peak volume, 1 = no lowering */
- FLOAT adjust_limit; /* limit for dynamic ATH adjust */
- FLOAT decay; /* determined to lower x dB each second */
- FLOAT floor; /* lowest ATH value */
- FLOAT l[SBMAX_l]; /* ATH for sfbs in long blocks */
- FLOAT s[SBMAX_s]; /* ATH for sfbs in short blocks */
- FLOAT psfb21[PSFB21]; /* ATH for partitionned sfb21 in long blocks */
- FLOAT psfb12[PSFB12]; /* ATH for partitionned sfb12 in short blocks */
- FLOAT cb_l[CBANDS]; /* ATH for long block convolution bands */
- FLOAT cb_s[CBANDS]; /* ATH for short block convolution bands */
- FLOAT eql_w[BLKSIZE / 2]; /* equal loudness weights (based on ATH) */
- } ATH_t;
- /**
- * PSY Model related stuff
- */
- typedef struct {
- FLOAT masking_lower[CBANDS];
- FLOAT minval[CBANDS];
- FLOAT rnumlines[CBANDS];
- FLOAT mld_cb[CBANDS];
- FLOAT mld[Max(SBMAX_l,SBMAX_s)];
- FLOAT bo_weight[Max(SBMAX_l,SBMAX_s)]; /* band weight long scalefactor bands, at transition */
- FLOAT attack_threshold; /* short block tuning */
- int s3ind[CBANDS][2];
- int numlines[CBANDS];
- int bm[Max(SBMAX_l,SBMAX_s)];
- int bo[Max(SBMAX_l,SBMAX_s)];
- int npart;
- int n_sb; /* SBMAX_l or SBMAX_s */
- FLOAT *s3;
- } PsyConst_CB2SB_t;
- /**
- * global data constants
- */
- typedef struct {
- FLOAT window[BLKSIZE], window_s[BLKSIZE_s / 2];
- PsyConst_CB2SB_t l;
- PsyConst_CB2SB_t s;
- PsyConst_CB2SB_t l_to_s;
- FLOAT attack_threshold[4];
- FLOAT decay;
- int force_short_block_calc;
- } PsyConst_t;
- typedef struct {
- FLOAT nb_l1[4][CBANDS], nb_l2[4][CBANDS];
- FLOAT nb_s1[4][CBANDS], nb_s2[4][CBANDS];
- III_psy_xmin thm[4];
- III_psy_xmin en[4];
- /* loudness calculation (for adaptive threshold of hearing) */
- FLOAT loudness_sq_save[2]; /* account for granule delay of L3psycho_anal */
- FLOAT tot_ener[4];
- FLOAT last_en_subshort[4][9];
- int last_attacks[4];
- int blocktype_old[2];
- } PsyStateVar_t;
- typedef struct {
- /* loudness calculation (for adaptive threshold of hearing) */
- FLOAT loudness_sq[2][2]; /* loudness^2 approx. per granule and channel */
- } PsyResult_t;
- /* variables used by encoder.c */
- typedef struct {
- /* variables for newmdct.c */
- FLOAT sb_sample[2][2][18][SBLIMIT];
- FLOAT amp_filter[32];
- /* variables used by util.c */
- /* BPC = maximum number of filter convolution windows to precompute */
- #define BPC 320
- double itime[2]; /* float precision seems to be not enough */
- sample_t *inbuf_old[2];
- sample_t *blackfilt[2 * BPC + 1];
- FLOAT pefirbuf[19];
-
- /* used for padding */
- int frac_SpF;
- int slot_lag;
- /* variables for bitstream.c */
- /* mpeg1: buffer=511 bytes smallest frame: 96-38(sideinfo)=58
- * max number of frames in reservoir: 8
- * mpeg2: buffer=255 bytes. smallest frame: 24-23bytes=1
- * with VBR, if you are encoding all silence, it is possible to
- * have 8kbs/24khz frames with 1byte of data each, which means we need
- * to buffer up to 255 headers! */
- /* also, max_header_buf has to be a power of two */
- #define MAX_HEADER_BUF 256
- #define MAX_HEADER_LEN 40 /* max size of header is 38 */
- struct {
- int write_timing;
- int ptr;
- char buf[MAX_HEADER_LEN];
- } header[MAX_HEADER_BUF];
- int h_ptr;
- int w_ptr;
- int ancillary_flag;
- /* variables for reservoir.c */
- int ResvSize; /* in bits */
- int ResvMax; /* in bits */
- int in_buffer_nsamples;
- sample_t *in_buffer_0;
- sample_t *in_buffer_1;
- #ifndef MFSIZE
- # define MFSIZE ( 3*1152 + ENCDELAY - MDCTDELAY )
- #endif
- sample_t mfbuf[2][MFSIZE];
- int mf_samples_to_encode;
- int mf_size;
- } EncStateVar_t;
- typedef struct {
- /* simple statistics */
- int bitrate_channelmode_hist[16][4 + 1];
- int bitrate_blocktype_hist[16][4 + 1 + 1]; /*norm/start/short/stop/mixed(short)/sum */
- int bitrate_index;
- int frame_number; /* number of frames encoded */
- int padding; /* padding for the current frame? */
- int mode_ext;
- int encoder_delay;
- int encoder_padding; /* number of samples of padding appended to input */
- } EncResult_t;
- /* variables used by quantize.c */
- typedef struct {
- /* variables for nspsytune */
- FLOAT longfact[SBMAX_l];
- FLOAT shortfact[SBMAX_s];
- FLOAT masking_lower;
- FLOAT mask_adjust; /* the dbQ stuff */
- FLOAT mask_adjust_short; /* the dbQ stuff */
- int OldValue[2];
- int CurrentStep[2];
- int pseudohalf[SFBMAX];
- int sfb21_extra; /* will be set in lame_init_params */
- int substep_shaping; /* 0 = no substep
- 1 = use substep shaping at last step(VBR only)
- (not implemented yet)
- 2 = use substep inside loop
- 3 = use substep inside loop and last step
- */
- char bv_scf[576];
- } QntStateVar_t;
- typedef struct {
- replaygain_t *rgdata;
- /* ReplayGain */
- } RpgStateVar_t;
- typedef struct {
- FLOAT noclipScale; /* user-specified scale factor required for preventing clipping */
- sample_t PeakSample;
- int RadioGain;
- int noclipGainChange; /* gain change required for preventing clipping */
- } RpgResult_t;
- typedef struct {
- int version; /* 0=MPEG-2/2.5 1=MPEG-1 */
- int samplerate_index;
- int sideinfo_len;
- int noise_shaping; /* 0 = none
- 1 = ISO AAC model
- 2 = allow scalefac_select=1
- */
- int subblock_gain; /* 0 = no, 1 = yes */
- int use_best_huffman; /* 0 = no. 1=outside loop 2=inside loop(slow) */
- int noise_shaping_amp; /* 0 = ISO model: amplify all distorted bands
- 1 = amplify within 50% of max (on db scale)
- 2 = amplify only most distorted band
- 3 = method 1 and refine with method 2
- */
- int noise_shaping_stop; /* 0 = stop at over=0, all scalefacs amplified or
- a scalefac has reached max value
- 1 = stop when all scalefacs amplified or
- a scalefac has reached max value
- 2 = stop when all scalefacs amplified
- */
- int full_outer_loop; /* 0 = stop early after 0 distortion found. 1 = full search */
- int lowpassfreq;
- int highpassfreq;
- int samplerate_in; /* input_samp_rate in Hz. default=44.1 kHz */
- int samplerate_out; /* output_samp_rate. */
- int channels_in; /* number of channels in the input data stream (PCM or decoded PCM) */
- int channels_out; /* number of channels in the output data stream (not used for decoding) */
- int mode_gr; /* granules per frame */
- int force_ms; /* force M/S mode. requires mode=1 */
- int quant_comp;
- int quant_comp_short;
- int use_temporal_masking_effect;
- int use_safe_joint_stereo;
- int preset;
- vbr_mode vbr;
- int vbr_avg_bitrate_kbps;
- int vbr_min_bitrate_index; /* min bitrate index */
- int vbr_max_bitrate_index; /* max bitrate index */
- int avg_bitrate;
- int enforce_min_bitrate; /* strictly enforce VBR_min_bitrate normaly, it will be violated for analog silence */
- int findReplayGain; /* find the RG value? default=0 */
- int findPeakSample;
- int decode_on_the_fly; /* decode on the fly? default=0 */
- int analysis;
- int disable_reservoir;
- int buffer_constraint; /* enforce ISO spec as much as possible */
- int free_format;
- int write_lame_tag; /* add Xing VBR tag? */
- int error_protection; /* use 2 bytes per frame for a CRC checksum. default=0 */
- int copyright; /* mark as copyright. default=0 */
- int original; /* mark as original. default=1 */
- int extension; /* the MP3 'private extension' bit. Meaningless */
- int emphasis; /* Input PCM is emphased PCM (for
- instance from one of the rarely
- emphased CDs), it is STRONGLY not
- recommended to use this, because
- psycho does not take it into account,
- and last but not least many decoders
- don't care about these bits */
- MPEG_mode mode;
- short_block_t short_blocks;
- float interChRatio;
- float msfix; /* Naoki's adjustment of Mid/Side maskings */
- float ATH_offset_db;/* add to ATH this many db */
- float ATH_offset_factor;/* change ATH by this factor, derived from ATH_offset_db */
- float ATHcurve; /* change ATH formula 4 shape */
- int ATHtype;
- int ATHonly; /* only use ATH */
- int ATHshort; /* only use ATH for short blocks */
- int noATH; /* disable ATH */
-
- float ATHfixpoint;
- float adjust_alto_db;
- float adjust_bass_db;
- float adjust_treble_db;
- float adjust_sfb21_db;
- float compression_ratio; /* sizeof(wav file)/sizeof(mp3 file) */
- /* lowpass and highpass filter control */
- FLOAT lowpass1, lowpass2; /* normalized frequency bounds of passband */
- FLOAT highpass1, highpass2; /* normalized frequency bounds of passband */
- /* scale input by this amount before encoding at least not used for MP3 decoding */
- FLOAT pcm_transform[2][2];
- FLOAT minval;
- } SessionConfig_t;
- struct lame_internal_flags {
- /********************************************************************
- * internal variables NOT set by calling program, and should not be *
- * modified by the calling program *
- ********************************************************************/
- /*
- * Some remarks to the Class_ID field:
- * The Class ID is an Identifier for a pointer to this struct.
- * It is very unlikely that a pointer to lame_global_flags has the same 32 bits
- * in it's structure (large and other special properties, for instance prime).
- *
- * To test that the structure is right and initialized, use:
- * if ( gfc -> Class_ID == LAME_ID ) ...
- * Other remark:
- * If you set a flag to 0 for uninit data and 1 for init data, the right test
- * should be "if (flag == 1)" and NOT "if (flag)". Unintended modification
- * of this element will be otherwise misinterpreted as an init.
- */
- # define LAME_ID 0xFFF88E3B
- unsigned long class_id;
- int lame_init_params_successful;
- int lame_encode_frame_init;
- int iteration_init_init;
- int fill_buffer_resample_init;
- SessionConfig_t cfg;
- /* variables used by lame.c */
- Bit_stream_struc bs;
- III_side_info_t l3_side;
- scalefac_struct scalefac_band;
- PsyStateVar_t sv_psy; /* DATA FROM PSYMODEL.C */
- PsyResult_t ov_psy;
- EncStateVar_t sv_enc; /* DATA FROM ENCODER.C */
- EncResult_t ov_enc;
- QntStateVar_t sv_qnt; /* DATA FROM QUANTIZE.C */
- RpgStateVar_t sv_rpg;
- RpgResult_t ov_rpg;
- /* optional ID3 tags, used in id3tag.c */
- struct id3tag_spec tag_spec;
- uint16_t nMusicCRC;
- uint16_t _unused;
- /* CPU features */
- struct {
- unsigned int MMX:1; /* Pentium MMX, Pentium II...IV, K6, K6-2,
- K6-III, Athlon */
- unsigned int AMD_3DNow:1; /* K6-2, K6-III, Athlon */
- unsigned int SSE:1; /* Pentium III, Pentium 4 */
- unsigned int SSE2:1; /* Pentium 4, K8 */
- unsigned int _unused:28;
- } CPU_features;
- VBR_seek_info_t VBR_seek_table; /* used for Xing VBR header */
- ATH_t *ATH; /* all ATH related stuff */
- PsyConst_t *cd_psy;
- /* used by the frame analyzer */
- plotting_data *pinfo;
- hip_t hip;
- /* functions to replace with CPU feature optimized versions in takehiro.c */
- int (*choose_table) (const int *ix, const int *const end, int *const s);
- void (*fft_fht) (FLOAT *, int);
- void (*init_xrpow_core) (gr_info * const cod_info, FLOAT xrpow[576], int upper,
- FLOAT * sum);
- lame_report_function report_msg;
- lame_report_function report_dbg;
- lame_report_function report_err;
- };
- #ifndef lame_internal_flags_defined
- #define lame_internal_flags_defined
- typedef struct lame_internal_flags lame_internal_flags;
- #endif
- /***********************************************************************
- *
- * Global Function Prototype Declarations
- *
- ***********************************************************************/
- void freegfc(lame_internal_flags * const gfc);
- void free_id3tag(lame_internal_flags * const gfc);
- extern int BitrateIndex(int, int, int);
- extern int FindNearestBitrate(int, int, int);
- extern int map2MP3Frequency(int freq);
- extern int SmpFrqIndex(int, int *const);
- extern int nearestBitrateFullIndex(uint16_t brate);
- extern FLOAT ATHformula(SessionConfig_t const *cfg, FLOAT freq);
- extern FLOAT freq2bark(FLOAT freq);
- void disable_FPE(void);
- /* log/log10 approximations */
- extern void init_log_table(void);
- extern ieee754_float32_t fast_log2(ieee754_float32_t x);
- int isResamplingNecessary(SessionConfig_t const* cfg);
- void fill_buffer(lame_internal_flags * gfc,
- sample_t *const mfbuf[2],
- sample_t const *const in_buffer[2], int nsamples, int *n_in, int *n_out);
- /* same as lame_decode1 (look in lame.h), but returns
- unclipped raw floating-point samples. It is declared
- here, not in lame.h, because it returns LAME's
- internal type sample_t. No more than 1152 samples
- per channel are allowed. */
- int hip_decode1_unclipped(hip_t hip, unsigned char *mp3buf,
- size_t len, sample_t pcm_l[], sample_t pcm_r[]);
- extern int has_MMX(void);
- extern int has_3DNow(void);
- extern int has_SSE(void);
- extern int has_SSE2(void);
- /***********************************************************************
- *
- * Macros about Message Printing and Exit
- *
- ***********************************************************************/
- extern void lame_report_def(const char* format, va_list args);
- extern void lame_report_fnc(lame_report_function print_f, const char *, ...);
- extern void lame_errorf(const lame_internal_flags * gfc, const char *, ...);
- extern void lame_debugf(const lame_internal_flags * gfc, const char *, ...);
- extern void lame_msgf(const lame_internal_flags * gfc, const char *, ...);
- #define DEBUGF lame_debugf
- #define ERRORF lame_errorf
- #define MSGF lame_msgf
- int is_lame_internal_flags_valid(const lame_internal_flags * gfp);
-
- extern void hip_set_pinfo(hip_t hip, plotting_data* pinfo);
- #ifdef __cplusplus
- }
- #endif
- #endif /* LAME_UTIL_H */
|