Originally committed as revision 22291 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -12,6 +12,9 @@ libavutil: 2009-03-08 | |||
| API changes, most recent first: | |||
| 2010-03-07 - r22291 - lavc 52.56.0 - avfft.h | |||
| Add public FFT interface. | |||
| 2010-03-06 - r22251 - lavu 50.11.0 - av_stristr() | |||
| Add av_stristr(). | |||
| @@ -3,7 +3,7 @@ include $(SUBDIR)../config.mak | |||
| NAME = avcodec | |||
| FFLIBS = avutil | |||
| HEADERS = avcodec.h dxva2.h opt.h vaapi.h vdpau.h xvmc.h | |||
| HEADERS = avcodec.h avfft.h dxva2.h opt.h vaapi.h vdpau.h xvmc.h | |||
| OBJS = allcodecs.o \ | |||
| audioconvert.o \ | |||
| @@ -30,7 +30,7 @@ OBJS-$(CONFIG_ENCODERS) += faandct.o jfdctfst.o jfdctint.o | |||
| OBJS-$(CONFIG_DCT) += dct.o | |||
| OBJS-$(CONFIG_DXVA2) += dxva2.o | |||
| FFT-OBJS-$(CONFIG_HARDCODED_TABLES) += cos_tables.o | |||
| OBJS-$(CONFIG_FFT) += fft.o $(FFT-OBJS-yes) | |||
| OBJS-$(CONFIG_FFT) += avfft.o fft.o $(FFT-OBJS-yes) | |||
| OBJS-$(CONFIG_GOLOMB) += golomb.o | |||
| OBJS-$(CONFIG_LPC) += lpc.o | |||
| OBJS-$(CONFIG_LSP) += lsp.o | |||
| @@ -30,7 +30,7 @@ | |||
| #include "libavutil/avutil.h" | |||
| #define LIBAVCODEC_VERSION_MAJOR 52 | |||
| #define LIBAVCODEC_VERSION_MINOR 55 | |||
| #define LIBAVCODEC_VERSION_MINOR 56 | |||
| #define LIBAVCODEC_VERSION_MICRO 0 | |||
| #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | |||
| @@ -0,0 +1,142 @@ | |||
| /* | |||
| * 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 | |||
| */ | |||
| #include "libavutil/mem.h" | |||
| #include "avfft.h" | |||
| #include "fft.h" | |||
| /* FFT */ | |||
| FFTContext *av_fft_init(int nbits, int inverse) | |||
| { | |||
| FFTContext *s = av_malloc(sizeof(*s)); | |||
| if (s) | |||
| ff_fft_init(s, nbits, inverse); | |||
| return s; | |||
| } | |||
| void av_fft_permute(FFTContext *s, FFTComplex *z) | |||
| { | |||
| s->fft_permute(s, z); | |||
| } | |||
| void av_fft_calc(FFTContext *s, FFTComplex *z) | |||
| { | |||
| s->fft_calc(s, z); | |||
| } | |||
| void av_fft_end(FFTContext *s) | |||
| { | |||
| if (s) { | |||
| ff_fft_end(s); | |||
| av_free(s); | |||
| } | |||
| } | |||
| #if CONFIG_MDCT | |||
| FFTContext *av_mdct_init(int nbits, int inverse, double scale) | |||
| { | |||
| FFTContext *s = av_malloc(sizeof(*s)); | |||
| if (s) | |||
| ff_mdct_init(s, nbits, inverse, scale); | |||
| return s; | |||
| } | |||
| void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input) | |||
| { | |||
| s->imdct_calc(s, output, input); | |||
| } | |||
| void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input) | |||
| { | |||
| s->imdct_half(s, output, input); | |||
| } | |||
| void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input) | |||
| { | |||
| s->mdct_calc(s, output, input); | |||
| } | |||
| void av_mdct_end(FFTContext *s) | |||
| { | |||
| if (s) { | |||
| ff_mdct_end(s); | |||
| av_free(s); | |||
| } | |||
| } | |||
| #endif /* CONFIG_MDCT */ | |||
| #if CONFIG_RDFT | |||
| RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans) | |||
| { | |||
| RDFTContext *s = av_malloc(sizeof(*s)); | |||
| if (s) | |||
| ff_rdft_init(s, nbits, trans); | |||
| return s; | |||
| } | |||
| void av_rdft_calc(RDFTContext *s, FFTSample *data) | |||
| { | |||
| ff_rdft_calc(s, data); | |||
| } | |||
| void av_rdft_end(RDFTContext *s) | |||
| { | |||
| if (s) { | |||
| ff_rdft_end(s); | |||
| av_free(s); | |||
| } | |||
| } | |||
| #endif /* CONFIG_RDFT */ | |||
| #if CONFIG_DCT | |||
| DCTContext *av_dct_init(int nbits, int inverse) | |||
| { | |||
| DCTContext *s = av_malloc(sizeof(*s)); | |||
| if (s) | |||
| ff_dct_init(s, nbits, inverse); | |||
| return s; | |||
| } | |||
| void av_dct_calc(DCTContext *s, FFTSample *data) | |||
| { | |||
| ff_dct_calc(s, data); | |||
| } | |||
| void av_dct_end(DCTContext *s) | |||
| { | |||
| if (s) { | |||
| ff_dct_end(s); | |||
| av_free(s); | |||
| } | |||
| } | |||
| #endif /* CONFIG_DCT */ | |||
| @@ -0,0 +1,89 @@ | |||
| /* | |||
| * 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 | |||
| */ | |||
| #ifndef AVCODEC_AVFFT_H | |||
| #define AVCODEC_AVFFT_H | |||
| typedef float FFTSample; | |||
| typedef struct FFTComplex { | |||
| FFTSample re, im; | |||
| } FFTComplex; | |||
| typedef struct FFTContext FFTContext; | |||
| /** | |||
| * Set up a complex FFT. | |||
| * @param nbits log2 of the length of the input array | |||
| * @param inverse if 0 perform the forward transform, if 1 perform the inverse | |||
| */ | |||
| FFTContext *av_fft_init(int nbits, int inverse); | |||
| /** | |||
| * Do the permutation needed BEFORE calling ff_fft_calc(). | |||
| */ | |||
| void av_fft_permute(FFTContext *s, FFTComplex *z); | |||
| /** | |||
| * Do a complex FFT with the parameters defined in av_fft_init(). The | |||
| * input data must be permuted before. No 1.0/sqrt(n) normalization is done. | |||
| */ | |||
| void av_fft_calc(FFTContext *s, FFTComplex *z); | |||
| void av_fft_end(FFTContext *s); | |||
| FFTContext *av_mdct_init(int nbits, int inverse, double scale); | |||
| void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); | |||
| void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); | |||
| void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); | |||
| void av_mdct_end(FFTContext *s); | |||
| /* Real Discrete Fourier Transform */ | |||
| enum RDFTransformType { | |||
| DFT_R2C, | |||
| IDFT_C2R, | |||
| IDFT_R2C, | |||
| DFT_C2R, | |||
| }; | |||
| typedef struct RDFTContext RDFTContext; | |||
| /** | |||
| * Set up a real FFT. | |||
| * @param nbits log2 of the length of the input array | |||
| * @param trans the type of transform | |||
| */ | |||
| RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); | |||
| void av_rdft_calc(RDFTContext *s, FFTSample *data); | |||
| void av_rdft_end(RDFTContext *s); | |||
| /* Discrete Cosine Transform */ | |||
| typedef struct DCTContext DCTContext; | |||
| /** | |||
| * Set up (Inverse)DCT. | |||
| * @param nbits log2 of the length of the input array | |||
| * @param inverse >0 forward transform, <0 inverse transform | |||
| */ | |||
| DCTContext *av_dct_init(int nbits, int inverse); | |||
| void av_dct_calc(DCTContext *s, FFTSample *data); | |||
| void av_dct_end (DCTContext *s); | |||
| #endif /* AVCODEC_AVFFT_H */ | |||
| @@ -25,18 +25,11 @@ | |||
| #include <stdint.h> | |||
| #include "config.h" | |||
| #include "libavutil/mem.h" | |||
| #include "avfft.h" | |||
| /* FFT computation */ | |||
| /* NOTE: soon integer code will be added, so you must use the | |||
| FFTSample type */ | |||
| typedef float FFTSample; | |||
| typedef struct FFTComplex { | |||
| FFTSample re, im; | |||
| } FFTComplex; | |||
| typedef struct FFTContext { | |||
| struct FFTContext { | |||
| int nbits; | |||
| int inverse; | |||
| uint16_t *revtab; | |||
| @@ -57,7 +50,7 @@ typedef struct FFTContext { | |||
| int permutation; | |||
| #define FF_MDCT_PERM_NONE 0 | |||
| #define FF_MDCT_PERM_INTERLEAVE 1 | |||
| } FFTContext; | |||
| }; | |||
| #if CONFIG_HARDCODED_TABLES | |||
| #define COSTABLE_CONST const | |||
| @@ -194,14 +187,7 @@ void ff_mdct_end(FFTContext *s); | |||
| /* Real Discrete Fourier Transform */ | |||
| enum RDFTransformType { | |||
| DFT_R2C, | |||
| IDFT_C2R, | |||
| IDFT_R2C, | |||
| DFT_C2R, | |||
| }; | |||
| typedef struct { | |||
| struct RDFTContext { | |||
| int nbits; | |||
| int inverse; | |||
| int sign_convention; | |||
| @@ -210,7 +196,7 @@ typedef struct { | |||
| const FFTSample *tcos; | |||
| SINTABLE_CONST FFTSample *tsin; | |||
| FFTContext fft; | |||
| } RDFTContext; | |||
| }; | |||
| /** | |||
| * Sets up a real FFT. | |||
| @@ -223,14 +209,14 @@ void ff_rdft_end(RDFTContext *s); | |||
| /* Discrete Cosine Transform */ | |||
| typedef struct { | |||
| struct DCTContext { | |||
| int nbits; | |||
| int inverse; | |||
| FFTSample *data; | |||
| RDFTContext rdft; | |||
| const float *costab; | |||
| FFTSample *csc2; | |||
| } DCTContext; | |||
| }; | |||
| /** | |||
| * Sets up (Inverse)DCT. | |||