617 lines
21 KiB
C
617 lines
21 KiB
C
/*
|
|
* 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 */
|