From b91d46614df189e7905538e7f5c4ed9c7ed0d274 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 11 May 2010 19:52:42 +0000 Subject: float based mp1/mp2/mp3 decoders. Originally committed as revision 23095 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mpegaudio.h | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'libavcodec/mpegaudio.h') diff --git a/libavcodec/mpegaudio.h b/libavcodec/mpegaudio.h index 26ec2bebc1..53d82da4e3 100644 --- a/libavcodec/mpegaudio.h +++ b/libavcodec/mpegaudio.h @@ -26,6 +26,10 @@ #ifndef AVCODEC_MPEGAUDIO_H #define AVCODEC_MPEGAUDIO_H +#ifndef CONFIG_FLOAT +# define CONFIG_FLOAT 0 +#endif + #include "avcodec.h" #include "get_bits.h" #include "dsputil.h" @@ -65,7 +69,10 @@ #define FIX(a) ((int)((a) * FRAC_ONE)) -#if CONFIG_MPEGAUDIO_HP && CONFIG_AUDIO_NONSHORT +#if CONFIG_FLOAT +typedef float OUT_INT; +#define OUT_FMT SAMPLE_FMT_FLT +#elif CONFIG_MPEGAUDIO_HP && CONFIG_AUDIO_NONSHORT typedef int32_t OUT_INT; #define OUT_MAX INT32_MAX #define OUT_MIN INT32_MIN @@ -79,9 +86,14 @@ typedef int16_t OUT_INT; #define OUT_FMT SAMPLE_FMT_S16 #endif -#if FRAC_BITS <= 15 +#if CONFIG_FLOAT +# define INTFLOAT float +typedef float MPA_INT; +#elif FRAC_BITS <= 15 +# define INTFLOAT int typedef int16_t MPA_INT; #else +# define INTFLOAT int typedef int32_t MPA_INT; #endif @@ -105,7 +117,7 @@ typedef struct GranuleDef { int preflag; int short_start, long_end; /* long/short band indexes */ uint8_t scale_factors[40]; - int32_t sb_hybrid[SBLIMIT * 18]; /* 576 samples */ + INTFLOAT sb_hybrid[SBLIMIT * 18]; /* 576 samples */ } GranuleDef; #define MPA_DECODE_HEADER \ @@ -134,13 +146,12 @@ typedef struct MPADecodeContext { GetBitContext in_gb; DECLARE_ALIGNED(16, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512 * 2]; int synth_buf_offset[MPA_MAX_CHANNELS]; - DECLARE_ALIGNED(16, int32_t, sb_samples)[MPA_MAX_CHANNELS][36][SBLIMIT]; - int32_t mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ + DECLARE_ALIGNED(16, INTFLOAT, sb_samples)[MPA_MAX_CHANNELS][36][SBLIMIT]; + INTFLOAT mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ GranuleDef granules[2][2]; /* Used in Layer 3 */ #ifdef DEBUG int frame_count; #endif - void (*compute_antialias)(struct MPADecodeContext *s, struct GranuleDef *g); int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3 int dither_state; int error_recognition; @@ -161,7 +172,13 @@ void ff_mpa_synth_init(MPA_INT *window); void ff_mpa_synth_filter(MPA_INT *synth_buf_ptr, int *synth_buf_offset, MPA_INT *window, int *dither_state, OUT_INT *samples, int incr, - int32_t sb_samples[SBLIMIT]); + INTFLOAT sb_samples[SBLIMIT]); + +void ff_mpa_synth_init_float(MPA_INT *window); +void ff_mpa_synth_filter_float(MPA_INT *synth_buf_ptr, int *synth_buf_offset, + MPA_INT *window, int *dither_state, + OUT_INT *samples, int incr, + INTFLOAT sb_samples[SBLIMIT]); /* fast header check for resync */ static inline int ff_mpa_check_header(uint32_t header){ -- cgit v1.2.3