diff options
author | Alex Converse <alex.converse@gmail.com> | 2010-05-06 20:18:36 +0000 |
---|---|---|
committer | Alex Converse <alex.converse@gmail.com> | 2010-05-06 20:18:36 +0000 |
commit | 32fa7725d288dcbdb6997130f1ca6edbcad25e1a (patch) | |
tree | 96f9d81a373c7c3a5db8e60d28a2f1303752ec13 /libavcodec | |
parent | 9e94bd3e8048db97abbf6a5ed3882cc63d517e6f (diff) | |
download | ffmpeg-32fa7725d288dcbdb6997130f1ca6edbcad25e1a.tar.gz |
Make the faac inspired quantizer search make sense for a slightly narrower definition of "make sense."
Originally committed as revision 23035 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/aaccoder.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c index e19fa3803f..d30f854b98 100644 --- a/libavcodec/aaccoder.c +++ b/libavcodec/aaccoder.c @@ -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; - 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; @@ -797,21 +797,23 @@ static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s, } prev_scf = scf; curdiff = fabsf(dist - uplim[w*16+g]); - if (curdiff == 0.0f) + if (curdiff <= 1.0f) step = 0; else - step = fabsf(log2(curdiff)); + step = log2(curdiff); 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)) { - sce->sf_idx[w*16+g] = scf; + sce->sf_idx[w*16+g] = av_clip(scf, min_scf, max_scf); break; } - scf += step; if (step > 0) - min_scf = scf; + min_scf = prev_scf; else - max_scf = scf; + max_scf = prev_scf; } start += size; } |