ffmpeg/libavutil
Lynne b79b29ddb1 libavutil: add an FFT & MDCT implementation
This commit adds a new API to libavutil to allow for arbitrary transformations
on various types of data.
This is a partly new implementation, with the power of two transforms taken
from libavcodec/fft_template, the 5 and 15-point FFT taken from mdct15, while
the 3-point FFT was written from scratch.
The (i)mdct folding code is taken from mdct15 as well, as the mdct_template
code was somewhat old, messy and not easy to separate.

A notable feature of this implementation is that it allows for 3xM and 5xM
based transforms, where M is a power of two, e.g. 384, 640, 768, 1280, etc.
AC-4 uses 3xM transforms while Siren uses 5xM transforms, so the code will
allow for decoding of such streams.
A non-exaustive list of supported sizes:
4, 8, 12, 16, 20, 24, 32, 40, 48, 60, 64, 80, 96, 120, 128, 160, 192, 240,
256, 320, 384, 480, 512, 640, 768, 960, 1024, 1280, 1536, 1920, 2048, 2560...

The API was designed such that it allows for not only 1D transforms but also
2D transforms of certain block sizes. This was partly on accident as the stride
argument is required for Opus MDCTs, but can be used in the context of a 2D
transform as well.
Also, various data types would be implemented eventually as well, such as
"double" and "int32_t".

Some performance comparisons with libfftw3f (SIMD disabled for both):
120:
  22353 decicycles in     fftwf_execute,     1024 runs,      0 skips
  21836 decicycles in compound_fft_15x8,     1024 runs,      0 skips

128:
  22003 decicycles in       fftwf_execute,   1024 runs,      0 skips
  23132 decicycles in monolithic_fft_ptwo,   1024 runs,      0 skips

384:
  75939 decicycles in      fftwf_execute,    1024 runs,      0 skips
  73973 decicycles in compound_fft_3x128,    1024 runs,      0 skips

640:
 104354 decicycles in       fftwf_execute,   1024 runs,      0 skips
 149518 decicycles in compound_fft_5x128,    1024 runs,      0 skips

768:
 109323 decicycles in      fftwf_execute,    1024 runs,      0 skips
 164096 decicycles in compound_fft_3x256,    1024 runs,      0 skips

960:
 186210 decicycles in      fftwf_execute,    1024 runs,      0 skips
 215256 decicycles in compound_fft_15x64,    1024 runs,      0 skips

1024:
 163464 decicycles in       fftwf_execute,   1024 runs,      0 skips
 199686 decicycles in monolithic_fft_ptwo,   1024 runs,      0 skips

With SIMD we should be faster than fftw for 15xM transforms as our fft15 SIMD
is around 2x faster than theirs, even if our ptwo SIMD is slightly slower.

The goal is to remove the libavcodec/mdct15 code and deprecate the
libavcodec/avfft interface once aarch64 and x86 SIMD code has been ported.
New code throughout the project should use this API.

