diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-01-04 11:53:44 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-01-04 11:53:44 +0000 |
commit | 6fd96d1a85f3b81a1dbf08b79ba395506471ded0 (patch) | |
tree | 50aff50d56d178128d75a120a387f46b116d4965 /libavcodec | |
parent | 6780f488467f75444317a95f00f35c26453f4e96 (diff) | |
download | ffmpeg-6fd96d1a85f3b81a1dbf08b79ba395506471ded0.tar.gz |
Change the AC-3 encoder to use floating-point.
Fixed-point AC-3 encoder renamed to ac3_fixed.
Regression test acodec-ac3 renamed to acodec-ac3_fixed.
Regression test lavf-rm changed to use ac3_fixed encoder.
Originally committed as revision 26209 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/Makefile | 3 | ||||
-rw-r--r-- | libavcodec/ac3enc.c | 11 | ||||
-rw-r--r-- | libavcodec/ac3enc_fixed.c | 5 | ||||
-rw-r--r-- | libavcodec/ac3enc_float.c | 117 | ||||
-rw-r--r-- | libavcodec/ac3enc_float.h | 46 | ||||
-rw-r--r-- | libavcodec/allcodecs.c | 1 | ||||
-rw-r--r-- | libavcodec/avcodec.h | 2 |
7 files changed, 180 insertions, 5 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 3d13e4a0d3..ee16b91510 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -54,7 +54,8 @@ OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o \ mpeg4audio.o OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o OBJS-$(CONFIG_AC3_DECODER) += ac3dec.o ac3dec_data.o ac3.o -OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_fixed.o ac3tab.o ac3.o +OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3tab.o ac3.o +OBJS-$(CONFIG_AC3_FIXED_ENCODER) += ac3enc_fixed.o ac3tab.o ac3.o OBJS-$(CONFIG_ALAC_DECODER) += alac.o OBJS-$(CONFIG_ALAC_ENCODER) += alacenc.o OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index ec678ee6f4..902aabf795 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -37,6 +37,11 @@ #include "audioconvert.h" +#ifndef CONFIG_AC3ENC_FLOAT +#define CONFIG_AC3ENC_FLOAT 0 +#endif + + /** Maximum number of exponent groups. +1 for separate DC exponent. */ #define AC3_MAX_EXP_GROUPS 85 @@ -44,7 +49,11 @@ #define SCALE_FLOAT(a, bits) lrintf((a) * (float)(1 << (bits))) +#if CONFIG_AC3ENC_FLOAT +#include "ac3enc_float.h" +#else #include "ac3enc_fixed.h" +#endif /** @@ -130,7 +139,7 @@ typedef struct AC3EncodeContext { } AC3EncodeContext; -/* prototypes for functions in ac3enc_fixed.c */ +/* prototypes for functions in ac3enc_fixed.c and ac3_float.c */ static av_cold void mdct_end(AC3MDCTContext *mdct); diff --git a/libavcodec/ac3enc_fixed.c b/libavcodec/ac3enc_fixed.c index 6505b7a0ea..9d3b195ded 100644 --- a/libavcodec/ac3enc_fixed.c +++ b/libavcodec/ac3enc_fixed.c @@ -26,6 +26,7 @@ * fixed-point AC-3 encoder. */ +#undef CONFIG_AC3ENC_FLOAT #include "ac3enc.c" @@ -413,8 +414,8 @@ int main(void) #endif /* TEST */ -AVCodec ac3_encoder = { - "ac3", +AVCodec ac3_fixed_encoder = { + "ac3_fixed", AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3, sizeof(AC3EncodeContext), diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c new file mode 100644 index 0000000000..82d806bc06 --- /dev/null +++ b/libavcodec/ac3enc_float.c @@ -0,0 +1,117 @@ +/* + * The simplest AC-3 encoder + * Copyright (c) 2000 Fabrice Bellard + * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com> + * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de> + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * floating-point AC-3 encoder. + */ + +#define CONFIG_AC3ENC_FLOAT 1 +#include "ac3enc.c" + + +/** + * Finalize MDCT and free allocated memory. + */ +static av_cold void mdct_end(AC3MDCTContext *mdct) +{ + ff_mdct_end(&mdct->fft); + av_freep(&mdct->window); +} + + +/** + * Initialize MDCT tables. + * @param nbits log2(MDCT size) + */ +static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct, + int nbits) +{ + float *window; + int n, n2; + + n = 1 << nbits; + n2 = n >> 1; + + window = av_malloc(n2 * sizeof(*window)); + if (!window) { + av_log(avctx, AV_LOG_ERROR, "Cannot allocate memory.\n"); + return AVERROR(ENOMEM); + } + ff_kbd_window_init(window, 5.0, n2); + mdct->window = window; + + return ff_mdct_init(&mdct->fft, nbits, 0, -2.0 / n); +} + + +/** + * Calculate a 512-point MDCT + * @param out 256 output frequency coefficients + * @param in 512 windowed input audio samples + */ +static void mdct512(AC3MDCTContext *mdct, float *out, float *in) +{ + ff_mdct_calc(&mdct->fft, out, in); +} + + +/** + * Apply KBD window to input samples prior to MDCT. + */ +static void apply_window(float *output, const float *input, + const float *window, int n) +{ + int i; + int n2 = n >> 1; + + for (i = 0; i < n2; i++) { + output[i] = input[i] * window[i]; + output[n-i-1] = input[n-i-1] * window[i]; + } +} + + +/** + * Normalize the input samples to use the maximum available precision. + */ +static int normalize_samples(AC3EncodeContext *s) +{ + /* Normalization is not needed for floating-point samples, so just return 0 */ + return 0; +} + + +AVCodec ac3_encoder = { + "ac3", + AVMEDIA_TYPE_AUDIO, + CODEC_ID_AC3, + sizeof(AC3EncodeContext), + ac3_encode_init, + ac3_encode_frame, + ac3_encode_close, + NULL, + .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, + .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), + .channel_layouts = ac3_channel_layouts, +}; diff --git a/libavcodec/ac3enc_float.h b/libavcodec/ac3enc_float.h new file mode 100644 index 0000000000..1cd3681ae9 --- /dev/null +++ b/libavcodec/ac3enc_float.h @@ -0,0 +1,46 @@ +/* + * The simplest AC-3 encoder + * Copyright (c) 2000 Fabrice Bellard + * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com> + * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de> + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * floating-point AC-3 encoder header. + */ + +#ifndef AVCODEC_AC3ENC_FLOAT_H +#define AVCODEC_AC3ENC_FLOAT_H + +#include "fft.h" + + +typedef float SampleType; +typedef float CoefType; + +#define SCALE_COEF(a) SCALE_FLOAT((a), 24) + + +typedef struct AC3MDCTContext { + const float *window; ///< MDCT window function + FFTContext fft; ///< FFT context for MDCT calculation +} AC3MDCTContext; + +#endif /* AVCODEC_AC3ENC_FLOAT_H */ diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 5bcd9120cd..5ba199861e 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -222,6 +222,7 @@ void avcodec_register_all(void) REGISTER_ENCDEC (AAC, aac); REGISTER_DECODER (AAC_LATM, aac_latm); REGISTER_ENCDEC (AC3, ac3); + REGISTER_ENCODER (AC3_FIXED, ac3_fixed); REGISTER_ENCDEC (ALAC, alac); REGISTER_DECODER (ALS, als); REGISTER_DECODER (AMRNB, amrnb); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 8b7320f2c1..828b07ac24 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -32,7 +32,7 @@ #include "libavutil/cpu.h" #define LIBAVCODEC_VERSION_MAJOR 52 -#define LIBAVCODEC_VERSION_MINOR 101 +#define LIBAVCODEC_VERSION_MINOR 102 #define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ |