summaryrefslogtreecommitdiff
path: root/libavcodec/ac3enc_template.c
Commit message (Collapse)AuthorAge
* ac3enc: halve the MDCT window size by using vector_fmul_reverseLynne2021-01-14
| | | | | This brings the encoder in-line with the rest of ours and saves on a bit of memory.
* ac3enc: do not clip coefficients after transformsLynne2021-01-14
| | | | | | | In either encoder, its impossible for the coefficients to go past 25 bits right after the MDCT. Our MDCT is numerically stable. For the floating point encoder, in case a NaN is contained, lrintf() will raise a floating point exception during the conversion.
* ac3enc_fixed: convert to 32-bit sample formatLynne2021-01-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The AC3 encoder used to be a separate library called "Aften", which got merged into libavcodec (literally, SVN commits and all). The merge preserved as much features from the library as possible. The code had two versions - a fixed point version and a floating point version. FFmpeg had floating point DSP code used by other codecs, the AC3 decoder including, so the floating-point DSP was simply replaced with FFmpeg's own functions. However, FFmpeg had no fixed-point audio code at that point. So the encoder brought along its own fixed-point DSP functions, including a fixed-point MDCT. The fixed-point MDCT itself is trivially just a float MDCT with a different type and each multiply being a fixed-point multiply. So over time, it got refactored, and the FFT used for all other codecs was templated. Due to design decisions at the time, the fixed-point version of the encoder operates at 16-bits of precision. Although convenient, this, even at the time, was inadequate and inefficient. The encoder is noisy, does not produce output comparable to the float encoder, and even rings at higher frequencies due to the badly approximated winow function. Enter MIPS (owned by Imagination Technologies at the time). They wanted quick fixed-point decoding on their FPUless cores. So they contributed patches to template the AC3 decoder so it had both a fixed-point and a floating-point version. They also did the same for the AAC decoder. They however, used 32-bit samples. Not 16-bits. And we did not have 32-bit fixed-point DSP functions, including an MDCT. But instead of templating our MDCT to output 3 versions (float, 32-bit fixed and 16-bit fixed), they simply copy-pasted their own MDCT into ours, and completely ifdeffed our own MDCT code out if a 32-bit fixed point MDCT was selected. This is also the status quo nowadays - 2 separate MDCTs, one which produces floating point and 16-bit fixed point versions, and one sort-of integrated which produces 32-bit MDCT. MIPS weren't all that interested in encoding, so they left the encoder as-is, and they didn't care much about the ifdeffery, mess or quality - it's not their problem. So the MDCT/FFT code has always been a thorn in anyone looking to clean up code's eye. Backstory over. Internally AC3 operates on 25-bit fixed-point coefficients. So for the floating point version, the encoder simply runs the float MDCT, and converts the resulting coefficients to 25-bit fixed-point, as AC3 is inherently a fixed-point codec. For the fixed-point version, the input is 16-bit samples, so to maximize precision the frame samples are analyzed and the highest set bit is detected via ac3_max_msb_abs_int16(), and the coefficients are then scaled up via ac3_lshift_int16(), so the input for the FFT is always at least 14 bits, computed in normalize_samples(). After FFT, the coefficients are scaled up to 25 bits. This patch simply changes the encoder to accept 32-bit samples, reusing the already well-optimized 32-bit MDCT code, allowing us to clean up and drop a large part of a very messy code of ours, as well as prepare for the future lavu/tx conversion. The coefficients are simply scaled down to 25 bits during windowing, skipping 2 separate scalings, as the hacks to extend precision are simply no longer necessary. There's no point in running the MDCT always at 32 bits when you're going to drop 6 bits off anyway, the headroom is plenty, and the MDCT rounds properly. This also makes the encoder even slightly more accurate over the float version, as there's no coefficient conversion step necessary. SIZE SAVINGS: ARM32: HARDCODED TABLES: BASE - 10709590 DROP DSP - 10702872 - diff: -6.56KiB DROP MDCT - 10667932 - diff: -34.12KiB - both: -40.68KiB DROP FFT - 10336652 - diff: -323.52KiB - all: -364.20KiB SOFTCODED TABLES: BASE - 9685096 DROP DSP - 9678378 - diff: -6.56KiB DROP MDCT - 9643466 - diff: -34.09KiB - both: -40.65KiB DROP FFT - 9573918 - diff: -67.92KiB - all: -108.57KiB ARM64: HARDCODED TABLES: BASE - 14641112 DROP DSP - 14633806 - diff: -7.13KiB DROP MDCT - 14604812 - diff: -28.31KiB - both: -35.45KiB DROP FFT - 14286826 - diff: -310.53KiB - all: -345.98KiB SOFTCODED TABLES: BASE - 13636238 DROP DSP - 13628932 - diff: -7.13KiB DROP MDCT - 13599866 - diff: -28.38KiB - both: -35.52KiB DROP FFT - 13542080 - diff: -56.43KiB - all: -91.95KiB x86: HARDCODED TABLES: BASE - 12367336 DROP DSP - 12354698 - diff: -12.34KiB DROP MDCT - 12331024 - diff: -23.12KiB - both: -35.46KiB DROP FFT - 12029788 - diff: -294.18KiB - all: -329.64KiB SOFTCODED TABLES: BASE - 11358094 DROP DSP - 11345456 - diff: -12.34KiB DROP MDCT - 11321742 - diff: -23.16KiB - both: -35.50KiB DROP FFT - 11276946 - diff: -43.75KiB - all: -79.25KiB PERFORMANCE (10min random s32le): ARM32 - before - 39.9x - 0m15.046s ARM32 - after - 28.2x - 0m21.525s Speed: -30% ARM64 - before - 36.1x - 0m16.637s ARM64 - after - 36.0x - 0m16.727s Speed: -0.5% x86 - before - 184x - 0m3.277s x86 - after - 190x - 0m3.187s Speed: +3%
* avcodec/ac3enc: Factor common end of float/fixed encode_frame outAndreas Rheinhardt2021-01-09
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avcodec/ac3enc_template: Perform compile-time checks at compile-timeAndreas Rheinhardt2021-01-09
| | | | | | | | | Runtime checks for whether the encoder is fixed-point or not are unnecessary here as this is a template; furthermore, there is no fixed-point EAC-3 encoder, so some checks for whether one is in EAC-3 mode can be omitted when doing fixed-point encoding. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avcodec/[e]ac3enc: Don't invade CONFIG_ namespaceAndreas Rheinhardt2021-01-09
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avcodec/ac3enc: Set function pointers earlierAndreas Rheinhardt2021-01-09
| | | | Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* lavu: move LOCAL_ALIGNED from internal.h to mem_internal.hAnton Khirnov2021-01-01
| | | | That is a more appropriate place for it.
* avcodec/ac3enc_template: Don't free uninitialized pointers on errorAndreas Rheinhardt2020-09-18
| | | | | | | | | | | | | The ac3 encoders (fixed- and floating-point AC-3 as well as the EAC-3 encoder) all allocate an array whose elements are pointers to other buffers. The array is not zeroed initially so that if an allocation of one of the subbuffers fails, the other pointers are uninitialized. This causes problems when cleaning, so zero the array initially. (Only the fixed-point AC-3 encoder was affected by this, because the other two don't clean up at all in case of errors during init.) Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
* avcodec/ac3enc_template: remove FF_ALLOC_ARRAY_OR_GOTO and gotos labelLimin Wang2020-06-13
| | | | Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
* Merge commit 'f0d3e43bd77b3194a28d75884cf83083b188bf30'James Almer2017-04-07
|\ | | | | | | | | | | | | * commit 'f0d3e43bd77b3194a28d75884cf83083b188bf30': ac3enc: Reshuffle functions to avoid forward declarations Merged-by: James Almer <jamrial@gmail.com>
| * ac3enc: Reshuffle functions to avoid forward declarationsDiego Biurrun2016-11-28
| |
* | Merge commit 'e22c63ac74b2968075be8bf0d2deb1ee63b28976'James Almer2017-04-07
|\| | | | | | | | | | | | | * commit 'e22c63ac74b2968075be8bf0d2deb1ee63b28976': ac3enc: Reshuffle some float/fixed-mode ifdefs to avoid a dummy function Merged-by: James Almer <jamrial@gmail.com>
| * ac3enc: Reshuffle some float/fixed-mode ifdefs to avoid a dummy functionDiego Biurrun2016-11-28
| |
| * ac3: Check the array bound before dereferencingLuca Barbato2016-05-27
| | | | | | | | | | | | CC: libav-stable@libav.org Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
| * ac3enc_template: Use the correct context fieldVittorio Giovara2015-07-27
| | | | | | | | | | For audio encoders, delay has no effect, use the appropriate one, initial_padding (see 2df0c32).
* | avcodec: Add a min size parameter to ff_alloc_packet2()Michael Niedermayer2015-07-27
| | | | | | | | | | | | | | | | This parameter can be used to inform the allocation code about how much downsizing might occur, and can be used to optimize how to allocate the packet Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* | avcodec/ac3enc: Use avpriv_float_dsp_alloc()Michael Niedermayer2014-11-29
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | avcodec/ac3enc_template: use the initial_padding fieldMichael Niedermayer2014-10-14
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | avcodec/ac3enc_template: fix out of array readMichael Niedermayer2014-09-27
| | | | | | | | | | Found-by: Andreas Cadhalpun Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | avcodec/ac3enc_template: Use FF_ALLOC_ARRAY_OR_GOTO()Michael Niedermayer2014-09-10
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | Merge commit '9a9e2f1c8aa4539a261625145e5c1f46a8106ac2'Michael Niedermayer2014-06-22
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * commit '9a9e2f1c8aa4539a261625145e5c1f46a8106ac2': dsputil: Split audio operations off into a separate context Conflicts: configure libavcodec/takdec.c libavcodec/x86/Makefile libavcodec/x86/dsputil.asm libavcodec/x86/dsputil_init.c libavcodec/x86/dsputil_mmx.c libavcodec/x86/dsputil_x86.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * dsputil: Split audio operations off into a separate contextDiego Biurrun2014-06-22
| |
* | Merge commit 'aba70bb5387f12dfa5e6cd8cb861c9c7e668151f'Michael Niedermayer2014-03-26
|\| | | | | | | | | | | | | * commit 'aba70bb5387f12dfa5e6cd8cb861c9c7e668151f': Add missing headers to make template files compile (more) standalone Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * Add missing headers to make template files compile (more) standaloneDiego Biurrun2014-03-26
| |
* | Merge commit '4958f35a2ebc307049ff2104ffb944f5f457feb3'Michael Niedermayer2013-12-09
|\| | | | | | | | | | | | | | | | | | | | | | | * commit '4958f35a2ebc307049ff2104ffb944f5f457feb3': dsputil: Move apply_window_int16 to ac3dsp Conflicts: libavcodec/arm/ac3dsp_init_arm.c libavcodec/arm/ac3dsp_neon.S libavcodec/x86/ac3dsp_init.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * dsputil: Move apply_window_int16 to ac3dspDiego Biurrun2013-12-08
| | | | | | | | The (optimized) functions are used nowhere else.
* | libavcodec/ac3enc_template.c: Fix duplicate wordsMichael Niedermayer2013-08-12
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | normalize calls to ff_alloc_packet2James Zern2013-03-06
| | | | | | | | | | | | | | - check ret < 0 - remove excessive error log Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | ac3enc_template: silence may be used uninitialized in this function warningsMichael Niedermayer2013-02-26
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | Merge commit '218aefce4472dc02ee3f12830a9a894bf7916da9'Michael Niedermayer2013-02-09
|\| | | | | | | | | | | | | | | | | | | | | | | * commit '218aefce4472dc02ee3f12830a9a894bf7916da9': dsputil: Move LOCAL_ALIGNED macros to libavutil Conflicts: libavcodec/dvdec.c libavcodec/imc.c libavcodec/mpegvideo_motion.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * dsputil: Move LOCAL_ALIGNED macros to libavutilDiego Biurrun2013-02-08
| |
* | ac3enc: fix 'warning: block0 may be used uninitialized in this function'Michael Niedermayer2013-01-29
| | | | | | | | | | | | The pointer is also initialized to NULL for safety. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | Merge remote-tracking branch 'qatar/master'Michael Niedermayer2012-10-07
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * qatar/master: wmaenc: use float planar sample format (e)ac3enc: use planar sample format aacenc: use planar sample format adpcmenc: use planar sample format for adpcm_ima_wav and adpcm_ima_qt adpcmenc: move 'ch' variable to higher scope adpcmenc: fix 3 instances of variable shadowing adpcm_ima_wav: simplify encoding libvorbis: use planar sample format libmp3lame: use planar sample formats vorbisenc: use float planar sample format ffm: do not write or read the audio sample format parseutils: fix parsing of invalid alpha values doc/RELEASE_NOTES: update for the 9 release. smoothstreamingenc: Add a more verbose error message smoothstreamingenc: Ignore the return value from mkdir smoothstreamingenc: Try writing a manifest when opening the muxer smoothstreamingenc: Move the output_chunk_list and write_manifest functions up smoothstreamingenc: Properly return errors from ism_flush to the caller smoothstreamingenc: Check the output UrlContext before accessing it Conflicts: doc/RELEASE_NOTES libavcodec/aacenc.c libavcodec/ac3enc_template.c libavcodec/wmaenc.c tests/ref/lavf/ffm Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * (e)ac3enc: use planar sample formatJustin Ruggles2012-10-06
| |
* | Merge remote-tracking branch 'qatar/master'Michael Niedermayer2012-06-08
|\| | | | | | | | | | | | | | | | | | | | | | | * qatar/master: float_dsp: ppc: add a separate header for Altivec function prototypes ARM: fix float_dsp breakage from d5a7229 Add a float DSP framework to libavutil PPC: Move types_altivec.h and util_altivec.h from libavcodec to libavutil ARM: Move asm.S from libavcodec to libavutil vc1dsp: mark put/avg_vc1_mspel_mc() always_inline Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * Add a float DSP framework to libavutilJustin Ruggles2012-06-08
| | | | | | | | Move vector_fmul() from DSPContext to AVFloatDSPContext.
* | cosmetics: remove superfluous curly bracketsPaul B Mahol2012-03-23
| | | | | | | | | | Signed-off-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | ac3enc: switch to ff_alloc_packet2().Michael Niedermayer2012-03-22
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | Merge remote-tracking branch 'qatar/master'Michael Niedermayer2012-03-22
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * qatar/master: (26 commits) adxenc: use AVCodec.encode2() adxenc: Use the AVFrame in ADXContext for coded_frame indeo4: fix out-of-bounds function call. configure: Restructure help output. configure: Internal-only components should not be command-line selectable. vorbisenc: use AVCodec.encode2() libvorbis: use AVCodec.encode2() libopencore-amrnbenc: use AVCodec.encode2() ra144enc: use AVCodec.encode2() nellymoserenc: use AVCodec.encode2() roqaudioenc: use AVCodec.encode2() libspeex: use AVCodec.encode2() libvo_amrwbenc: use AVCodec.encode2() libvo_aacenc: use AVCodec.encode2() wmaenc: use AVCodec.encode2() mpegaudioenc: use AVCodec.encode2() libmp3lame: use AVCodec.encode2() libgsmenc: use AVCodec.encode2() libfaac: use AVCodec.encode2() g726enc: use AVCodec.encode2() ... Conflicts: configure libavcodec/Makefile libavcodec/ac3enc.c libavcodec/adxenc.c libavcodec/libgsm.c libavcodec/libvorbis.c libavcodec/vorbisenc.c libavcodec/wmaenc.c tests/ref/acodec/g722 tests/ref/lavf/asf tests/ref/lavf/ffm tests/ref/lavf/mkv tests/ref/lavf/mpg tests/ref/lavf/rm tests/ref/lavf/ts tests/ref/seek/lavf_asf tests/ref/seek/lavf_ffm tests/ref/seek/lavf_mkv tests/ref/seek/lavf_mpg tests/ref/seek/lavf_rm tests/ref/seek/lavf_ts Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * ac3enc: update to AVCodec.encode2()Justin Ruggles2012-03-20
| | | | | | | | Update FATE references due to encoder delay.
* | Merge remote-tracking branch 'qatar/master'Michael Niedermayer2012-02-14
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * qatar/master: rtpdec: Use 4 byte startcodes for H.264 matroskadec: Mark variable as av_unused. Move some conditionally used variables into the block where they are used. Drop some completely unnecessary av_unused attributes. swscale: Remove unused variable alpMmxFilter. Drop unnecessary av_uninit attributes from some variable declarations. movenc: Support muxing wmapro in ismv/isma mpegtsenc: Add an AVOption for forcing a new PAT/PMT/SDT to be written swscale: move YUV2PACKED16WRAPPER() macro down to where it is used. swscale: handle gray16 as a "planar" YUV format (Y-only, of course). swscale: use yuv2packed1() functions for unscaled chroma also. swscale: fix incorrect chroma bias in yuv2rgb48_1_c(). swscale: fix invalid memory accesses in yuvpacked1() functions. Move PS2 MMI code below the mips subdirectory, where it belongs. mips: Move MMI function declarations to a header. build: Set correct dependencies for rtmp* protocols implemented by librtmp. Conflicts: libavcodec/ac3enc_template.c libavformat/mpegtsenc.c libswscale/output.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * Drop unnecessary av_uninit attributes from some variable declarations.Diego Biurrun2012-02-13
| | | | | | | | Recent versions of gcc (4.4+) no longer give false positive warnings.
* | ac3enc: clenaup project name in one commentMichael Niedermayer2011-11-29
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | Merge remote-tracking branch 'qatar/master'Michael Niedermayer2011-11-03
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * qatar/master: (44 commits) replacement Indeo 3 decoder gsm demuxer: do not allocate packet twice. flvenc: use first packet delay as global delay. ac3enc: doxygen update. imc: return error codes instead of 0 for error conditions. imc: return meaningful error codes instead of -1 imc: do not set channel layout for stereo imc: validate channel count imc: check for ff_fft_init() failure imc: check output buffer size before decoding imc: use DSPContext.bswap16_buf() to byte-swap packet data rtsp: add allowed_media_types option libgsm: add flush function to reset the decoder state when seeking libgsm: simplify decoding by using a loop gsm: log error message when packet is too small libgsmdec: do not needlessly set *data_size to 0 gsmdec: do not needlessly set *data_size to 0 gsmdec: add flush function to reset the decoder state when seeking libgsmdec: check output buffer size before decoding gsmdec: log error message when output buffer is too small. ... Conflicts: Changelog ffplay.c libavcodec/indeo3.c libavcodec/mjpeg_parser.c libavcodec/vp3.c libavformat/cutils.c libavformat/id3v2.c libavutil/parseutils.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * ac3enc: doxygen update.Justin Ruggles2011-11-02
| | | | | | | | | | | | Add some parameters to existing function documentation. Remove some unneeded documentation. Convert some static function documentation to non-doxygen style.
* | Merge remote-tracking branch 'mans/ac3'Michael Niedermayer2011-10-22
|\ \ | |/ |/| | | | | | | | | | | | | | | | | | | | | * mans/ac3: ac3enc: slightly faster quantize_mantissas_blk_ch() ac3enc: NEON optimised sum_square_butterfly_float ac3enc: neon optimised sum_square_butterfly_int32 ac3enc: move inner loop of compute_rematrixing_strategy to ac3dsp Conflicts: libavcodec/ac3enc_template.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * ac3enc: move inner loop of compute_rematrixing_strategy to ac3dspMans Rullgard2011-07-06
| |
* | ac3enc: Add channel coupling support for the fixed-point AC-3 encoder.Justin Ruggles2011-09-05
| | | | | | | | Update FATE references accordingly.
* | ac3enc: scale floating-point coupling channel coefficients inJustin Ruggles2011-09-05
| | | | | | | | scale_coefficients() rather than in apply_channel_coupling()