Blame src/libmpg123/mpg123lib_intern.h

Packit c32a2d
/*
Packit c32a2d
	mpg123lib_intern: Common non-public stuff for libmpg123
Packit c32a2d
Packit c32a2d
	copyright 1995-2008 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
Packit c32a2d
	derived from the old mpg123.h
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#ifndef MPG123_H_INTERN
Packit c32a2d
#define MPG123_H_INTERN
Packit c32a2d
Packit c32a2d
#define MPG123_RATES 9
Packit c32a2d
#define MPG123_ENCODINGS 12
Packit c32a2d
Packit c32a2d
#include "config.h" /* Load this before _anything_ */
Packit c32a2d
#include "intsym.h" /* Prefixing of internal symbols that still are public in a static lib. */
Packit c32a2d
Packit c32a2d
#include "abi_align.h"
Packit c32a2d
Packit c32a2d
/* export DLL symbols */
Packit c32a2d
#if defined(WIN32) && defined(DYNAMIC_BUILD)
Packit c32a2d
#define BUILD_MPG123_DLL
Packit c32a2d
#endif
Packit c32a2d
#include "compat.h"
Packit c32a2d
#include "mpg123.h"
Packit c32a2d
Packit c32a2d
#define SKIP_JUNK 1
Packit c32a2d
Packit c32a2d
#ifndef M_PI
Packit c32a2d
# define M_PI       3.14159265358979323846
Packit c32a2d
#endif
Packit c32a2d
#ifndef M_SQRT2
Packit c32a2d
# define M_SQRT2	1.41421356237309504880
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifdef SUNOS
Packit c32a2d
#define memmove(dst,src,size) bcopy(src,dst,size)
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* We don't really do long double... there are 3 options for REAL:
Packit c32a2d
   float, long and double. */
Packit c32a2d
Packit c32a2d
#ifdef REAL_IS_FLOAT
Packit c32a2d
#  define real float
Packit c32a2d
#elif defined(REAL_IS_FIXED)
Packit c32a2d
Packit c32a2d
# define real  int32_t
Packit c32a2d
# define dreal int64_t
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
  for fixed-point decoders, use pre-calculated tables to avoid expensive floating-point maths
Packit c32a2d
  undef this macro for run-time calculation
