1. 18 Oct, 2016 1 commit
  2. 12 Oct, 2016 1 commit
  3. 13 Aug, 2016 2 commits
  4. 20 Jan, 2016 1 commit
  5. 17 Jan, 2016 1 commit
    • Claudio Freire's avatar
      AAC encoder: enforce SF delta in PNS and IS SFs · 60a76f8b
      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.
      60a76f8b
  6. 13 Jan, 2016 2 commits
    • Claudio Freire's avatar
      AAC encoder: various fixes in M/S coding · 6711aa21
      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.
      6711aa21
    • Claudio Freire's avatar
      AAC encoder: avoid assertion failure on PNS · 00d481b2
      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.
      00d481b2
  7. 22 Dec, 2015 1 commit
  8. 14 Dec, 2015 1 commit
  9. 09 Dec, 2015 1 commit
  10. 05 Dec, 2015 2 commits
  11. 02 Dec, 2015 1 commit
    • Claudio Freire's avatar
      AAC encoder: improve SF range utilization · ca203e99
      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
      ca203e99
  12. 28 Nov, 2015 1 commit
  13. 26 Nov, 2015 1 commit
    • Claudio Freire's avatar
      AAC encoder: Fix application of M/S with PNS · fc36d852
      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.
      fc36d852
  14. 17 Oct, 2015 1 commit
    • Rostislav Pehlivanov's avatar
      aacenc: add support for encoding files using Long Term Prediction · 27d23ae0
      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.
      27d23ae0
  15. 12 Oct, 2015 1 commit
  16. 11 Oct, 2015 1 commit
    • Claudio Freire's avatar
      AAC encoder: Extensive improvements · 01ecb717
      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.
      01ecb717
  17. 26 Sep, 2015 1 commit
  18. 25 Sep, 2015 1 commit
    • Claudio Freire's avatar
      AAC encoder: tweak PNS usage to be more aggressive · 9458a62d
      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.
      9458a62d
  19. 17 Sep, 2015 1 commit
    • Claudio Freire's avatar
      AAC encoder: refactor to resynchronize MIPS port · 8df9bf8e
      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.
      8df9bf8e
  20. 11 Sep, 2015 1 commit
  21. 09 Sep, 2015 1 commit
    • Rostislav Pehlivanov's avatar
      aaccoder: tweak PNS implementation further · da64bd6a
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      da64bd6a
  22. 07 Sep, 2015 1 commit
    • Rostislav Pehlivanov's avatar
      aaccoder: add frequency scaling and quantization correction for PNS · b6cc8ec7
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      b6cc8ec7
  23. 06 Sep, 2015 2 commits
    • Rostislav Pehlivanov's avatar
      aaccoder: rewrite PNS implementation · 033e5894
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      033e5894
    • Rostislav Pehlivanov's avatar
      aaccoder: use roundf() instead of ceilf() · b9b1fd11
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      b9b1fd11
  24. 29 Aug, 2015 2 commits
    • Rostislav Pehlivanov's avatar
      aacenc_tns: rework the way coefficients are calculated · f20b6717
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      f20b6717
    • Rostislav Pehlivanov's avatar
      aacenc_pred: rework the way prediction is done · 44ddee94
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      44ddee94
  25. 22 Aug, 2015 1 commit
  26. 21 Aug, 2015 6 commits
    • Rostislav Pehlivanov's avatar
      aacenc: implement the complete AAC-Main profile · 76b81b10
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      76b81b10
    • Rostislav Pehlivanov's avatar
      aacenc_tns: implement temporal noise shaping · a1c487e9
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      a1c487e9
    • Rostislav Pehlivanov's avatar
      aaccoder: move the Intensity Stereo implementation out · d1ca7142
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      d1ca7142
    • Rostislav Pehlivanov's avatar
      aaccoder: move the quantization functions to a separate file · 43b378a0
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      43b378a0
    • Rostislav Pehlivanov's avatar
      aacenc: reset special bands in the main frame encoding function · e6c9f3a1
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      e6c9f3a1
    • Rostislav Pehlivanov's avatar
      aacenc: coding style changes · 32be264c
      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: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
      32be264c
  27. 11 Aug, 2015 1 commit
    • Rostislav Pehlivanov's avatar
      aacenc: Move small misc. functions to a separate file · ef8e5a61
      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: 's avatarClaudio Freire <klaussfreire@gmail.com>
      ef8e5a61
  28. 07 Aug, 2015 1 commit
    • Rostislav Pehlivanov's avatar
      aacenc: Move local encoder specific tables to a separate file · c47c781e
      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: 's avatarClaudio Freire <klaussfreire@gmail.com>
      c47c781e
  29. 01 Aug, 2015 1 commit
  30. 27 Jul, 2015 1 commit
    • Claudio Freire's avatar
      AAC Encoder: clipping avoidance · 59216e05
      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: 's avatarMichael Niedermayer <michael@niedermayer.cc>
      59216e05