aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/arm/fft_init_arm.c
diff options
context:
space:
mode:
authorBen Avison <bavison@riscosopen.org>2014-07-16 16:02:01 +0100
committerMartin Storsjö <martin@martin.st>2014-07-18 01:34:23 +0300
commit87552d54d3337c3241e8a9e1a05df16eaa821496 (patch)
tree74851cf637f266149da033dca7cc89bac9ed864b /libavcodec/arm/fft_init_arm.c
parent5c22e8e4ad0852d61d5c4ba8d67d33fd72339497 (diff)
downloadffmpeg-87552d54d3337c3241e8a9e1a05df16eaa821496.tar.gz
armv6: Accelerate ff_fft_calc for general case (nbits != 4)
The previous implementation targeted DTS Coherent Acoustics, which only requires nbits == 4 (fft16()). This case was (and still is) linked directly rather than being indirected through ff_fft_calc_vfp(), but now the full range from radix-4 up to radix-65536 is available. This benefits other codecs such as AAC and AC3. The implementaion is based upon the C version, with each routine larger than radix-16 calling a hierarchy of smaller FFT functions, then performing a post-processing pass. This pass benefits a lot from loop unrolling to counter the long pipelines in the VFP. A relaxed calling standard also reduces the overhead of the call hierarchy, and avoiding the excessive inlining performed by GCC probably helps with I-cache utilisation too. I benchmarked the result by measuring the number of gperftools samples that hit anywhere in the AAC decoder (starting from aac_decode_frame()) or specifically in the FFT routines (fft4() to fft512() and pass()) for the same sample AAC stream: Before After Mean StdDev Mean StdDev Confidence Change Audio decode 2245.5 53.1 1599.6 43.8 100.0% +40.4% FFT routines 940.6 22.0 348.1 20.8 100.0% +170.2% Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavcodec/arm/fft_init_arm.c')
-rw-r--r--libavcodec/arm/fft_init_arm.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/libavcodec/arm/fft_init_arm.c b/libavcodec/arm/fft_init_arm.c
index 3a3d1a7f5a..bc143c10fb 100644
--- a/libavcodec/arm/fft_init_arm.c
+++ b/libavcodec/arm/fft_init_arm.c
@@ -23,6 +23,8 @@
#include "libavcodec/rdft.h"
#include "libavcodec/synth_filter.h"
+void ff_fft_calc_vfp(FFTContext *s, FFTComplex *z);
+
void ff_fft_permute_neon(FFTContext *s, FFTComplex *z);
void ff_fft_calc_neon(FFTContext *s, FFTComplex *z);
@@ -38,10 +40,10 @@ av_cold void ff_fft_init_arm(FFTContext *s)
{
int cpu_flags = av_get_cpu_flags();
- if (have_vfp(cpu_flags)) {
+ if (have_vfp(cpu_flags) && !have_vfpv3(cpu_flags)) {
+ s->fft_calc = ff_fft_calc_vfp;
#if CONFIG_MDCT
- if (!have_vfpv3(cpu_flags))
- s->imdct_half = ff_imdct_half_vfp;
+ s->imdct_half = ff_imdct_half_vfp;
#endif
}