mirror of
				https://github.com/cookiengineer/audacity
				synced 2025-10-31 22:23:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			376 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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: 
 |