diff options
author | Lucas Eckels <eckels@google.com> | 2012-08-06 15:17:56 -0700 |
---|---|---|
committer | Lucas Eckels <eckels@google.com> | 2012-08-08 09:29:17 -0700 |
commit | 3d540f5de5b3a28ce6ad855cef7d9d9a44242c07 (patch) | |
tree | 56367e03b9d9fe3cce806508c4d7553647945b91 /src/libmpg123/optimize.h | |
parent | 9e51f014ada352e89237a6981093860291c8150d (diff) | |
download | mpg123-3d540f5de5b3a28ce6ad855cef7d9d9a44242c07.tar.gz |
Add mpg123 1.8.1 source
Change-Id: I602e744b1e24d95e203c05b0e93d15d373a45639
Diffstat (limited to 'src/libmpg123/optimize.h')
-rw-r--r-- | src/libmpg123/optimize.h | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/src/libmpg123/optimize.h b/src/libmpg123/optimize.h new file mode 100644 index 0000000..f3b167f --- /dev/null +++ b/src/libmpg123/optimize.h @@ -0,0 +1,211 @@ +#ifndef MPG123_H_OPTIMIZE +#define MPG123_H_OPTIMIZE +/* + optimize: get a grip on the different optimizations + + copyright 2007 by the mpg123 project - free software under the terms of the LGPL 2.1 + see COPYING and AUTHORS files in distribution or http://mpg123.org + initially written by Thomas Orgis, taking from mpg123.[hc] + + for building mpg123 with one optimization only, you have to choose exclusively between + OPT_GENERIC (generic C code for everyone) + OPT_GENERIC_DITHER (same with dithering for 1to1) + OPT_I386 (Intel i386) + OPT_I486 (Somewhat special code for i486; does not work together with others.) + OPT_I586 (Intel Pentium) + OPT_I586_DITHER (Intel Pentium with dithering/noise shaping for enhanced quality) + OPT_MMX (Intel Pentium and compatibles with MMX, fast, but not the best accuracy) + OPT_3DNOW (AMD 3DNow!, K6-2/3, Athlon, compatibles...) + OPT_3DNOWEXT (AMD 3DNow! extended, generally Athlon, compatibles...) + OPT_ALTIVEC (Motorola/IBM PPC with AltiVec under MacOSX) + OPT_X86_64 (x86-64 / AMD64 / Intel 64) + + or you define OPT_MULTI and give a combination which makes sense (do not include i486, do not mix altivec and x86). + + I still have to examine the dynamics of this here together with REAL_IS_FIXED. + Basic point is: Don't use REAL_IS_FIXED with something else than generic or i386. + + Also, one should minimize code size by really ensuring that only functions that are really needed are included. + Currently, all generic functions will be always there (to be safe for fallbacks for advanced decoders). + Strictly, at least the synth_1to1 should not be necessary for single-decoder mode. +*/ + + +/* Runtime optimization interface now here: */ + +enum optdec +{ /* autodec needs to be =0 and the first, nodec needs to be the last -- for loops! */ + autodec=0, generic, generic_dither, idrei, + ivier, ifuenf, ifuenf_dither, mmx, + dreidnow, dreidnowext, altivec, sse, x86_64, + nodec +}; +enum optcla { nocla=0, normal, mmxsse }; + +/* - Set up the table of synth functions for current decoder choice. */ +int frame_cpu_opt(mpg123_handle *fr, const char* cpu); +/* - Choose, from the synth table, the synth functions to use for current output format/rate. */ +int set_synth_functions(mpg123_handle *fr); +/* - Parse decoder name and return numerical code. */ +enum optdec dectype(const char* decoder); +/* - Return the default decoder type. */ +enum optdec defdec(void); +/* - Return the class of a decoder type (mmxsse or normal). */ +enum optcla decclass(const enum optdec); + +/* Now comes a whole lot of definitions, for multi decoder mode and single decoder mode. + Because of the latter, it may look redundant at times. */ + +/* this is included in mpg123.h, which includes config.h */ +#ifdef CCALIGN +#define ALIGNED(a) __attribute__((aligned(a))) +#else +#define ALIGNED(a) +#endif + +/* Safety catch for invalid decoder choice. */ +#ifdef REAL_IS_FIXED +#if (defined OPT_I486) || (defined OPT_I586) || (defined OPT_I586_DITHER) \ + || (defined OPT_MMX) || (defined OPT_SSE) || (defined_OPT_ALTIVEC) \ + || (defined OPT_3DNOW) || (defined OPT_3DNOWEXT) || (defined OPT_X86_64) || (defined OPT_GENERIC_DITHER) +#error "Bad decoder choice together with fixed point math!" +#endif +#endif + +#if (defined NO_LAYER1 && defined NO_LAYER2) +#define NO_LAYER12 +#endif + +#ifdef OPT_GENERIC +#ifndef OPT_MULTI +# define defopt generic +#endif +#endif + +#ifdef OPT_GENERIC_DITHER +#define OPT_DITHER +#ifndef OPT_MULTI +# define defopt generic_dither +#endif +#endif + +/* i486 is special... always alone! */ +#ifdef OPT_I486 +#define OPT_X86 +#define defopt ivier +#ifdef OPT_MULTI +#error "i486 can only work alone!" +#endif +#define FIR_BUFFER_SIZE 128 +#define FIR_SIZE 16 +#endif + +#ifdef OPT_I386 +#define OPT_X86 +#ifndef OPT_MULTI +# define defopt idrei +#endif +#endif + +#ifdef OPT_I586 +#define OPT_X86 +#ifndef OPT_MULTI +# define defopt ifuenf +#endif +#endif + +#ifdef OPT_I586_DITHER +#define OPT_X86 +#define OPT_DITHER +#ifndef OPT_MULTI +# define defopt ifuenf_dither +#endif +#endif + +/* We still have some special code around MMX tables. */ + +#ifdef OPT_MMX +#define OPT_MMXORSSE +#define OPT_X86 +#ifndef OPT_MULTI +# define defopt mmx +#endif +#endif + +#ifdef OPT_SSE +#define OPT_MMXORSSE +#define OPT_MPLAYER +#define OPT_X86 +#ifndef OPT_MULTI +# define defopt sse +#endif +#endif + +#ifdef OPT_3DNOWEXT +#define OPT_MMXORSSE +#define OPT_MPLAYER +#define OPT_X86 +#ifndef OPT_MULTI +# define defopt dreidnowext +# define opt_dct36(fr) dct36_3dnowext +#endif +#endif + +#ifdef OPT_MPLAYER +extern const int costab_mmxsse[]; +#endif + +/* 3dnow used to use synth_1to1_i586 for mono / 8bit conversion - was that intentional? */ +/* I'm trying to skip the pentium code here ... until I see that that is indeed a bad idea */ +#ifdef OPT_3DNOW +#define OPT_X86 +#ifndef OPT_MULTI +# define defopt dreidnow +# define opt_dct36(fr) dct36_3dnow +#endif +#endif + +#ifdef OPT_ALTIVEC +#ifndef OPT_MULTI +# define defopt altivec +#endif +#endif + +#ifdef OPT_X86_64 +#define OPT_MMXORSSE +#ifndef OPT_MULTI +# define defopt x86_64 +#endif +#endif + +/* used for multi opt mode and the single 3dnow mode to have the old 3dnow test flag still working */ +void check_decoders(void); + +/* Announce the data in dnoise.c ... */ +#ifdef OPT_DITHER +#define DITHERSIZE 65536 +extern float dithernoise[DITHERSIZE]; +#endif + +/* + Now come two blocks of standard definitions for multi-decoder mode and single-decoder mode. + Most stuff is so automatic that it's indeed generated by some inline shell script. + Remember to use these scripts when possible, instead of direct repetitive hacking. +*/ + +#ifdef OPT_MULTI + +# define defopt nodec + +# if (defined OPT_3DNOW || defined OPT_3DNOWEXT) +# define opt_dct36(fr) ((fr)->cpu_opts.dct36) +# endif + +#endif /* OPT_MULTI else */ + +# ifndef opt_dct36 +# define opt_dct36(fr) dct36 +# endif + +#endif /* MPG123_H_OPTIMIZE */ + |