[FFmpeg-cvslog] AAC encoder: TNS fixes on short windows

Claudio Freire git at videolan.org
Sun Jan 17 17:14:24 CET 2016


ffmpeg | branch: master | Claudio Freire <klaussfreire at gmail.com> | Sat Jan 16 23:02:41 2016 -0300| [3d0849cc90a7098e9992317248a53ef5f29ceffc] | committer: Claudio Freire

AAC encoder: TNS fixes on short windows

TNS was computing filter coefficients incorrectly for short windows
due to a few coefficient addressing bugs. Fixing them fixes lots of
instability with transients (short windows).

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

 libavcodec/aacenc_tns.c |   18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/libavcodec/aacenc_tns.c b/libavcodec/aacenc_tns.c
index 9ac9ed9..414a5e9 100644
--- a/libavcodec/aacenc_tns.c
+++ b/libavcodec/aacenc_tns.c
@@ -178,23 +178,19 @@ void ff_aac_search_for_tns(AACEncContext *s, SingleChannelElement *sce)
         int coef_len = sce->ics.swb_offset[sfb_end] - sce->ics.swb_offset[sfb_start];
         const int sfb_len = sfb_end - sfb_start;
 
-        for (g = 0;  g < sce->ics.num_swb; g++) {
-            if (w*16+g < sfb_start || w*16+g > sfb_end)
-                continue;
-            for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
-                FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
-                if ((w+w2)*16+g > sfb_start + (sfb_len/2))
-                    en[1] += band->energy;
-                else
-                    en[0] += band->energy;
-            }
+        for (g = sfb_start; g < sce->ics.num_swb && g <= sfb_end; g++) {
+            FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[w*16+g];
+            if (g > sfb_start + (sfb_len/2))
+                en[1] += band->energy;
+            else
+                en[0] += band->energy;
         }
 
         if (coef_len <= 0 || sfb_len <= 0)
             continue;
 
         /* LPC */
-        gain = ff_lpc_calc_ref_coefs_f(&s->lpc, &sce->coeffs[coef_start],
+        gain = ff_lpc_calc_ref_coefs_f(&s->lpc, &sce->coeffs[w*128 + coef_start],
                                        coef_len, order, coefs);
 
         if (!order || gain < TNS_GAIN_THRESHOLD_LOW || gain > TNS_GAIN_THRESHOLD_HIGH)



More information about the ffmpeg-cvslog mailing list