1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-04-30 15:49:41 +02:00
2013-10-24 04:32:13 +00:00

376 lines
11 KiB
C

/*
* TwoLAME: an optimized MPEG Audio Layer Two encoder
*
* Copyright (C) 2001-2004 Michael Cheng
* Copyright (C) 2004-2006 The TwoLAME Project
*
* 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.1 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
* Lesser 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
*
* $Id$
*
*/
#ifndef _COMMON_H
#define _COMMON_H
#ifdef _WIN32
# include "../win32/configwin.h"
#else
# include "config.h"
#endif
#include "twolame.h"
/***************************************************************************************
Common Definitions
****************************************************************************************/
#ifndef FLOAT
#define FLOAT double
#endif
#define NULL_CHAR '\0'
#define MAX_U_32_NUM 0xFFFFFFFF
#ifndef PI
#define PI 3.14159265358979
#endif
#ifndef E
#define E 2.71828182845
#endif
#define PI2 PI/2
#define PI4 PI/4
#define PI64 PI/64
#define LN_TO_LOG10 0.2302585093
#define BITS_IN_A_BYTE 8
#define WORD 16
#define MAX_NAME_SIZE 255
#define SBLIMIT 32
#define SSLIMIT 18
#define FFT_SIZE 1024
#define HAN_SIZE 512
#define SCALE_BLOCK 12
#define SCALE_RANGE 64
#define SCALE 32768
#define CRC16_POLYNOMIAL 0x8005
#define CRC8_POLYNOMIAL 0x1D
#define MIN(A, B) ((A) < (B) ? (A) : (B))
#define MAX(A, B) ((A) > (B) ? (A) : (B))
/* This is the smallest MNR a subband can have before it is counted
as 'noisy' by the logic which chooses the number of JS subbands */
#define NOISY_MIN_MNR 0.0
/***************************************************************************************
Psychacoustic Model 1/3 Definitions
****************************************************************************************/
#define NOISE 10
#define TONE 20
#define DBMIN -200.0
#define LAST -1
#define STOP -100
#define POWERNORM 90.3090 /* = 20 * log10(32768) to normalize */
/* max output power to 96 dB per spec */
/***************************************************************************************
Psychoacoustic Model 2/4 Definitions
****************************************************************************************/
#define LXMIN 32.0
/***************************************************************************************
psycho 0 mem struct
****************************************************************************************/
typedef struct psycho_0_mem_struct {
FLOAT ath_min[SBLIMIT];
} psycho_0_mem;
/***************************************************************************************
psycho 1 mem struct
****************************************************************************************/
#define DBTAB 1000
typedef struct {
int line;
FLOAT bark, hear, x;
} g_thres, *g_ptr;
typedef struct {
FLOAT x;
int type, next, map;
} mask, *mask_ptr;
typedef struct psycho_1_mem_struct {
int off[2];
FLOAT fft_buf[2][1408];
int *cbound;
int crit_band;
int sub_size;
mask_ptr power;
g_ptr ltg;
FLOAT dbtable[DBTAB];
} psycho_1_mem;
/***************************************************************************************
Psycho3 memory structure
****************************************************************************************/
#define HBLKSIZE 513
#define SUBSIZE 136
typedef struct psycho_3_mem_struct {
int off[2];
int freq_subset[SUBSIZE];
FLOAT bark[HBLKSIZE];
FLOAT ath[HBLKSIZE];
FLOAT fft_buf[2][1408];
#define CRITBANDMAX 32 /* this is much higher than it needs to be. really only about 24 */
int cbands; /* How many critical bands there really are */
int cbandindex[CRITBANDMAX]; /* The spectral line index of the start of each critical band */
FLOAT dbtable[DBTAB];
} psycho_3_mem;
/***************************************************************************************
Psycho2 & 4 memory structure
****************************************************************************************/
#define LOGBLKSIZE 10
#define BLKSIZE 1024
#define HBLKSIZE 513
#define CBANDS 64
#define TRIGTABLESIZE 6284
#define TRIGTABLESCALE 2000.0
typedef int ICB[CBANDS];
typedef int IHBLK[HBLKSIZE];
typedef FLOAT F32[32];
typedef FLOAT F2_32[2][32];
typedef FLOAT FCB[CBANDS];
typedef FLOAT FCBCB[CBANDS][CBANDS];
typedef FLOAT FBLK[BLKSIZE];
typedef FLOAT FHBLK[HBLKSIZE];
typedef FLOAT F2HBLK[2][HBLKSIZE];
typedef FLOAT F22HBLK[2][2][HBLKSIZE];
typedef FLOAT DCB[CBANDS];
typedef struct psycho_4_mem_struct {
int new;
int old;
int oldest;
int flush;
int sync_flush;
int syncsize;
FLOAT grouped_c[CBANDS];
FLOAT grouped_e[CBANDS];
FLOAT nb[CBANDS];
FLOAT cb[CBANDS];
FLOAT tb[CBANDS];
FLOAT ecb[CBANDS];
FLOAT bc[CBANDS];
FLOAT cbval[CBANDS];
FLOAT rnorm[CBANDS];
FLOAT wsamp_r[BLKSIZE], phi[BLKSIZE], energy[BLKSIZE], window[BLKSIZE];
FLOAT ath[HBLKSIZE], thr[HBLKSIZE], c[HBLKSIZE];
FLOAT fthr[HBLKSIZE], absthr[HBLKSIZE]; // psy2 only
int numlines[CBANDS];
int partition[HBLKSIZE];
FLOAT *tmn;
FCB *s;
FHBLK *lthr;
F2HBLK *r, *phi_sav;
FLOAT snrtmp[2][32];
FLOAT cos_table[TRIGTABLESIZE];
} psycho_4_mem, psycho_2_mem;
/***************************************************************************************
Subband utility structures
****************************************************************************************/
typedef struct subband_mem_struct {
FLOAT x[2][512];
FLOAT m[16][32];
int off[2];
int half[2];
} subband_mem;
/***************************************************************************************
Header and frame information
****************************************************************************************/
/* Raw Header Information Structure */
typedef struct {
int version;
int lay;
int error_protection;
int bitrate_index;
int samplerate_idx;
int padding;
int private_bit;
int mode;
int mode_ext;
int copyright;
int original;
int emphasis;
} frame_header;
typedef unsigned int subband_t[2][3][SCALE_BLOCK][SBLIMIT];
typedef FLOAT jsb_sample_t[3][SCALE_BLOCK][SBLIMIT];
typedef FLOAT sb_sample_t[2][3][SCALE_BLOCK][SBLIMIT];
/***************************************************************************************
twolame Global Options structure.
Defaults shown in []
++ means it is an advanced option. Only use it if you know what you're doing.
****************************************************************************************/
struct twolame_options_struct {
// Input PCM audio File Information
int samplerate_in; // mpeg1: 32000 [44100] 48000
// mpeg2: 16000 22050 24000
int samplerate_out;
int num_channels_in; // Number of channels on the input stream
int num_channels_out; // Number of channels on the output stream
// Output MP2 File Information
TWOLAME_MPEG_version version; // 0 mpeg2 [1] mpeg1
int bitrate; // for mpeg1:32, 48, 56, 64, 80, 96,112,128,160,[192], 224, 256,
// 320, 384
// for mpeg2: 8, 16, 24, 32, 40, 48, 56, 64, 80, [96], 112, 128, 144, 160
TWOLAME_MPEG_mode mode;
TWOLAME_Padding padding; // [PAD_NO]
int do_energy_levels; // Write energy level information into the end of the frame [FALSE]
int num_ancillary_bits; // Number of reserved ancillary bits [0] (Currently only available
// for non-VBR modes)
// Psychoacoustic Model options
int psymodel; // -1, 0, 1, 2, [3], 4 Psy model number
FLOAT athlevel; // Adjust the Absolute Threshold of Hearing curve by [0] dB
int quickmode; // Only calculate psy model ever X frames [FALSE]
int quickcount; // Only calculate psy model every [10] frames
// VBR Options
int vbr; // turn on VBR mode TRUE [FALSE]
int vbr_upper_index; // ++ [0] means no upper bitrate set for VBR mode. valid 1-15
// depending on mode
int vbr_max_bitrate;
FLOAT vbrlevel; // Set VBR quality. [0.0] (sensible range -10.0 -> 10.0)
// Miscellaneous Options That Nobody Ever Uses
TWOLAME_Emphasis emphasis; // [n]one, 5(50/15 microseconds), c(ccitt j.17)
int copyright; // [FALSE]
int original; // [FALSE]
int private_bit; // [0] Your very own bit in the header.
int error_protection; // [FALSE]
// Digital Audio Broadcasting Extensions
unsigned int do_dab; // Allocate space for the DigitalAudioBroadcasting info [FALSE]
unsigned int dab_crc_len; // Number of CRC bytes for DAB [2], 4
unsigned int dab_crc[4]; // DAB CRC bytes are inserted here. User must insert them in frame
unsigned int dab_xpad_len; // Number of bytes in the XPAD
// Processing Options
int verbosity; // Verbosity of output 0(never output a thing) [2] 100(output
// everything)
// Scaling
FLOAT scale;
FLOAT scale_left;
FLOAT scale_right;
// Bit allocation stuff
int lower_index;
int upper_index;
int bitrateindextobits[15];
int vbr_frame_count; // Used for debugging VBR
// Used by twolame_encode_frame
int twolame_init;
short int buffer[2][TWOLAME_SAMPLES_PER_FRAME]; // Sample buffer
unsigned int samples_in_buffer; // Number of samples currently in buffer
unsigned int psycount;
unsigned int num_crc_bits; // Number of bits CRC is calculated on
unsigned int bit_alloc[2][SBLIMIT];
unsigned int scfsi[2][SBLIMIT];
unsigned int scalar[2][3][SBLIMIT];
unsigned int j_scale[3][SBLIMIT];
FLOAT smrdef[2][32];
FLOAT smr[2][SBLIMIT];
FLOAT max_sc[2][SBLIMIT];
subband_t *subband;
jsb_sample_t *j_sample;
sb_sample_t *sb_sample;
/* Resampling stuff */
FLOAT resample_ratio;
void *resample_handle[2];
// memory for psycho models
psycho_0_mem *p0mem;
psycho_1_mem *p1mem;
psycho_2_mem *p2mem;
psycho_3_mem *p3mem;
psycho_4_mem *p4mem;
// memory for subband
subband_mem smem;
// Frame info
frame_header header;
int jsbound; // first band of joint stereo coding
int sblimit; // total number of sub bands
int tablenum;
int vbrstats[15];
};
#endif // _COMMON_H
// vim:ts=4:sw=4:nowrap: