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
|
/*
* Musepack audio compression
* Copyright (c) 2005-2009, The Musepack Development Team
* Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf
*
* 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, see <http://www.gnu.org/licenses/>
*/
#ifndef MPCENC_MPCENC_H
#define MPCENC_MPCENC_H
#include "libmpcenc.h"
#include "libmpcpsy.h"
#include <mpc/datatypes.h>
#include <mpc/minimax.h>
//// optimization/feature defines //////////////////////////////////
#ifndef NOT_INCLUDE_CONFIG_H
# include "config.h"
#endif
//// portable system includes //////////////////////////////////////
#include <stddef.h>
#include <math.h>
//// system dependent system includes //////////////////////////////
// low level I/O, where are prototypes and constants?
#if defined _WIN32 || defined __TURBOC__ || defined __ZTC__ || defined _MSC_VER
# include <io.h>
# include <fcntl.h>
# include <windows.h>
#elif defined __unix__ || defined __linux__ || defined __APPLE__
# include <sys/select.h>
# include <unistd.h>
# include <locale.h>
# include <langinfo.h>
#else
// .... add Includes for new Operating System here (with prefix: #elif defined)
# include <unistd.h>
#endif
#if defined __GLIBC__
# include <fpu_control.h>
#elif defined __FreeBSD__
# include <machine/floatingpoint.h>
#elif defined _MSC_VER
# include <float.h>
#endif
// Use termios for reading values from keyboard without echo and ENTER
#define USE_TERMIOS
// make debug output in tags.c stfu
#define STFU
#ifndef O_BINARY
# ifdef _O_BINARY
# define O_BINARY _O_BINARY
# else
# define O_BINARY 0
# endif
#endif
#if defined _WIN32 || defined __TURBOC__
# define strncasecmp(__s1,__s2,__n) strnicmp ((__s1), (__s2), (__n))
# define strcasecmp(__s1,__s2) stricmp ((__s1), (__s2))
#endif
#if defined _WIN32
# include <direct.h>
# define snprintf _snprintf
# define getcwd(__buff,__len) _getcwd ((__buff), (__len))
#endif
//// Binary/Low-Level-IO ///////////////////////////////////////////
//
#if defined __BORLANDC__ || defined _WIN32
# define FILENO(__fp) _fileno ((__fp))
#elif defined __CYGWIN__ || defined __TURBOC__ || defined __unix__ || defined __EMX__ || defined _MSC_VER
# define FILENO(__fp) fileno ((__fp))
#else
# define FILENO(__fp) fileno ((__fp))
#endif
//
// If we have access to a file via file name, we can open the file with an
// additional "b" or a O_BINARY within the (f)open function to get a
// transparent untranslated data stream which is necessary for audio bitstream
// data and also for PCM data. If we are working with
// stdin/stdout/FILENO_STDIN/FILENO_STDOUT we can't open the file with these
// attributes, because the files are already open. So we need a non
// standardized sequence to switch to this mode (not necessary for Unix).
// Mostly the sequence is the same for incoming and outgoing streams, but only
// mostly so we need one for IN and one for OUT.
// Macros are called with the file pointer and you get back the untransalted file
// pointer which can be equal or different from the original.
//
#if defined __EMX__
# define SETBINARY_IN(__fp) (_fsetmode ( (__fp), "b" ), (__fp))
# define SETBINARY_OUT(__fp) (_fsetmode ( (__fp), "b" ), (__fp))
#elif defined __TURBOC__ || defined __BORLANDC__
# define SETBINARY_IN(__fp) (setmode ( FILENO ((__fp)), O_BINARY ), (__fp))
# define SETBINARY_OUT(__fp) (setmode ( FILENO ((__fp)), O_BINARY ), (__fp))
#elif defined __CYGWIN__
# define SETBINARY_IN(__fp) (setmode ( FILENO ((__fp)), _O_BINARY ), (__fp))
# define SETBINARY_OUT(__fp) (setmode ( FILENO ((__fp)), _O_BINARY ), (__fp))
#elif defined _WIN32
# define SETBINARY_IN(__fp) (_setmode ( FILENO ((__fp)), _O_BINARY ), (__fp))
# define SETBINARY_OUT(__fp) (_setmode ( FILENO ((__fp)), _O_BINARY ), (__fp))
#elif defined _MSC_VER
# define SETBINARY_IN(__fp) (setmode ( FILENO ((__fp)), O_BINARY ), (__fp))
# define SETBINARY_OUT(__fp) (setmode ( FILENO ((__fp)), O_BINARY ), (__fp))
#elif defined __unix__
# define SETBINARY_IN(__fp) (__fp)
# define SETBINARY_OUT(__fp) (__fp)
#elif 0
# define SETBINARY_IN(__fp) (freopen ( NULL, "rb", (__fp) ), (__fp))
# define SETBINARY_OUT(__fp) (freopen ( NULL, "wb", (__fp) ), (__fp))
#else
# define SETBINARY_IN(__fp) (__fp)
# define SETBINARY_OUT(__fp) (__fp)
#endif
// file I/O using ANSI buffered file I/O via file pointer FILE* (fopen, fread, fwrite, fclose)
#define READ(fp,ptr,len) fread (ptr, 1, len, fp) // READ returns -1 or 0 on error/EOF, otherwise > 0
#define READ1(fp,ptr) fread (ptr, 1, 1, fp) // READ returns -1 or 0 on error/EOF, otherwise > 0
#ifdef _WIN32
# define POPEN_READ_BINARY_OPEN(cmd) _popen ((cmd), "rb")
#else
# define POPEN_READ_BINARY_OPEN(cmd) popen ((cmd), "r")
#endif
// Path separator
#if defined __unix__ || defined __bsdi__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __APPLE__
# define PATH_SEP '/'
# define DRIVE_SEP '\0'
# define EXE_EXT ""
# define DEV_NULL "/dev/null"
# define ENVPATH_SEP ':'
#elif defined _WIN32 || defined __TURBOC__ || defined __ZTC__ || defined _MSC_VER
# define PATH_SEP '\\'
# define DRIVE_SEP ':'
# define EXE_EXT ".exe"
# define DEV_NULL "\\nul"
# define ENVPATH_SEP ';'
#else
# define PATH_SEP '/' // Amiga: C:/
# define DRIVE_SEP ':'
# define EXE_EXT ""
# define DEV_NULL "nul"
# define ENVPATH_SEP ';'
#endif
#ifdef _WIN32
# define TitleBar(text) SetConsoleTitle (text)
#else
# define TitleBar(text) (void) (text)
#endif
//// constants /////////////////////////////////////////////////////
#define DECODER_DELAY (512 - 32 + 1)
#define BLK_SIZE (36 * 32)
//// procedures/functions //////////////////////////////////////////
// pipeopen.c
FILE* pipeopen ( const char* command, const char* filename );
// stderr.c
void SetStderrSilent ( mpc_bool_t state );
mpc_bool_t GetStderrSilent ( void );
int mpc_cdecl stderr_printf ( const char* format, ... );
// quant.h
#define SCFfac 0.832980664785f // = SCF[n-1]/SCF[n]
// wave_in.h
typedef struct {
FILE* fp; // File pointer to read data
mpc_size_t PCMOffset; // File offset of PCM data
long double SampleFreq; // Sample frequency in Hz
mpc_uint_t BitsPerSample; // used bits per sample, 8*BytesPerSample-7 <= BitsPerSample <= BytesPerSample
mpc_uint_t BytesPerSample; // allocated bytes per sample
mpc_uint_t Channels; // Number of channels, 1...8
mpc_size_t PCMBytes; // PCM Samples (in 8 bit units)
mpc_size_t PCMSamples; // PCM Samples per Channel
mpc_bool_t raw; // raw: headerless format
} wave_t;
typedef float SCFTriple [3];
// FIXME : put in lib header
void Init_FFT ( PsyModel* );
// FIXME : put in lib header
void Init_Psychoakustik ( PsyModel* );
SMRTyp Psychoakustisches_Modell ( PsyModel *, const int, const PCMDataTyp*, int* TransientL, int* TransientR );
void TransientenCalc ( int* Transient, const int* TransientL, const int* TransientR );
void RaiseSMR ( PsyModel*, const int, SMRTyp* );
void MS_LR_Entscheidung ( const int, unsigned char* MS, SMRTyp*, SubbandFloatTyp* );
void Init_Psychoakustiktabellen ( PsyModel* );
void NS_Analyse (PsyModel*, const int, const unsigned char* MS, const SMRTyp, const int* Transient );
void Analyse_Filter(const PCMDataTyp*, SubbandFloatTyp*, const int);
void Analyse_Init ( float Left, float Right, SubbandFloatTyp* out, const int MaxBand );
void SetQualityParams (PsyModel *, float );
int TestProfileParams ( PsyModel* );
extern const float Butfly [7]; // Antialiasing to calculate the subband powers
extern const float InvButfly [7]; // Antialiasing to calculate the masking thresholds
extern const float iw [PART_LONG]; // inverse partition-width for long
extern const float iw_short [PART_SHORT]; // inverse partition-width for short
extern const int wl [PART_LONG]; // w_low for long
extern const int wl_short [PART_SHORT]; // w_low for short
extern const int wh [PART_LONG]; // w_high for long
extern const int wh_short [PART_SHORT]; // w_high for short
// quant.c
extern float __invSCF [128 + 6]; // tabulated scalefactors (inverted)
#define invSCF (__invSCF + 6)
float ISNR_Schaetzer ( const float* samples, const float comp, const int res);
float ISNR_Schaetzer_Trans ( const float* samples, const float comp, const int res);
void QuantizeSubband ( unsigned int* qu_output, const float* input, const int res, float* errors, const int maxNsOrder );
void QuantizeSubbandWithNoiseShaping ( unsigned int* qu_output, const float* input, const int res, float* errors, const float* FIR );
void NoiseInjectionComp ( void );
// keyboard.c
int WaitKey ( void );
int CheckKeyKeep ( void );
int CheckKey ( void );
// regress.c
void Regression ( float* const _r, float* const _b, const float* p, const float* q );
// tags.c
void Init_Tags ( void );
int FinalizeTags ( FILE* fp, unsigned int Version, unsigned int flags );
int addtag ( const char* key, size_t keylen, const char* value, size_t valuelen, int converttoutf8, int flags );
int gettag ( const char* key, char* dst, size_t len );
int CopyTags ( const char* filename );
// wave_in.c
int Open_WAV_Header ( wave_t* type, const char* name );
size_t Read_WAV_Samples ( wave_t* t, const size_t RequestedSamples, PCMDataTyp* data, const ptrdiff_t offset, const float scalel, const float scaler, int* Silence );
int Read_WAV_Header ( wave_t* type );
// winmsg.c
#ifdef _WIN32
#define WIN32_MESSAGES 1 // support Windows-Messaging to Frontend
int SearchForFrontend ( void );
void SendQuitMessage ( void );
void SendModeMessage ( const int );
void SendStartupMessage ( const char*, const int);
void SendProgressMessage ( const int, const float, const float );
#else
# define WIN32_MESSAGES 0
# define SearchForFrontend() (0)
# define SendQuitMessage() (void)0
# define SendModeMessage(x) (void)0
# define SendStartupMessage(x,y) (void)0
# define SendProgressMessage(x,y,z) (void)0
#endif /* _WIN32 */
#define MPPENC_DENORMAL_FIX_BASE ( 32. * 1024. /* normalized sample value range */ / ( (float) (1 << 24 /* first bit below 32-bit PCM range */ ) ) )
#define MPPENC_DENORMAL_FIX_LEFT ( MPPENC_DENORMAL_FIX_BASE )
#define MPPENC_DENORMAL_FIX_RIGHT ( MPPENC_DENORMAL_FIX_BASE * 0.5f )
#ifndef LAST_HUFFMAN
# define LAST_HUFFMAN 7
#endif
#endif /* MPCENC_MPCENC_H */
/* end of mpcenc.h */
|