The implementation passes fate when used in Opus, AAC and Vorbis, and the output
is identical with ATRAC9 as well.
2019-05-15 17:39:59 +01:00
..
aarch64 Merge commit '41cf3e3b1ca375962951fde1b90a03b16197d205' 2019-02-20 14:48:58 -03:00
arm Merge commit '41cf3e3b1ca375962951fde1b90a03b16197d205' 2019-02-20 14:48:58 -03:00
avr32
bfin
mips avcodec/mips: [loongson] mmi optimizations for VP9 put and avg functions 2019-02-27 01:51:40 +01:00
ppc avutil/ppc/cpu: Fix power8 linux detection 2019-02-05 09:29:57 +02:00
sh4
tests avutil: Add NV24 and NV42 pixel formats 2019-05-12 07:51:02 -07:00
tomi
x86 x86/float_dsp: add ff_vector_dmul_{sse2,avx} 2018-09-14 12:54:42 -03:00
.gitignore
adler32.c
adler32.h
aes_ctr.c avutil/aes_ctr: Add method to set 16-byte IV. 2018-01-23 21:48:31 +01:00
aes_ctr.h avutil/aes_ctr: Add method to set 16-byte IV. 2018-01-23 21:48:31 +01:00
aes_internal.h
aes.c
aes.h
attributes.h
audio_fifo.c
audio_fifo.h
avassert.h Fix typos 2018-09-14 21:36:21 +02:00
avsscanf.c avutil/avsscanf: do not use long double functions 2018-12-15 09:58:28 +01:00
avstring.c avutil/avstring: Fix bug and undefined behavior in av_strncasecmp() 2019-04-24 17:05:02 +02:00
avstring.h lavu: add locale-independent sscanf implementation 2018-11-16 20:24:52 +01:00
avutil.h
avutilres.rc
base64.c
base64.h
blowfish.c
blowfish.h
bprint.c
bprint.h
bswap.h
buffer_internal.h
buffer.c
buffer.h
camellia.c
camellia.h
cast5.c
cast5.h
channel_layout.c
channel_layout.h
color_utils.c
color_utils.h
colorspace.h avutil/colorspace: add macros for RGB->YUV BT.709 2019-04-19 17:10:20 +05:30
common.h avutil/common: Fix undefined behavior in av_clip_uintp2_c() 2018-06-15 21:52:29 +02:00
cpu_internal.h Merge commit '4cf84e254ae75b524e1cacae499a97d7cc9e5906' 2018-02-11 23:08:48 -03:00
cpu.c avutil: add AVX-512 flags 2017-12-24 22:02:41 +01:00
cpu.h avutil: add AVX-512 flags 2017-12-24 22:02:41 +01:00
crc.c crc: add AV_CRC_8_SBC as a 8 bits CRC with polynomial 0x1D 2018-03-07 22:26:53 +01:00
crc.h crc: add AV_CRC_8_SBC as a 8 bits CRC with polynomial 0x1D 2018-03-07 22:26:53 +01:00
cuda_check.h avutil/cuda_check: Fix non-dynamic-loader implementation 2019-02-24 09:13:01 -08:00
des.c
des.h
dict.c
dict.h
display.c
display.h
downmix_info.c
downmix_info.h
dynarray.h
encryption_info.c avutil/encryption_info: Fix size calculation. 2018-08-15 01:33:45 +02:00
encryption_info.h avutil/encryption_info: Fix documentation problem. 2018-06-27 13:43:38 +02:00
error.c
error.h
eval.c
eval.h
ffmath.h
fifo.c
fifo.h
file_open.c avpriv_tempfile: add djgpp fallback 2018-11-28 22:16:07 +11:00
file.c avutil/file: allow mapping 0 byte files with av_file_map 2018-09-09 21:21:42 +02:00
file.h avutil/file: allow mapping 0 byte files with av_file_map 2018-09-09 21:21:42 +02:00
fixed_dsp.c
fixed_dsp.h
float_dsp.c avutil: add float_dsp.vector_dmul 2018-09-12 19:15:09 +02:00
float_dsp.h avutil: add float_dsp.vector_dmul 2018-09-12 19:15:09 +02:00
frame.c avutil: add ROI (Region Of Interest) data struct and bump version 2019-01-17 21:47:11 +00:00
frame.h lavu/frame: Fix typo. 2019-01-18 12:34:19 +01:00
hash.c avutil/crypto: change length parameter to size_t on the remaining modules 2018-02-15 11:21:28 -03:00
hash.h avutil/crypto: change length parameter to size_t on the remaining modules 2018-02-15 11:21:28 -03:00
hdr_dynamic_metadata.c Add HDR dynamic metadata struct (for SMPTE 2094-40) to libavutil 2018-12-21 17:52:00 +01:00
hdr_dynamic_metadata.h Add HDR dynamic metadata struct (for SMPTE 2094-40) to libavutil 2018-12-21 17:52:00 +01:00
hmac.c
hmac.h
hwcontext_cuda_internal.h
hwcontext_cuda.c avutil/hcontext_cuda: Remove unnecessary stream synchronisation 2019-03-30 10:56:49 -07:00
hwcontext_cuda.h avutil/hwcontext_cuda: add CUstream in cuda hwctx 2018-05-10 00:34:22 +02:00
hwcontext_d3d11va.c lavu/hwcontext_d3d: Cast src pointers calling av_image_copy*(). 2019-04-19 14:20:24 +02:00
hwcontext_d3d11va.h
hwcontext_drm.c
hwcontext_drm.h hwcontext_drm: Clarify value for unknown format modifiers 2018-03-22 23:18:53 +00:00
hwcontext_dxva2.c lavu/hwcontext_d3d: Cast src pointers calling av_image_copy*(). 2019-04-19 14:20:24 +02:00
hwcontext_dxva2.h
hwcontext_internal.h hwcontext_internal: add ff_hwframe_map_replace 2018-06-21 16:34:06 +01:00
hwcontext_mediacodec.c
hwcontext_mediacodec.h
hwcontext_opencl.c libavutil/hwcontext_opencl: Fix channel order in format support check 2019-04-09 22:16:01 +01:00
hwcontext_opencl.h
hwcontext_qsv.c lavu/hwcontext_qsv: Fix the realign check for hwupload 2019-04-30 17:14:23 +08:00
hwcontext_qsv.h
hwcontext_vaapi.c hwcontext_vaapi: Improve format mapping 2018-09-23 14:42:34 +01:00
hwcontext_vaapi.h
hwcontext_vdpau.c avutil/hwcontext_vdpau: Map 444 pix fmts to new VdpYCbCr types 2019-05-05 11:35:35 -07:00
hwcontext_vdpau.h
hwcontext_videotoolbox.c avcodec/videotoolbox: add support for 10bit pixel format 2019-04-16 03:43:06 +03:00
hwcontext_videotoolbox.h
hwcontext.c hwcontext_internal: add ff_hwframe_map_replace 2018-06-21 16:34:06 +01:00
hwcontext.h hwcontext: Fix documentation for av_hwdevice_ctx_alloc() 2018-02-04 13:47:19 +00:00
imgutils_internal.h
imgutils.c lavu/imgutils: Use FFABS() instead of abs() for ptrdiff_t. 2019-02-01 23:19:25 +01:00
imgutils.h
integer.c avutil/integer: Fix integer overflow in av_mul_i() 2018-10-24 23:15:24 +02:00
integer.h
internal.h lavu/internal: Replace an empty loop with "do {}". 2018-12-19 15:46:29 +01:00
intfloat.h
intmath.c
intmath.h
intreadwrite.h intreadwrite: add AV_RL64A, AV_WL64A 2019-01-11 23:43:37 +11:00
lfg.c
lfg.h
libavutil.v
libm.h
lls.c
lls.h
log2_tab.c
log.c avutil/log: Replace the number by macro for bprint init 2018-06-17 09:59:33 +08:00
log.h
lzo.c
lzo.h
macros.h
Makefile libavutil: add an FFT & MDCT implementation 2019-05-15 17:39:59 +01:00
mastering_display_metadata.c
mastering_display_metadata.h avutil/mastering_display_metadata: fix copyright header wrongly formated as doxy 2018-01-11 11:35:51 -03:00
mathematics.c
mathematics.h
md5.c
md5.h
mem_internal.h
mem.c avutil/mem: Optimize fill32() by unrolling and using 64bit 2019-01-20 21:42:20 +01:00
mem.h avutil/mem: Fix invalid use of av_alloc_size 2018-11-26 23:47:29 +01:00
motion_vector.h
murmur3.c avutil/crypto: change length parameter to size_t on the remaining modules 2018-02-15 11:21:28 -03:00
murmur3.h avutil/crypto: change length parameter to size_t on the remaining modules 2018-02-15 11:21:28 -03:00
opt.c avutil/opt: check for minimum and maximum values when setting AV_OPT_TYPE_DURATION fields 2018-10-07 20:26:29 +02:00
opt.h lavu/opt: add AV_OPT_FLAG_DEPRECATED 2018-04-26 19:50:29 +02:00
parseutils.c lavu/parseutils: Allow to parse >= 100 hours. 2019-02-09 13:59:10 +01:00
parseutils.h
pca.c
pca.h
pixdesc.c avutil: Add NV24 and NV42 pixel formats 2019-05-12 07:51:02 -07:00
pixdesc.h avutil/pixdesc: Add av_write_image_line2(), av_read_image_line2() 2018-10-27 22:39:27 +02:00
pixelutils.c lavutil/pixelutils: add sad_32x32 in pixelutils API. 2018-07-31 19:09:35 +08:00
pixelutils.h
pixfmt.h avutil: Add NV24 and NV42 pixel formats 2019-05-12 07:51:02 -07:00
qsort.h
random_seed.c random_seed: use bcrypt instead of the old wincrypt API 2018-04-19 10:54:26 +03:00
random_seed.h
rational.c
rational.h
rc4.c
rc4.h
replaygain.h
reverse.c
reverse.h
ripemd.c avutil/crypto: change length parameter to size_t on the remaining modules 2018-02-15 11:21:28 -03:00
ripemd.h avutil/crypto: change length parameter to size_t on the remaining modules 2018-02-15 11:21:28 -03:00
samplefmt.c
samplefmt.h
sha512.c
sha512.h
sha.c
sha.h
slicethread.c w32pthreads: always use Vista+ API, drop XP support 2017-12-26 02:49:48 +01:00
slicethread.h
softfloat_ieee754.h
softfloat_tables.h
softfloat.h
spherical.c
spherical.h
stereo3d.c
stereo3d.h
tablegen.h
tea.c
tea.h
thread.h lavc: replace and deprecate the lock manager 2017-12-26 02:50:00 +01:00
threadmessage.c lavu/threadmessage: add av_thread_message_queue_nb_elems() 2018-04-26 19:41:19 +02:00
threadmessage.h lavu/threadmessage: add av_thread_message_queue_nb_elems() 2018-04-26 19:41:19 +02:00
time_internal.h Merge commit 'c4642788e83b0858bca449f9b6e71ddb015dfa5d' 2019-05-02 13:50:31 -03:00
time.c
time.h
timecode.c avutil/timecode: fix starting frame number for 59.94 fps 2018-02-23 01:53:34 +01:00
timecode.h
timer.h
timestamp.h
tree.c
tree.h
twofish.c
twofish.h
tx.c libavutil: add an FFT & MDCT implementation 2019-05-15 17:39:59 +01:00
tx.h libavutil: add an FFT & MDCT implementation 2019-05-15 17:39:59 +01:00
utils.c
version.h avutil: Add NV24 and NV42 pixel formats 2019-05-12 07:51:02 -07:00
wchar_filename.h
xga_font_data.c
xga_font_data.h
xtea.c
xtea.h