1 /*{{{ #defines */ 2 3 #include <limits.h> 4 #include "lame.h" 5 #include "util.h" 6 7 #define ENCDELAY 576 8 #define MDCTDELAY 48 9 #define BLKSIZE 1024 10 #define HBLKSIZE (BLKSIZE/2 + 1) 11 #define BLKSIZE_s 256 12 #define HBLKSIZE_s (BLKSIZE_s/2 + 1) 13 #define MAX_TABLES 1002 14 #define TAPS 32 15 #define WINDOW_SIZE 15.5 16 #define WINDOW hanning 17 #define inline __inline 18 19 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 20 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 21 22 #ifndef M_PIl 23 # define M_PIl 3.1415926535897932384626433832795029L 24 #endif 25 26 #define SIN sin 27 #define COS cos 28 29 /*}}}*/ 30 /*{{{ object ID's */ 31 32 #define RESAMPLE_ID 0x52455341LU 33 #define PSYCHO_ID 0x50535943LU 34 #define BITSTREAM_ID 0x42495453LU 35 36 /*}}}*/ 37 /*{{{ typedef's */ 38 39 typedef float float32_t; // IEEE-754 32 bit floating point 40 typedef double float64_t; // IEEE-754 64 bit floating point 41 typedef long double float80_t; // IEEE-854 80 bit floating point, if available 42 typedef long double float_t; // temporarly results of float operations 43 typedef long double double_t; // temporarly results of double operations 44 typedef long double longdouble_t; // temporarly results of long double operations 45 46 typedef float_t (*scalar_t) ( const sample_t* p, const sample_t* q ); 47 typedef float_t (*scalarn_t) ( const sample_t* p, const sample_t* q, size_t len ); 48 49 /*}}}*/ 50 /*{{{ data direction attributes */ 51 52 /* 53 * These are data stream direction attributes like used in Ada83/Ada95 and in RPC 54 * The data direction is seen from the caller to the calling function. 55 * Examples: 56 * 57 * size_t fread ( void INOUT* buffer, size_t items, size_t itemsize, FILE INOUT* fp ); 58 * size_t fwrite ( void OUT * buffer, size_t items, size_t itemsize, FILE INOUT* fp ); 59 * size_t memset ( void IN * buffer, unsigned char value, size_t size ); 60 * 61 * Return values are implizit IN (note that here C uses the opposite attribute). 62 * Arguments not transmitted via references are implizit OUT. 63 */ 64 65 #define OUT /* [out] */ const 66 #define INOUT /* [inout] */ 67 #define IN /* [in] */ 68 #define OUTTR /* [out]: data is modified like [inout], but you don't get any useful back */ 69 70 /*}}}*/ 71 /*{{{ Test some error conditions */ 72 73 #ifndef __LOC__ 74 # define _STR2(x) #x 75 # define _STR1(x) _STR2(x) 76 # define __LOC__ __FILE__ "(" _STR1(__LINE__) ") : warning: " 77 #endif 78 79 /* The current code doesn't work on machines with non 8 bit char's in any way, so abort */ 80 81 #if CHAR_BIT != 8 82 # pragma message ( __LOC__ "Machines with CHAR_BIT != 8 not yet supported" ) 83 # pragma error 84 #endif 85 86 /*}}}*/ 87 88 /* 89 * Now some information how PCM data can be specified. PCM data 90 * is specified by 3 attributes: pointer, length information 91 * and attributes. 92 * - Audio is always stored in 2D arrays, which are collapsing to 1D 93 * in the case of monaural input 94 * - 2D arrays can be stored as 2D arrays or as pointers to 1D arrays. 95 * - 2D data can be stored as samples*channels or as channels*samples 96 * - This gives 4 kinds of storing PCM data: 97 * + pcm [samples][channels] (LAME_INTERLEAVED) 98 * + pcm [channels][samples] (LAME_CHAINED) 99 * + (*pcm) [samples] (LAME_INDIRECT) 100 * + (*pcm) [channels] 101 * - The last I have never seen and it have a huge overhead (67% ... 200%), 102 * so the first three are implemented. 103 * - The monaural 1D cases can also be handled by the first two attributes 104 */ 105 106 #define LAME_INTERLEAVED 0x10000000 107 #define LAME_CHAINED 0x20000000 108 #define LAME_INDIRECT 0x30000000 109 110 /* 111 * Now we need some information about the byte order of the data. 112 * There are 4 cases possible (if you are not fully support such strange 113 * Machines like the PDPs): 114 * - You know the absolute byte order of the data (LAME_LITTLE_ENDIAN, LAME_BIG_ENDIAN) 115 * - You know the byte order from the view of the current machine 116 * (LAME_NATIVE_ENDIAN, LAME_OPPOSITE_ENDIAN) 117 * - The use of LAME_OPPOSITE_ENDIAN is NOT recommended because it is 118 * is a breakable attribute, use LAME_LITTLE_ENDIAN or LAME_BIG_ENDIAN 119 * instead 120 */ 121 122 #define LAME_NATIVE_ENDIAN 0x00000000 123 #define LAME_OPPOSITE_ENDIAN 0x01000000 124 #define LAME_LITTLE_ENDIAN 0x02000000 125 #define LAME_BIG_ENDIAN 0x03000000 126 127 /* 128 * The next attribute is the data type of the input data. 129 * There are currently 2 kinds of input data: 130 * - C based: 131 * LAME_{SHORT,INT,LONG} 132 * LAME_{FLOAT,DOUBLE,LONGDOUBLE} 133 * - Binary representation based: 134 * LAME_{UINT,INT}{8,16,24,32} 135 * LAME_{A,U}LAW 136 * LAME_FLOAT{32,64,80_ALIGN{2,4,8}} 137 * 138 * Don't use the C based for external data. 139 */ 140 141 #define LAME_SILENCE 0x00010000 142 #define LAME_UINT8 0x00020000 143 #define LAME_INT8 0x00030000 144 #define LAME_UINT16 0x00040000 145 #define LAME_INT16 0x00050000 146 #define LAME_UINT24 0x00060000 147 #define LAME_INT24 0x00070000 148 #define LAME_UINT32 0x00080000 149 #define LAME_INT32 0x00090000 150 #define LAME_FLOAT32 0x00140000 151 #define LAME_FLOAT64 0x00180000 152 #define LAME_FLOAT80_ALIGN2 0x001A0000 153 #define LAME_FLOAT80_ALIGN4 0x001C0000 154 #define LAME_FLOAT80_ALIGN8 0x00200000 155 #define LAME_SHORT 0x00210000 156 #define LAME_INT 0x00220000 157 #define LAME_LONG 0x00230000 158 #define LAME_FLOAT 0x00240000 159 #define LAME_DOUBLE 0x00250000 160 #define LAME_LONGDOUBLE 0x00260000 161 #define LAME_ALAW 0x00310000 162 #define LAME_ULAW 0x00320000 163 164 /* 165 * The last attribute is the number of input channels. Currently 166 * 1...65535 channels are possible, but only 1 and 2 are supported. 167 * So matrixing or MPEG-2 MultiChannelSupport are not a big problem. 168 * 169 * Note: Some people use the word 'stereo' for 2 channel stereophonic sound. 170 * But stereophonic sound is a collection of ALL methods to restore the 171 * stereophonic sound field starting from 2 channels up to audio 172 * holography. 173 */ 174 175 #define LAME_MONO 0x00000001 176 #define LAME_STEREO 0x00000002 177 #define LAME_STEREO_2_CHANNELS 0x00000002 178 #define LAME_STEREO_3_CHANNELS 0x00000003 179 #define LAME_STEREO_4_CHANNELS 0x00000004 180 #define LAME_STEREO_5_CHANNELS 0x00000005 181 #define LAME_STEREO_6_CHANNELS 0x00000006 182 #define LAME_STEREO_7_CHANNELS 0x00000007 183 #define LAME_STEREO_65535_CHANNELS\ 184 0x0000FFFF 185 186 187 extern scalar_t scalar4; 188 extern scalar_t scalar8; 189 extern scalar_t scalar12; 190 extern scalar_t scalar16; 191 extern scalar_t scalar20; 192 extern scalar_t scalar24; 193 extern scalar_t scalar32; 194 extern scalarn_t scalar4n; 195 extern scalarn_t scalar1n; 196 197 float_t scalar04_float32_i387 ( const float32_t* p, const float32_t* q ); 198 float_t scalar08_float32_i387 ( const float32_t* p, const float32_t* q ); 199 float_t scalar12_float32_i387 ( const float32_t* p, const float32_t* q ); 200 float_t scalar16_float32_i387 ( const float32_t* p, const float32_t* q ); 201 float_t scalar20_float32_i387 ( const float32_t* p, const float32_t* q ); 202 float_t scalar24_float32_i387 ( const float32_t* p, const float32_t* q ); 203 float_t scalar32_float32_i387 ( const float32_t* p, const float32_t* q ); 204 float_t scalar4n_float32_i387 ( const float32_t* p, const float32_t* q, const size_t len ); 205 float_t scalar1n_float32_i387 ( const float32_t* p, const float32_t* q, const size_t len ); 206 207 float_t scalar04_float32_3DNow ( const float32_t* p, const float32_t* q ); 208 float_t scalar08_float32_3DNow ( const float32_t* p, const float32_t* q ); 209 float_t scalar12_float32_3DNow ( const float32_t* p, const float32_t* q ); 210 float_t scalar16_float32_3DNow ( const float32_t* p, const float32_t* q ); 211 float_t scalar20_float32_3DNow ( const float32_t* p, const float32_t* q ); 212 float_t scalar24_float32_3DNow ( const float32_t* p, const float32_t* q ); 213 float_t scalar32_float32_3DNow ( const float32_t* p, const float32_t* q ); 214 float_t scalar4n_float32_3DNow ( const float32_t* p, const float32_t* q, const size_t len ); 215 float_t scalar1n_float32_3DNow ( const float32_t* p, const float32_t* q, const size_t len ); 216 217 float_t scalar04_float32_SIMD ( const float32_t* p, const float32_t* q ); 218 float_t scalar08_float32_SIMD ( const float32_t* p, const float32_t* q ); 219 float_t scalar12_float32_SIMD ( const float32_t* p, const float32_t* q ); 220 float_t scalar16_float32_SIMD ( const float32_t* p, const float32_t* q ); 221 float_t scalar20_float32_SIMD ( const float32_t* p, const float32_t* q ); 222 float_t scalar24_float32_SIMD ( const float32_t* p, const float32_t* q ); 223 float_t scalar32_float32_SIMD ( const float32_t* p, const float32_t* q ); 224 float_t scalar4n_float32_SIMD ( const float32_t* p, const float32_t* q, const size_t len ); 225 float_t scalar1n_float32_SIMD ( const float32_t* p, const float32_t* q, const size_t len ); 226 227 float_t scalar04_float32 ( const float32_t* p, const float32_t* q ); 228 float_t scalar08_float32 ( const float32_t* p, const float32_t* q ); 229 float_t scalar12_float32 ( const float32_t* p, const float32_t* q ); 230 float_t scalar16_float32 ( const float32_t* p, const float32_t* q ); 231 float_t scalar20_float32 ( const float32_t* p, const float32_t* q ); 232 float_t scalar24_float32 ( const float32_t* p, const float32_t* q ); 233 float_t scalar32_float32 ( const float32_t* p, const float32_t* q ); 234 float_t scalar4n_float32 ( const float32_t* p, const float32_t* q, const size_t len ); 235 float_t scalar1n_float32 ( const float32_t* p, const float32_t* q, const size_t len ); 236 237 238 /*{{{ some prototypes */ 239 240 resample_t* resample_open ( 241 OUT long double sampfreq_in, // [Hz] 242 OUT long double sampfreq_out, // [Hz] 243 OUT double lowpass_freq, // [Hz] or <0 for auto mode 244 OUT int quality ); // Proposal: 0 default, 1 sample select, 2 linear interpol, 4 4-point interpolation, 32 32-point interpolation 245 246 int resample_buffer ( // return code, 0 for success 247 INOUT resample_t *const r, // internal structure 248 IN sample_t *const out, // where to write the output data 249 INOUT size_t *const out_req_len, // requested output data len/really written output data len 250 OUT sample_t *const in, // where are the input data? 251 INOUT size_t *const in_avail_len, // available input data len/consumed input data len 252 OUT size_t channel ); // number of the channel (needed for buffering) 253 254 int resample_close ( INOUT resample_t* const r ); 255 256 void init_scalar_functions ( OUT lame_t* const lame ); 257 long double unround_samplefrequency ( OUT long double freq ); 258 259 #if 0 260 int lame_encode_mp3_frame ( // return code, 0 for success 261 INOUT lame_global_flags*, // internal context structure 262 OUTTR sample_t * inbuf_l, // data for left channel 263 OUTTR sample_t * inbuf_r, // data for right channel 264 IN uint8_t * mp3buf, // where to write the coded data 265 OUT size_t mp3buf_size ); // maximum size of coded data 266 #endif 267 268 int lame_encode_ogg_frame ( // return code, 0 for success 269 INOUT lame_global_flags*, // internal context structure 270 OUT sample_t * inbuf_l, // data for left channel 271 OUT sample_t * inbuf_r, // data for right channel 272 IN uint8_t * mp3buf, // where to write the coded data 273 OUT size_t mp3buf_size ); // maximum size of coded data 274 275 /*}}}*/ 276 277 /* end of pcm.h */ 278