summaryrefslogtreecommitdiff
path: root/libavcodec/aaccoder.c
diff options
context:
space:
mode:
authorAlex Converse <alex.converse@gmail.com>2010-05-06 20:18:36 +0000
committerAlex Converse <alex.converse@gmail.com>2010-05-06 20:18:36 +0000
commit32fa7725d288dcbdb6997130f1ca6edbcad25e1a (patch)
tree96f9d81a373c7c3a5db8e60d28a2f1303752ec13 /libavcodec/aaccoder.c
parent9e94bd3e8048db97abbf6a5ed3882cc63d517e6f (diff)
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/aaccoder.c')
-rw-r--r--libavcodec/aaccoder.c16
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;
}