[FFmpeg-cvslog] aaccoder: respect cutoff when marking bands as PNS

Rostislav Pehlivanov git at videolan.org
Fri Sep 11 20:02:06 CEST 2015


ffmpeg | branch: master | Rostislav Pehlivanov <atomnuker at gmail.com> | Fri Sep 11 18:59:15 2015 +0100| [8180b113e1147bc55a11e2828fba7a6d521e2e86] | committer: Rostislav Pehlivanov

aaccoder: respect cutoff when marking bands as PNS

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 at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8180b113e1147bc55a11e2828fba7a6d521e2e86
---

 libavcodec/aaccoder.c |    7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c
index dd2e62f..524987d 100644
--- a/libavcodec/aaccoder.c
+++ b/libavcodec/aaccoder.c
@@ -51,9 +51,6 @@
 /** Frequency in Hz for lower limit of noise substitution **/
 #define NOISE_LOW_LIMIT 4000
 
-/** Pointless to substitute very high short lived inaudiable frequencies **/
-#define NOISE_HIGH_LIMIT 18120
-
 /* Parameter of f(x) = a*(lambda/100), defines the maximum fourier spread
  * beyond which no PNS is used (since the SFBs contain tone rather than noise) */
 #define NOISE_SPREAD_THRESHOLD 0.5073f
@@ -886,7 +883,7 @@ static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChanne
             const int start = sce->ics.swb_offset[w*16+g];
             const float freq = start*freq_mult;
             const float freq_boost = FFMAX(0.88f*freq/NOISE_LOW_LIMIT, 1.0f);
-            if (freq < NOISE_LOW_LIMIT)
+            if (freq < NOISE_LOW_LIMIT || avctx->cutoff && freq >= avctx->cutoff)
                 continue;
             for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
                 band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
@@ -899,7 +896,7 @@ static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChanne
             dist_thresh = FFMIN(2.5f*NOISE_LOW_LIMIT/freq, 1.27f);
 
             if (sce->zeroes[w*16+g] || spread < spread_threshold ||
-                sfb_energy > threshold*thr_mult*freq_boost || !sfb_energy) {
+                sfb_energy > threshold*thr_mult*freq_boost) {
                 sce->pns_ener[w*16+g] = sfb_energy;
                 continue;
             }



More information about the ffmpeg-cvslog mailing list