Make the faac inspired quantizer search make sense for a slightly narrower definition...
authorAlex Converse <alex.converse@gmail.com>
Thu, 6 May 2010 20:18:36 +0000 (20:18 +0000)
committerAlex Converse <alex.converse@gmail.com>
Thu, 6 May 2010 20:18:36 +0000 (20:18 +0000)
Originally committed as revision 23035 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/aaccoder.c

index e19fa38..d30f854 100644 (file)
@@ -763,7 +763,7 @@ static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s,
             const float *scaled = s->scoefs   + start;
             const int size      = sce->ics.swb_sizes[g];
             int scf, prev_scf, step;
             const float *scaled = s->scoefs   + start;
             const int size      = sce->ics.swb_sizes[g];
             int scf, prev_scf, step;
-            int min_scf = 0, max_scf = 255;
+            int min_scf = -1, max_scf = 256;
             float curdiff;
             if (maxq[w*16+g] < 21.544) {
                 sce->zeroes[w*16+g] = 1;
             float curdiff;
             if (maxq[w*16+g] < 21.544) {
                 sce->zeroes[w*16+g] = 1;
@@ -797,21 +797,23 @@ static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s,
                 }
                 prev_scf = scf;
                 curdiff = fabsf(dist - uplim[w*16+g]);
                 }
                 prev_scf = scf;
                 curdiff = fabsf(dist - uplim[w*16+g]);
-                if (curdiff == 0.0f)
+                if (curdiff <= 1.0f)
                     step = 0;
                 else
                     step = 0;
                 else
-                    step = fabsf(log2(curdiff));
+                    step = log2(curdiff);
                 if (dist > uplim[w*16+g])
                     step = -step;
                 if (dist > uplim[w*16+g])
                     step = -step;
+                scf += step;
+                av_clip_uint8(scf);
+                step = scf - prev_scf;
                 if (FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)) {
                 if (FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)) {
-                    sce->sf_idx[w*16+g] = scf;
+                    sce->sf_idx[w*16+g] = av_clip(scf, min_scf, max_scf);
                     break;
                 }
                     break;
                 }
-                scf += step;
                 if (step > 0)
                 if (step > 0)
-                    min_scf = scf;
+                    min_scf = prev_scf;
                 else
                 else
-                    max_scf = scf;
+                    max_scf = prev_scf;
             }
             start += size;
         }
             }
             start += size;
         }