aaccoder: use roundf() instead of ceilf()

The specifications explicitly state to use roundf() which
also rounds half-integer values away from zero.
This does fix a few IS artifacts.

Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
pull/148/head
Rostislav Pehlivanov 9 years ago
parent 92aa3e7fb2
commit b9b1fd1183
  1. 4
      libavcodec/aaccoder.c

@ -332,11 +332,11 @@ static void set_special_band_scalefactors(AACEncContext *s, SingleChannelElement
start = 0; start = 0;
for (g = 0; g < sce->ics.num_swb; g++) { for (g = 0; g < sce->ics.num_swb; g++) {
if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) { if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) {
sce->sf_idx[w*16+g] = av_clip(ceilf(log2f(sce->is_ener[w*16+g])*2), -155, 100); sce->sf_idx[w*16+g] = av_clip(roundf(log2f(sce->is_ener[w*16+g])*2), -155, 100);
minscaler_i = FFMIN(minscaler_i, sce->sf_idx[w*16+g]); minscaler_i = FFMIN(minscaler_i, sce->sf_idx[w*16+g]);
bands++; bands++;
} else if (sce->band_type[w*16+g] == NOISE_BT) { } else if (sce->band_type[w*16+g] == NOISE_BT) {
sce->sf_idx[w*16+g] = av_clip(4+log2f(sce->pns_ener[w*16+g])*2, -100, 155); sce->sf_idx[w*16+g] = av_clip(roundf(log2f(sce->pns_ener[w*16+g])*2), -100, 155);
minscaler_n = FFMIN(minscaler_n, sce->sf_idx[w*16+g]); minscaler_n = FFMIN(minscaler_n, sce->sf_idx[w*16+g]);
bands++; bands++;
} }

Loading…
Cancel
Save