mirror of
https://github.com/DrBeef/QuestZDoom.git
synced 2025-03-06 09:21:22 +00:00
546 lines
19 KiB
C
546 lines
19 KiB
C
/*
|
|
* lame utility library include file
|
|
*
|
|
* Copyright (c) 1999 Albert L Faber
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser 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 Lesser 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"
|
|
|
|
#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 HAN_SIZE 512
|
|
#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 malloc_aligned(aligned_pointer_t * ptr, unsigned int size, unsigned int bytes);
|
|
void free_aligned(aligned_pointer_t * ptr);
|
|
|
|
|
|
|
|
typedef void (*iteration_loop_t) (lame_global_flags const * gfp,
|
|
FLOAT pe[2][2], FLOAT ms_ratio[2],
|
|
III_psy_ratio ratio[2][2]);
|
|
|
|
|
|
/* "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;
|
|
|
|
|
|
|
|
/* variables used for --nspsytune */
|
|
typedef struct {
|
|
/* variables for nspsytune */
|
|
FLOAT last_en_subshort[4][9];
|
|
int last_attacks[4];
|
|
FLOAT pefirbuf[19];
|
|
FLOAT longfact[SBMAX_l];
|
|
FLOAT shortfact[SBMAX_s];
|
|
|
|
/* short block tuning */
|
|
FLOAT attackthre;
|
|
FLOAT attackthre_s;
|
|
} nsPsy_t;
|
|
|
|
|
|
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; /* 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 mask_adjust; /* the dbQ stuff */
|
|
FLOAT mask_adjust_short; /* the dbQ stuff */
|
|
/* at transition from one scalefactor band to next */
|
|
FLOAT bo_l_weight[SBMAX_l]; /* band weight long scalefactor bands */
|
|
FLOAT bo_s_weight[SBMAX_s]; /* band weight short scalefactor bands */
|
|
} PSY_t;
|
|
|
|
|
|
#define MAX_CHANNELS 2
|
|
|
|
|
|
|
|
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_encode_frame_init;
|
|
int iteration_init_init;
|
|
int fill_buffer_resample_init;
|
|
|
|
#ifndef MFSIZE
|
|
# define MFSIZE ( 3*1152 + ENCDELAY - MDCTDELAY )
|
|
#endif
|
|
sample_t mfbuf[2][MFSIZE];
|
|
|
|
|
|
struct {
|
|
void (*msgf) (const char *format, va_list ap);
|
|
void (*debugf) (const char *format, va_list ap);
|
|
void (*errorf) (const char *format, va_list ap);
|
|
} report;
|
|
|
|
int mode_gr; /* granules per frame */
|
|
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) */
|
|
double resample_ratio; /* input_samp_rate/output_samp_rate */
|
|
|
|
int mf_samples_to_encode;
|
|
int mf_size;
|
|
int VBR_min_bitrate; /* min bitrate index */
|
|
int VBR_max_bitrate; /* max bitrate index */
|
|
int bitrate_index;
|
|
int samplerate_index;
|
|
int mode_ext;
|
|
|
|
|
|
/* lowpass and highpass filter control */
|
|
FLOAT lowpass1, lowpass2; /* normalized frequency bounds of passband */
|
|
FLOAT highpass1, highpass2; /* normalized frequency bounds of passband */
|
|
|
|
int noise_shaping; /* 0 = none
|
|
1 = ISO AAC model
|
|
2 = allow scalefac_select=1
|
|
*/
|
|
|
|
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 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
|
|
*/
|
|
|
|
int psymodel; /* 1 = gpsycho. 0 = none */
|
|
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 subblock_gain; /* 0 = no, 1 = yes */
|
|
int use_best_huffman; /* 0 = no. 1=outside loop 2=inside loop(slow) */
|
|
|
|
int full_outer_loop; /* 0 = stop early after 0 distortion found. 1 = full search */
|
|
|
|
|
|
/* variables used by lame.c */
|
|
Bit_stream_struc bs;
|
|
III_side_info_t l3_side;
|
|
FLOAT ms_ratio[2];
|
|
|
|
/* used for padding */
|
|
int padding; /* padding for the current frame? */
|
|
int frac_SpF;
|
|
int slot_lag;
|
|
|
|
|
|
/* optional ID3 tags, used in id3tag.c */
|
|
struct id3tag_spec tag_spec;
|
|
uint16_t nMusicCRC;
|
|
|
|
|
|
/* variables used by quantize.c */
|
|
int OldValue[2];
|
|
int CurrentStep[2];
|
|
|
|
FLOAT masking_lower;
|
|
char bv_scf[576];
|
|
int pseudohalf[SFBMAX];
|
|
|
|
int sfb21_extra; /* will be set in lame_init_params */
|
|
|
|
/* variables used by util.c */
|
|
/* BPC = maximum number of filter convolution windows to precompute */
|
|
#define BPC 320
|
|
sample_t *inbuf_old[2];
|
|
sample_t *blackfilt[2 * BPC + 1];
|
|
double itime[2];
|
|
int sideinfo_len;
|
|
|
|
/* variables for newmdct.c */
|
|
FLOAT sb_sample[2][2][18][SBLIMIT];
|
|
FLOAT amp_filter[32];
|
|
|
|
/* 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 */
|
|
|
|
scalefac_struct scalefac_band;
|
|
|
|
/* DATA FROM PSYMODEL.C */
|
|
/* The static variables "r", "phi_sav", "new", "old" and "oldest" have */
|
|
/* to be remembered for the unpredictability measure. For "r" and */
|
|
/* "phi_sav", the first index from the left is the channel select and */
|
|
/* the second index is the "age" of the data. */
|
|
FLOAT minval_l[CBANDS];
|
|
FLOAT minval_s[CBANDS];
|
|
FLOAT nb_1[4][CBANDS], nb_2[4][CBANDS];
|
|
FLOAT nb_s1[4][CBANDS], nb_s2[4][CBANDS];
|
|
FLOAT *s3_ss;
|
|
FLOAT *s3_ll;
|
|
FLOAT decay;
|
|
|
|
III_psy_xmin thm[4];
|
|
III_psy_xmin en[4];
|
|
|
|
/* fft and energy calculation */
|
|
FLOAT tot_ener[4];
|
|
|
|
/* loudness calculation (for adaptive threshold of hearing) */
|
|
FLOAT loudness_sq[2][2]; /* loudness^2 approx. per granule and channel */
|
|
FLOAT loudness_sq_save[2]; /* account for granule delay of L3psycho_anal */
|
|
|
|
|
|
/* Scale Factor Bands */
|
|
FLOAT mld_l[SBMAX_l], mld_s[SBMAX_s];
|
|
int bm_l[SBMAX_l], bo_l[SBMAX_l];
|
|
int bm_s[SBMAX_s], bo_s[SBMAX_s];
|
|
int npart_l, npart_s;
|
|
|
|
int s3ind[CBANDS][2];
|
|
int s3ind_s[CBANDS][2];
|
|
|
|
int numlines_s[CBANDS];
|
|
int numlines_l[CBANDS];
|
|
FLOAT rnumlines_l[CBANDS];
|
|
FLOAT mld_cb_l[CBANDS], mld_cb_s[CBANDS];
|
|
int numlines_s_num1;
|
|
int numlines_l_num1;
|
|
|
|
/* ratios */
|
|
FLOAT pe[4];
|
|
FLOAT ms_ratio_s_old, ms_ratio_l_old;
|
|
FLOAT ms_ener_ratio_old;
|
|
|
|
/* block type */
|
|
int blocktype_old[2];
|
|
|
|
/* 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 */
|
|
} CPU_features;
|
|
|
|
/* 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);
|
|
|
|
|
|
|
|
nsPsy_t nsPsy; /* variables used for --nspsytune */
|
|
|
|
VBR_seek_info_t VBR_seek_table; /* used for Xing VBR header */
|
|
|
|
ATH_t *ATH; /* all ATH related stuff */
|
|
PSY_t *PSY;
|
|
|
|
int nogap_total;
|
|
int nogap_current;
|
|
|
|
|
|
/* ReplayGain */
|
|
unsigned int decode_on_the_fly:1;
|
|
unsigned int findReplayGain:1;
|
|
unsigned int findPeakSample:1;
|
|
sample_t PeakSample;
|
|
int RadioGain;
|
|
int AudiophileGain;
|
|
replaygain_t *rgdata;
|
|
|
|
int noclipGainChange; /* gain change required for preventing clipping */
|
|
FLOAT noclipScale; /* user-specified scale factor required for preventing clipping */
|
|
|
|
|
|
/* simple statistics */
|
|
int bitrate_stereoMode_Hist[16][4 + 1];
|
|
int bitrate_blockType_Hist[16][4 + 1 + 1]; /*norm/start/short/stop/mixed(short)/sum */
|
|
|
|
/* used by the frame analyzer */
|
|
plotting_data *pinfo;
|
|
hip_t hip;
|
|
|
|
int in_buffer_nsamples;
|
|
sample_t *in_buffer_0;
|
|
sample_t *in_buffer_1;
|
|
|
|
iteration_loop_t iteration_loop;
|
|
};
|
|
|
|
#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(const int brate);
|
|
extern FLOAT ATHformula(FLOAT freq, lame_global_flags const *gfp);
|
|
extern FLOAT freq2bark(FLOAT freq);
|
|
extern FLOAT freq2cbw(FLOAT freq);
|
|
void disable_FPE(void);
|
|
|
|
/* log/log10 approximations */
|
|
extern void init_log_table(void);
|
|
|
|
|
|
|
|
void fill_buffer(lame_global_flags const *gfp,
|
|
sample_t * mfbuf[2],
|
|
sample_t const *in_buffer[2], int nsamples, int *n_in, int *n_out);
|
|
|
|
int fill_buffer_resample(lame_global_flags const *gfp,
|
|
sample_t * outbuf,
|
|
int desired_len,
|
|
sample_t const *inbuf, int len, int *num_used, int channels);
|
|
|
|
/* same as hip_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 *buffer,
|
|
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_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
|
|
|
|
extern void hip_set_pinfo(hip_t hip, plotting_data* pinfo);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* LAME_UTIL_H */
|