summaryrefslogtreecommitdiff
path: root/libavcodec/aacenc_quantization.h
Commit message (Collapse)AuthorAgeFilesLines
* avcodec/aacenc_quantization: Deduplicate quantization functionsAndreas Rheinhardt2022-08-051-227/+12
| | | | | | | | | | | | | | | | | | Up until now, there were four copies of quantize_and_encode_band_cost_(ZERO|[SU]QUAD|[SU]PAIR|ESC|NONE|NOISE|STEREO) (namely in aaccoder.o, aacenc_is.o, aacenc_ltp.o, aacenc_pred.o). As 43b378a0d321e3d01f196cec95e13acfac80d464 says, this is meant to enable more optimizations. Yet neither GCC nor Clang performed such optimizations: The functions in the aforementioned files are not optimized according to the specifics of the calls in the respective file. Therefore duplicating them is a waste of space; this commit therefore stops doing so. The remaining copy is placed into aaccoder.c (which is the only place where the "round to zero" variant of quantize_and_encode_band() is used, so that this can be completely internal to aaccoder.c). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
* avcodec/aacenc_quantization: Remove always-zero function parameterAndreas Rheinhardt2022-08-051-4/+4
| | | | | | rtz is only ever nonzero for quantize_and_encode_band(). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
* aacenc: add SIMD optimizations for abs_pow34 and quantizationRostislav Pehlivanov2016-10-181-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Performance improvements: quant_bands: with: 681 decicycles in quant_bands, 8388453 runs, 155 skips without: 1190 decicycles in quant_bands, 8388386 runs, 222 skips Around 42% for the function Twoloop coder: abs_pow34: with/without: 7.82s/8.17s Around 4% for the entire encoder Both: with/without: 7.15s/8.17s Around 12% for the entire encoder Fast coder: abs_pow34: with/without: 3.40s/3.77s Around 10% for the entire encoder Both: with/without: 3.02s/3.77s Around 20% faster for the entire encoder Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com> Tested-by: Michael Niedermayer <michael@niedermayer.cc> Reviewed-by: James Almer <jamrial@gmail.com>
* Revert "aacenc: use av_clip() instead of av_clip() during quantization"Rostislav Pehlivanov2016-03-301-1/+1
| | | | | | This reverts commit c0918613a0ecaac6819409c64107583eebc0ccc2, since it triggered a new assertion with gcc. This bug definitely needs a true proper fix.
* aacenc: use av_clip() instead of av_clip() during quantizationRostislav Pehlivanov2016-03-301-1/+1
| | | | | | | | | Seems like clang might be miscompiling it and causing a signed integer overflow, making a FATE test fail. Doesn't seem to affect performance, it only runs on the ESC codebook. Reviewed-by: Claudio Freire <klaussfreire@gmail.com> Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
* aacenc_quantization: fix header descriptionRostislav Pehlivanov2015-10-121-1/+1
| | | | Two guesses as to which file was used as boilerplate.
* AAC encoder: memoize quantize_band_costClaudio Freire2015-10-121-0/+2
| | | | | | | | | | The bulk of calls to quantize_band_cost are replaced by a call to a version that memoizes, greatly improving performance, since during coefficient search there is a great deal of repeat work. Memoization cannot always be applied, so do this in a different function, and leave the original as-is.
* AAC encoder: Extensive improvementsClaudio Freire2015-10-111-16/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This finalizes merging of the work in the patches in ticket #2686. Improvements to twoloop and RC logic are extensive. The non-exhaustive list of twoloop improvments includes: - Tweaks to distortion limits on the RD optimization phase of twoloop - Deeper search in twoloop - PNS information marking to let twoloop decide when to use it (turned out having the decision made separately wasn't working) - Tonal band detection and priorization - Better band energy conservation rules - Strict hole avoidance For rate control: - Use psymodel's bit allocation to allow proper use of the bit reservoir. Don't work against the bit reservoir by moving lambda in the opposite direction when psymodel decides to allocate more/less bits to a frame. - Retry the encode if the effective rate lies outside a reasonable margin of psymodel's allocation or the selected ABR. - Log average lambda at the end. Useful info for everyone, but especially for tuning of the various encoder constants that relate to lambda feedback. Psy: - Do not apply lowpass with a FIR filter, instead just let the coder zero bands above the cutoff. The FIR filter induces group delay, and while zeroing bands causes ripple, it's lost in the quantization noise. - Experimental VBR bit allocation code - Tweak automatic lowpass filter threshold to maximize audio bandwidth at all bitrates while still providing acceptable, stable quality. I/S: - Phase decision fixes. Unrelated to #2686, but the bugs only surfaced when the merge was finalized. Measure I/S band energy accounting for phase, and prevent I/S and M/S from being applied both. PNS: - Avoid marking short bands with PNS when they're part of a window group in which there's a large variation of energy from one window to the next. PNS can't preserve those and the effect is extremely noticeable. M/S: - Implement BMLD protection similar to the specified in ISO-IEC/13818:7-2003, Appendix C Section 6.1. Since M/S decision doesn't conform to section 6.1, a different method had to be implemented, but should provide equivalent protection. - Move the decision logic closer to the method specified in ISO-IEC/13818:7-2003, Appendix C Section 6.1. Specifically, make sure M/S needs less bits than dual stereo. - Don't apply M/S in bands that are using I/S Now, this of course needed adjustments in the compare targets and fuzz factors of the AAC encoder's fate tests, but if wondering why the targets go up (more distortion), consider the previous coder was using too many bits on LF content (far more than required by psy), and thus those signals will now be more distorted, not less. The extra distortion isn't audible though, I carried extensive ABX testing to make sure. A very similar patch was also extensively tested by Kamendo2 in the context of #2686.
* AAC encoder: refactor to resynchronize MIPS portClaudio Freire2015-09-161-0/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch refactors the AAC coders to reuse code between the MIPS port and the regular, portable C code. There were two main functions that had to use hand-optimized versions of quantization code: - search_for_quantizers_twoloop - codebook_trellis_rate Those two were split into their own template header files so they can be inlined inside both the MIPS port and the generic code. In each context, they'll link to their specialized implementations, and thus be optimized by the compiler. This approach I believe is better than maintaining several copies of each function. As past experience has proven, having to keep those in sync was error prone. In this way, they will remain in sync by default. Also, an implementation of the dequantized output argument for the optimized quantize_and_encode functions is included in the patch. While the current implementation of search_for_pred still isn't using it, future iterations of main prediction probably will. It should not imply any measurable performance hit while not being used.
* aacenc_quantization: replace copysign() with a ternary operatorRostislav Pehlivanov2015-08-221-1/+1
| | | | | | | This commit removes the last thing a Windows environment can complain about the AAC encoder code. Leftover from an old revision. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
* aacenc: Harmonize multiple inclusion guardsTimothy Gu2015-08-221-0/+5
| | | | | Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com> Reviewed-by: Ganesh Ajjanagadde <gajjanag@mit.edu>
* aaccoder: move the quantization functions to a separate fileRostislav Pehlivanov2015-08-211-0/+255
This commit moves the quantizer to a separate header file. This allows the quantizer to be used from a separate files outside of aaccoder without having to put another function pointer and will result in a slight speedup as the compiler can do more optimizations. This is required for commits following. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>