1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
|
/*
* 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);
extern ieee754_float32_t fast_log2(ieee754_float32_t x);
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 */
|