- 18 Oct, 2016 1 commit
-
-
Rostislav Pehlivanov authored
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>
-
- 12 Oct, 2016 1 commit
-
-
Rostislav Pehlivanov authored
Using lfg was an overkill in this case where the random numbers were only used for encoder descisions. Should increase result uniformity between different FPUs and gives a slight speedup. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 13 Aug, 2016 2 commits
-
-
Rostislav Pehlivanov authored
Too much copy and pasting. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
Rostislav Pehlivanov authored
Does nothing fancy but still sounds very decent at 128kbps. Still room to improve by bringing in the low pass and PNS management from the main big twoloop which should improve its quality but not sacrifice that much speed. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 20 Jan, 2016 1 commit
-
-
Rostislav Pehlivanov authored
Has been marked for removal for over a month and has not been improved or touched at all since it was implemented. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 17 Jan, 2016 1 commit
-
-
Claudio Freire authored
Make sure to properly enforce maximum scalefactor delta in PNS and I/S, not as an absolute range but relative to the previous and first scalefactor, the latter important since PNS uses an implicit inicial scalefactor derived from the global gain, and encoded in a different way, which makes a big difference in the allowed range.
-
- 13 Jan, 2016 2 commits
-
-
Claudio Freire authored
1. Fix sf_idx and band_type addressing to address only the first subwindow in the group (others could hold garbage values) 2. Don't step on ms_mask when is_mask is set. I/S selection already sets the ms_mask properly and shouldn't be overridden. 3. Use mid/sid cb/sf when computing coding error, as should be since those are the cb/sfs that will eventually be set. 4. Fix distortion computation on multi-subwindow groups (was subtracting the bits terms multiple times) 5. Clear ms_mask when one side uses PNS and the other doesn't. When using PNS, ms_mask signals correlated noise, which can be detected just like regular M/S detection, so we don't skip noise bands, but when only one side uses PNS setting the flag can confuse some encoders, so avoid that.
-
Claudio Freire authored
In rare corner cases it could still fail an assert on sf_diff due to failure to update prev_sf in some code paths. Fix that case.
-
- 22 Dec, 2015 1 commit
-
-
Claudio Freire authored
Fix possible SF delta violation that would cause an eventual assertion failure in some corner cases (esp on very low bitrates) when marking bands for PNS due to misuse of the sf_delta utilities
-
- 14 Dec, 2015 1 commit
-
-
Rostislav Pehlivanov authored
PSNR doesn't change as expected. The AAC spec doesn't really say anything about how exactly to generate noise. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 09 Dec, 2015 1 commit
-
-
Claudio Freire authored
Fix OOB access in search_for_pns which was using w2 outside the window group loop, and fix a typo in which it was checking sf_idx instead of band_type Reviewed-by: Andreas Cadhalpun <andreas.cadhalpun@googlemail.com> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
-
- 05 Dec, 2015 2 commits
-
-
Claudio Freire authored
Avoid generating broken paths when some bands have an empty search space.
-
Andreas Cadhalpun authored
If minq is negative, the range of sf_idx can be larger than SCALE_MAX_DIFF allows, causing assertion failures later in encode_scale_factors. Reviewed-by: Claudio Freire <klaussfreire@gmail.com> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
-
- 02 Dec, 2015 1 commit
-
-
Claudio Freire authored
This patch does 4 things, all of which interact and thus it woudln't be possible to commit them separately without causing either quality regressions or assertion failures. Fate comparison targets don't all reflect improvements in quality, yet listening tests show substantially improved quality and stability. 1. Increase SF range utilization. The spec requires SF delta values to be constrained within the range -60..60. The previous code was applying that range to the whole SF array and not only the deltas of consecutive values, because doing so requires smarter code: zeroing or otherwise skipping a band may invalidate lots of SF choices. This patch implements that logic to allow the coders to utilize the full dynamic range of scalefactors, increasing quality quite considerably, and fixing delta-SF-related assertion failures, since now the limitation is enforced rather than asserted. 2. PNS tweaks The previous modification makes big improvements in twoloop's efficiency, and every time that happens PNS logic needs to be tweaked accordingly to avoid it from stepping all over twoloop's decisions. This patch includes modifications of the sort. 3. Account for lowpass cutoff during PSY analysis The closer PSY's allocation is to final allocation the better the quality is, and given these modifications, twoloop is now very efficient at avoiding holes. Thus, to compute accurate thresholds, PSY needs to account for the lowpass applied implicitly during twoloop (by zeroing high bands). This patch makes twoloop set the cutoff in psymodel's context the first time it runs, and makes PSY account for it during threshold computation, making PE and threshold computations closer to the final allocation and thus achieving better subjective quality. 4. Tweaks to RC lambda tracking loop in relation to PNS Without this tweak some corner cases cause quality regressions. Basically, lambda needs to react faster to overall bitrate efficiency changes since now PNS can be quite successful in enforcing maximum bitrates, when PSY allocates too many bits to the lower bands, suppressing the signals RC logic uses to lower lambda in those cases and causing aggressive PNS. This tweak makes PNS much less aggressive, though it can still use some further tweaks. Also update MIPS specializations and adjust fuzz Also in lavc/mips/aacpsy_mips.h: remove trailing whitespace
-
- 28 Nov, 2015 1 commit
-
-
Ganesh Ajjanagadde authored
Commit 96786a12 makes runtime initialization cheap. Tested with FATE, with/without --enable-hardcoded-tables. Reviewed-by: Rostislav Pehlivanov <atomnuker@gmail.com> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
-
- 26 Nov, 2015 1 commit
-
-
Claudio Freire authored
When both M/S coding and PNS are enabled, scalefactors and coding books would be mistakenly clobbered when setting the M/S flag on PNS'd bands. The flag needs to be set to signal the generation of correlated noise, but the scalefactors, coefficients and the coding books need to be kept intact.
-
- 17 Oct, 2015 1 commit
-
-
Rostislav Pehlivanov authored
Long Term Prediction allows for prediction of spectral coefficients via the previously decoded time-dependent samples. This feature works well with harmonic content 2 or more frames long, like speech, human or non-human, piano music or any constant tones at very low bitrates. It should be noted that the current coder is highly efficient and the rate control system is unable to encode files at extremely low bitrates (less than 14kbps seems to be impossible) so this extension isn't capable of optimum operation. Dramatic difference is observable with some types of audio and speech but for the most part the audiable differences are subtle. The spectrum looks better however so the encoder is able to harvest the additional bits that this feature provies, should the user choose to enable it. So it's best to enable this feature only if encoding at the absolutely lowest bitrate that the encoder is capable of.
-
- 12 Oct, 2015 1 commit
-
-
Rostislav Pehlivanov authored
To keep it similar to the other functions which are all named *_pred.
-
- 11 Oct, 2015 1 commit
-
-
Claudio Freire authored
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.
-
- 26 Sep, 2015 1 commit
-
-
Claudio Freire authored
Fix out of bounds access caused by wrongful usage of swb_offset constants when computing scalefactor positions.
-
- 25 Sep, 2015 1 commit
-
-
Claudio Freire authored
This patch tweaks search_for_pns to be both more aggressive and more careful when applying PNS. On the one side, it will again try to use PNS on zero (or effectively zero) bands. For this, both zeroes and band_type have to be checked (some ZERO bands aren't marked in zeroes). On the other side, a more accurate rate-distortion measure avoids using PNS where it would cause audible distortion. Also fixed a small bug in the computation of freq that caused PNS usage on low-frequency bands during 8-short windows. This allows re-enabling PNS during 8-short.
-
- 17 Sep, 2015 1 commit
-
-
Claudio Freire authored
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.
-
- 11 Sep, 2015 1 commit
-
-
Rostislav Pehlivanov authored
Makes more sense as users usually set the -cutoff option to low pass filter the signal. The encoder will still over shoot slightly when encoding normal coefficients however that's normal. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 09 Sep, 2015 1 commit
-
-
Rostislav Pehlivanov authored
This commit changes a few things about the noise substitution logic: - Brings back the quantization factor (reduced to 3) during scalefactor index calculations. - Rejects any zeroed bands. They should be inaudiable and it's a waste transmitting the scalefactor indices for these. - Uses swb_offsets instead of incrementing a 'start' with every window group size. - Rejects all PNS during short windows. Overall improves quality. There was a plan to use the lfg system to create the random numbers instead of using whatever the decoder uses but for now this works fine. Entropy is far from important here. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 07 Sep, 2015 1 commit
-
-
Rostislav Pehlivanov authored
This commit once again improves the PNS implementation by scaling the thresholds with frequency. The thresholds get looser as the frequency increases since higher frequencies are basically noise to human ears. Also, this introduces quantization error correction for PNS. Should the error be too much, no PNS will be used. The energy_ratio is used to regulate the actual encoded PNS energy: if the generated PNS energy is higher than the energy from the psy system, energy_ratio is used to correct it so that hopefully once requantized and transmitted the value in the decoder will be closer to what the encoder has. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 06 Sep, 2015 2 commits
-
-
Rostislav Pehlivanov authored
This commit rewrites the PNS implementation and significantly improves sonic quality. The previous implementation marked an incredibly big amount of SFBs to predict when there was no need for this and this resulted in quite a large amount of artifacts. Also the quantization was incorrect (av_clip(4+log2f(...))) which led to 3x the intensity for PNS values leading to even more artifacts. This commit rewrites the PNS search function and introduces a major change: the PNS values are synthesized and are compared to the current coefficients in addition to passing through the revised checks to see whether PNS can be used. This decreases distortions and makes the current PNS implementation mainly focused on replacing any low-power non-zero bands as well as adding any zeroed bands back. The current encoder's performance is enough (especially with IS) so PNS isn't really required except to fill in the occasional few bands as well as extend any zeroed high frequency, so this combination which is already enabled by default works to get as much quality as it can within the bits allowed. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
Rostislav Pehlivanov authored
The specifications explicitly state to use roundf() which also rounds half-integer values away from zero. This does fix a few IS artifacts. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 29 Aug, 2015 2 commits
-
-
Rostislav Pehlivanov authored
This commit abandons the way the specifications state to quantize the coefficients, makes use of the new LPC float functions and is much better. The original way of converting non-normalized float samples to int32_t which out LPC system expects was wrong and it was wrong to assume the coefficients that are generated are also valid. It was essentially a full garbage-in, garbage-out system and it definitely shows when looking at spectrals and listening. The high frequencies were very overattenuated. The new LPC function performs the analysis directly. The specifications state to quantize the coefficients into four bit index values using an asin() function which of course had to have ugly ternary operators because the function turns negative if the coefficients are negative which when encoding causes invalid bitstream to get generated. This deviates from this by using the direct TNS tables, which are fairly small since you only have 4 bits at most for index values. The LPC values are directly quantized against the tables and are then used to perform filtering after the requantization, which simply fetches the array values. The end result is that TNS works much better now and doesn't attenuate anything but the actual signal, e.g. TNS removes quantization errors and does it's job correctly now. It might be enabled by default soon since it doesn't hurt and helps reduce nastyness at low bitrates. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
Rostislav Pehlivanov authored
This commit completely alters the algorithm of prediction. The original commit which introduced prediction was completely incorrect to even remotely care about what the actual coefficients contain or whether any options were enabled. Not my actual fault. This commit treats prediction the way the decoder does and expects to do: like lossy encryption. Everything related to prediction now happens at the very end but just before quantization and encoding of coefficients. On the decoder side, prediction happens before anything has had a chance to even access the coefficients. Also the original implementation had problems because it actually touched the band_type of special bands which already had their scalefactor indices marked and it's a wonder the asserion wasn't triggered when transmitting those. Overall, this now drastically increases audio quality and you should think about enabling it if you don't plan on playing anything encoded on really old low power ultra-embedded devices since they might not support decoding of prediction or AAC-Main. Though the specifications were written ages ago and as times change so do the FLOPS. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 22 Aug, 2015 1 commit
-
-
Timothy Gu authored
Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com> Reviewed-by: Ganesh Ajjanagadde <gajjanag@mit.edu>
-
- 21 Aug, 2015 6 commits
-
-
Rostislav Pehlivanov authored
This commit finalizes AAC-Main profile encoding support by implementing all mandatory and optional tools available in the specifications and current decoders. The AAC-Main profile reqires that prediction support be present (although decoders don't require it to be enabled) for an encoder to be deemed capable of AAC-Main encoding, as well as TNS, PNS and IS, all of which were implemented with previous commits or earlier of this year. Users are encouraged to test the new functionality using either -profile:a aac_main or -aac_pred 1, the former of which will enable the prediction option by default and the latter will change the profile to AAC-Main. No other options shall be changed by enabling either, it's currently up to the users to decide what's best. The current implementation works best using M/S and/or IS, so users are also welcome to enable both options and any other options (TNS, PNS) for maximum quality. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
Rostislav Pehlivanov authored
This commit implements temporal noise shaping support in the encoder, along with an -aac_tns option to toggle it on or off (off by default for now). TNS will increase audio quality and reduce quantization noise by applying a multitap FIR filter across allowed coefficients and transmit side information to the decoder so it could create an inverse filter. Users are encouraged to test the new functionality by enabling -aac_tns 1 during encoding. No major bugs are observable at this time so after a while if no new problems appear and if the current implementation is deemed of high enough quality and stability it will be enabled by default, possibly at the same time the encoder has its experimental flag removed and becomes the standard aac encoder in ffmpeg. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
Rostislav Pehlivanov authored
This commit moves the intensity stereo implementation out from aaccoder and into a separate file. This was possible using the previous commits. This commit also drastically improves the IS implementation by making it phase invariant e.g. it will always choose the best possible phase regardless of whether M/S coding is on or most of the coefficients have identical phases. This also increases the quality and reduces any distortions introduced by enablind intensity stereo. Users are encouraged to test it out using the -aac_is 1 parameter as it has always been. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
Rostislav Pehlivanov authored
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>
-
Rostislav Pehlivanov authored
This commit moves the resetting of special bands (above RESERVED_BT) to the main frame encoding function rather than the way it was done previously in their corresponding search_for_... functions. The reason why special bands need to be reset is that while normal bands get chosen for every frame by the coder (twoloop by default) the coders do not touch any special sfbs and will therefore make them persist throughout the file. If we zero them out any bands left unmarked will be chosen by the second part of the coder (the trellis function in aaccoder.c). Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
Rostislav Pehlivanov authored
This commit only changes the coding style to a saner way of accessing coefficients (makes more sense to get the memory address of a coefficients and start from there rather than adding arbitrary numbers to offset a pointer). Some compilers might detect an out of bounds access easier. Also the way M/S and IS coefficients are calculated has been changed, but should still have the same result (with the exception that IS now applies from the normal coefficients rather than the pristine ones, this is needed for upcoming commits). Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
-
- 11 Aug, 2015 1 commit
-
-
Rostislav Pehlivanov authored
As well as tables littered everywhere, functions were spread out all across the encoder's files. This moves them to a single place where they can be used by either the encoder's main files or additional encoder files. Additionally, it changes the type of some to 'inline' to enable us to simply put them in a header file and possibly gain some speed due to compiler optimizations. Signed-off-by: Claudio Freire <klaussfreire@gmail.com>
-
- 07 Aug, 2015 1 commit
-
-
Rostislav Pehlivanov authored
This commit moves any tables specific to the encoder from aacenc and aaccoder to a separate file called 'aacenctab.c/.h'. This was done as a clean up attempt as the encoder was filled with tables pasted in between functions which made it confusing to follow and track where each table and definition had been used. This commit solves this by simply exporting the smaller tables out to the aacenctab.h while the larger ones are compiled using aacenctab.c and are referenced from the header file. Signed-off-by: Claudio Freire <klaussfreire@gmail.com>
-
- 01 Aug, 2015 1 commit
-
-
Rostislav Pehlivanov authored
This commit removes a redundant argument from the functions in aaccoder. The argument lambda was redundant as it was just a copy of s->lambda, to which all functions have access to anyway. This cleans up the function pointers a bit which is helpful as there are a lot of other search_for_* functions under development and with them populated it gets messy. Reviewed-by: Claudio Freire <klaussfreire@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-
- 27 Jul, 2015 1 commit
-
-
Claudio Freire authored
Avoid clipping due to quantization noise to produce audible artifacts, by detecting near-clipping signals and both attenuating them a little and encoding escape-encoded bands (usually the loudest) rounding towards zero instead of nearest, which tends to decrease overall energy and thus clipping. Currently fate tests measure numerical error so this change makes tests using asynth (which are near clipping) report higher error not less, because of window attenuation. Yet, they sound better, not worse (albeit subtle, other samples aren't subtle at all). Only measuring psychoacoustically weighted error would make for a representative test, so that will be left for a future patch. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-