Packit c32a2d
*/
Packit c32a2d
#define PRECALC_TABLES
Packit c32a2d
Packit c32a2d
# define REAL_RADIX				24
Packit c32a2d
# define REAL_FACTOR			16777216.0
Packit c32a2d
Packit c32a2d
static inline int32_t double_to_long_rounded(double x, double scalefac)
Packit c32a2d
{
Packit c32a2d
	x *= scalefac;
Packit c32a2d
	x += (x > 0) ? 0.5 : -0.5;
Packit c32a2d
	return (int32_t)x;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
static inline int32_t scale_rounded(int32_t x, int shift)
Packit c32a2d
{
Packit c32a2d
	x += (x >> 31);
Packit c32a2d
	x >>= (shift - 1);
Packit c32a2d
	x += (x & 1);
Packit c32a2d
	return (x >> 1);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
# ifdef __GNUC__
Packit c32a2d
#  if defined(OPT_I386)
Packit c32a2d
/* for i386_nofpu decoder */
Packit c32a2d
#   define REAL_MUL_ASM(x, y, radix) \
Packit c32a2d
({ \
Packit c32a2d
	long _x=(x), _y=(y); \
Packit c32a2d
	__asm__ ( \
Packit c32a2d
		"imull %1 \n\t" \
Packit c32a2d
		"shrdl %2, %%edx, %0 \n\t" \
Packit c32a2d
		: "+&a" (_x) \
Packit c32a2d
		: "mr" (_y), "I" (radix) \
Packit c32a2d
		: "%edx", "cc" \
Packit c32a2d
	); \
Packit c32a2d
	_x; \
Packit c32a2d
})
Packit c32a2d
Packit c32a2d
#   define REAL_MUL_SCALE_LAYER3_ASM(x, y, radix) \
Packit c32a2d
({ \
Packit c32a2d
	long _x=(x), _y=(y), _radix=(radix); \
Packit c32a2d
	__asm__ ( \
Packit c32a2d
		"imull %1 \n\t" \
Packit c32a2d
		"shrdl %%cl, %%edx, %0 \n\t" \
Packit c32a2d
		: "+&a" (_x) \
Packit c32a2d
		: "mr" (_y), "c" (_radix) \
Packit c32a2d
		: "%edx", "cc" \
Packit c32a2d
	); \
Packit c32a2d
	_x; \
Packit c32a2d
})
Packit c32a2d
#  elif defined(OPT_PPC)
Packit c32a2d
/* for powerpc */
Packit c32a2d
#   define REAL_MUL_ASM(x, y, radix) \
Packit c32a2d
({ \
Packit c32a2d
	long _x=(x), _y=(y), _mull, _mulh; \
Packit c32a2d
	__asm__ ( \
Packit c32a2d
		"mullw %0, %2, %3 \n\t" \
Packit c32a2d
		"mulhw %1, %2, %3 \n\t" \
Packit c32a2d
		"srwi %0, %0, %4 \n\t" \
Packit c32a2d
		"rlwimi %0, %1, %5, 0, %6 \n\t" \
Packit c32a2d
		: "=&r" (_mull), "=&r" (_mulh) \
Packit c32a2d
		: "r" (_x), "r" (_y), "i" (radix), "i" (32-(radix)), "i" ((radix)-1) \
Packit c32a2d
	); \
Packit c32a2d
	_mull; \
Packit c32a2d
})
Packit c32a2d
Packit c32a2d
#   define REAL_MUL_SCALE_LAYER3_ASM(x, y, radix) \
Packit c32a2d
({ \
Packit c32a2d
	long _x=(x), _y=(y), _radix=(radix), _mull, _mulh, _radix2; \
Packit c32a2d
	__asm__ ( \
Packit c32a2d
		"mullw %0, %3, %4 \n\t" \
Packit c32a2d
		"mulhw %1, %3, %4 \n\t" \
Packit c32a2d
		"subfic %2, %5, 32 \n\t" \
Packit c32a2d
		"srw %0, %0, %5 \n\t" \
Packit c32a2d
		"slw %1, %1, %2 \n\t" \
Packit c32a2d
		"or %0, %0, %1 \n\t" \
Packit c32a2d
		: "=&r" (_mull), "=&r" (_mulh), "=&r" (_radix2) \
Packit c32a2d
		: "r" (_x), "r" (_y), "r" (_radix) \
Packit c32a2d
		: "cc" \
Packit c32a2d
	); \
Packit c32a2d
	_mull; \
Packit c32a2d
})
Packit c32a2d
#  elif defined(OPT_ARM)
Packit c32a2d
/* for arm */
Packit c32a2d
#   define REAL_MUL_ASM(x, y, radix) \
Packit c32a2d
({ \
Packit c32a2d
	long _x=(x), _y=(y), _mull, _mulh; \
Packit c32a2d
	__asm__ ( \
Packit c32a2d
		"smull %0, %1, %2, %3 \n\t" \
Packit c32a2d
		"mov %0, %0, lsr %4 \n\t" \
Packit c32a2d
		"orr %0, %0, %1, lsl %5 \n\t" \
Packit c32a2d
		: "=&r" (_mull), "=&r" (_mulh) \
Packit c32a2d
		: "r" (_x), "r" (_y), "M" (radix), "M" (32-(radix)) \
Packit c32a2d
	); \
Packit c32a2d
	_mull; \
Packit c32a2d
})
Packit c32a2d
Packit c32a2d
#   define REAL_MUL_SCALE_LAYER3_ASM(x, y, radix) \
Packit c32a2d
({ \
Packit c32a2d
	long _x=(x), _y=(y), _radix=(radix), _mull, _mulh, _radix2; \
Packit c32a2d
	__asm__ ( \
Packit c32a2d
		"smull %0, %1, %3, %4 \n\t" \
Packit c32a2d
		"mov %0, %0, lsr %5 \n\t" \
Packit c32a2d
		"rsb %2, %5, #32 \n\t" \
Packit c32a2d
		"mov %1, %1, lsl %2 \n\t" \
Packit c32a2d
		"orr %0, %0, %1 \n\t" \
Packit c32a2d
		: "=&r" (_mull), "=&r" (_mulh), "=&r" (_radix2) \
Packit c32a2d
		: "r" (_x), "r" (_y), "r" (_radix) \
Packit c32a2d
	); \
Packit c32a2d
	_mull; \
Packit c32a2d
})
Packit c32a2d
#  endif
Packit c32a2d
# endif
Packit c32a2d
Packit c32a2d
/* I just changed the (int) to (real) there... seemed right. */
Packit c32a2d
# define DOUBLE_TO_REAL(x)					(double_to_long_rounded(x, REAL_FACTOR))
Packit c32a2d
# define DOUBLE_TO_REAL_15(x)				(double_to_long_rounded(x, 32768.0))
Packit c32a2d
# define DOUBLE_TO_REAL_POW43(x)			(double_to_long_rounded(x, 8192.0))
Packit c32a2d
# define DOUBLE_TO_REAL_SCALE_LAYER12(x)	(double_to_long_rounded(x, 1073741824.0))
Packit c32a2d
# define DOUBLE_TO_REAL_SCALE_LAYER3(x, y)	(double_to_long_rounded(x, pow(2.0,gainpow2_scale[y])))
Packit c32a2d
# define REAL_TO_DOUBLE(x)					((double)(x) / REAL_FACTOR)
Packit c32a2d
# ifdef REAL_MUL_ASM
Packit c32a2d
#  define REAL_MUL(x, y)					REAL_MUL_ASM(x, y, REAL_RADIX)
Packit c32a2d
#  define REAL_MUL_15(x, y)					REAL_MUL_ASM(x, y, 15)
Packit c32a2d
#  define REAL_MUL_SCALE_LAYER12(x, y)		REAL_MUL_ASM(x, y, 15 + 30 - REAL_RADIX)
Packit c32a2d
# else
Packit c32a2d
#  define REAL_MUL(x, y)					(((dreal)(x) * (dreal)(y)) >> REAL_RADIX)
Packit c32a2d
#  define REAL_MUL_15(x, y)					(((dreal)(x) * (dreal)(y)) >> 15)
Packit c32a2d
#  define REAL_MUL_SCALE_LAYER12(x, y)		(((dreal)(x) * (dreal)(y)) >> (15 + 30 - REAL_RADIX))
Packit c32a2d
# endif
Packit c32a2d
# ifdef REAL_MUL_SCALE_LAYER3_ASM
Packit c32a2d
#  define REAL_MUL_SCALE_LAYER3(x, y, z)	REAL_MUL_SCALE_LAYER3_ASM(x, y, 13 + gainpow2_scale[z] - REAL_RADIX)
Packit c32a2d
# else
Packit c32a2d
#  define REAL_MUL_SCALE_LAYER3(x, y, z)	(((dreal)(x) * (dreal)(y)) >> (13 + gainpow2_scale[z] - REAL_RADIX))
Packit c32a2d
# endif
Packit c32a2d
# define REAL_SCALE_LAYER12(x)				((real)((x) >> (30 - REAL_RADIX)))
Packit c32a2d
# define REAL_SCALE_LAYER3(x, y)			((real)((x) >> (gainpow2_scale[y] - REAL_RADIX)))
Packit c32a2d
# ifdef ACCURATE_ROUNDING
Packit c32a2d
#  define REAL_MUL_SYNTH(x, y)				REAL_MUL(x, y)
Packit c32a2d
#  define REAL_SCALE_DCT64(x)				(x)
Packit c32a2d
#  define REAL_SCALE_WINDOW(x)				(x)
Packit c32a2d
# else
Packit c32a2d
#  define REAL_MUL_SYNTH(x, y)				((x) * (y))
Packit c32a2d
#  define REAL_SCALE_DCT64(x)				((x) >> 8)
Packit c32a2d
#  define REAL_SCALE_WINDOW(x)				scale_rounded(x, 16)
Packit c32a2d
# endif
Packit c32a2d
Packit c32a2d
#else
Packit c32a2d
/* Just define a symbol to make things clear.
Packit c32a2d
   Existing code still uses (not (float or fixed)) for that. */
Packit c32a2d
#  define REAL_IS_DOUBLE
Packit c32a2d
#  define real double
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifndef REAL_IS_FIXED
Packit c32a2d
# if (defined SIZEOF_INT32_T) && (SIZEOF_INT32_T != 4)
Packit c32a2d
#  error "Bad 32bit types!!!"
Packit c32a2d
# endif
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifndef DOUBLE_TO_REAL
Packit c32a2d
# define DOUBLE_TO_REAL(x)					(real)(x)
Packit c32a2d
#endif
Packit c32a2d
#ifndef DOUBLE_TO_REAL_15
Packit c32a2d
# define DOUBLE_TO_REAL_15(x)				(real)(x)
Packit c32a2d
#endif
Packit c32a2d
#ifndef DOUBLE_TO_REAL_POW43
Packit c32a2d
# define DOUBLE_TO_REAL_POW43(x)			(real)(x)
Packit c32a2d
#endif
Packit c32a2d
#ifndef DOUBLE_TO_REAL_SCALE_LAYER12
Packit c32a2d
# define DOUBLE_TO_REAL_SCALE_LAYER12(x)	(real)(x)
Packit c32a2d
#endif
Packit c32a2d
#ifndef DOUBLE_TO_REAL_SCALE_LAYER3
Packit c32a2d
# define DOUBLE_TO_REAL_SCALE_LAYER3(x, y)	(real)(x)
Packit c32a2d
#endif
Packit c32a2d
#ifndef REAL_TO_DOUBLE
Packit c32a2d
# define REAL_TO_DOUBLE(x)					(x)
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#ifndef REAL_MUL
Packit c32a2d
# define REAL_MUL(x, y)						((x) * (y))
Packit c32a2d
#endif
Packit c32a2d
#ifndef REAL_MUL_SYNTH
Packit c32a2d
# define REAL_MUL_SYNTH(x, y)				((x) * (y))
Packit c32a2d
#endif
Packit c32a2d
#ifndef REAL_MUL_15
Packit c32a2d
# define REAL_MUL_15(x, y)					((x) * (y))
Packit c32a2d
#endif
Packit c32a2d
#ifndef REAL_MUL_SCALE_LAYER12
Packit c32a2d
# define REAL_MUL_SCALE_LAYER12(x, y)		((x) * (y))
Packit c32a2d
#endif
Packit c32a2d
#ifndef REAL_MUL_SCALE_LAYER3
Packit c32a2d
# define REAL_MUL_SCALE_LAYER3(x, y, z)		((x) * (y))
Packit c32a2d
#endif
Packit c32a2d
#ifndef REAL_SCALE_LAYER12
Packit c32a2d
# define REAL_SCALE_LAYER12(x)				(x)
Packit c32a2d
#endif
Packit c32a2d
#ifndef REAL_SCALE_LAYER3
Packit c32a2d
# define REAL_SCALE_LAYER3(x, y)			(x)
Packit c32a2d
#endif
Packit c32a2d
#ifndef REAL_SCALE_DCT64
Packit c32a2d
# define REAL_SCALE_DCT64(x)				(x)
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* used to be: AUDIOBUFSIZE = n*64 with n=1,2,3 ...
Packit c32a2d
   now: factor on minimum frame buffer size (which takes upsampling into account) */
Packit c32a2d
#define		AUDIOBUFSIZE		2
Packit c32a2d
Packit c32a2d
#include "true.h"
Packit c32a2d
Packit c32a2d
#define         MAX_NAME_SIZE           81
Packit c32a2d
#define         SBLIMIT                 32
Packit c32a2d
#define         SCALE_BLOCK             12
Packit c32a2d
#define         SSLIMIT                 18
Packit c32a2d
Packit c32a2d
/* Same as MPG_M_* */
Packit c32a2d
#define         MPG_MD_STEREO           0
Packit c32a2d
#define         MPG_MD_JOINT_STEREO     1
Packit c32a2d
#define         MPG_MD_DUAL_CHANNEL     2
Packit c32a2d
#define         MPG_MD_MONO             3
Packit c32a2d
Packit c32a2d
/* We support short or float output samples...
Packit c32a2d
   Short integer amplitude is scaled by this. */
Packit c32a2d
#define SHORT_SCALE 32768
Packit c32a2d
/* That scales a short-scaled value to a 32bit integer scaled one
Packit c32a2d
   value = 2**31/2**15 */
Packit c32a2d
#define S32_RESCALE 65536
Packit c32a2d
Packit c32a2d
/* Pre Shift fo 16 to 8 bit converter table */
Packit c32a2d
#define AUSHIFT (3)
Packit c32a2d
Packit c32a2d
#include "optimize.h"
Packit c32a2d
#include "decode.h"
Packit c32a2d
#include "parse.h"
Packit c32a2d
#include "frame.h"
Packit c32a2d
Packit c32a2d
/* fr is a mpg123_handle* by convention here... */
Packit c32a2d
#define NOQUIET  (!(fr->p.flags & MPG123_QUIET))
Packit c32a2d
#define VERBOSE  (NOQUIET && fr->p.verbose)
Packit c32a2d
#define VERBOSE2 (NOQUIET && fr->p.verbose > 1)
Packit c32a2d
#define VERBOSE3 (NOQUIET && fr->p.verbose > 2)
Packit c32a2d
#define VERBOSE4 (NOQUIET && fr->p.verbose > 3)
Packit c32a2d
#define PVERB(mp, level) (!((mp)->flags & MPG123_QUIET) && (mp)->verbose >= (level))
Packit c32a2d
Packit c32a2d
int decode_update(mpg123_handle *mh);
Packit c32a2d
/* residing in format.c  */
Packit c32a2d
off_t decoder_synth_bytes(mpg123_handle *fr , off_t s);
Packit c32a2d
off_t samples_to_bytes(mpg123_handle *fr , off_t s);
Packit c32a2d
off_t bytes_to_samples(mpg123_handle *fr , off_t b);
Packit c32a2d
off_t outblock_bytes(mpg123_handle *fr, off_t s);
Packit c32a2d
/* Postprocessing format conversion of freshly decoded buffer. */
Packit c32a2d
void postprocess_buffer(mpg123_handle *fr);
Packit c32a2d
Packit c32a2d
/* If networking is enabled and we really mean internal networking, the timeout_read function is available. */
Packit c32a2d
#if defined (NETWORK) && !defined (WANT_WIN32_SOCKETS)
Packit c32a2d
/* Does not work with win32 */
Packit c32a2d
#define TIMEOUT_READ
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#endif