diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2015-12-27 10:55:48 +0100 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-12-27 16:44:48 +0100 |
commit | 3215342121c18eb9fd40a163a041a65f14bd92b0 (patch) | |
tree | d9afb8845fb66d45f20b3b3589606f23b0d96a8b | |
parent | baf4c489e5f468a208596cd128a6f1c49e6ae35b (diff) | |
download | ffmpeg-3215342121c18eb9fd40a163a041a65f14bd92b0.tar.gz |
avcodec/on2avc: Fix stability issues with scale_tab generation
This also simplifies the code
the resulting values are binary identical to what pow(10, i/10.0) produces
-rw-r--r-- | libavcodec/on2avc.c | 40 |
1 files changed, 7 insertions, 33 deletions
diff --git a/libavcodec/on2avc.c b/libavcodec/on2avc.c index 3309d99085..62c71ccea5 100644 --- a/libavcodec/on2avc.c +++ b/libavcodec/on2avc.c @@ -912,23 +912,7 @@ static av_cold void on2avc_free_vlcs(On2AVCContext *c) static av_cold int on2avc_decode_init(AVCodecContext *avctx) { On2AVCContext *c = avctx->priv_data; - int i, ph; - /* 10^(i*0.1) for 0 <= i < 10 */ - /* TODO: possibly statically allocate scale_tab; this may help with FATE - * and reproducibility if the binary size is not impacted much */ - static const double exp10_lut[] = { - 1, - 1.2589254117941673, - 1.5848931924611136, - 1.9952623149688795, - 2.5118864315095806, - 3.1622776601683795, - 3.9810717055349727, - 5.0118723362727229, - 6.3095734448019334, - 7.9432823472428158, - }; - int64_t exp10_base = 10; + int i; if (avctx->channels > 2U) { avpriv_request_sample(avctx, "Decoding more than 2 channels"); @@ -950,23 +934,13 @@ static av_cold int on2avc_decode_init(AVCodecContext *avctx) av_log(avctx, AV_LOG_WARNING, "Stereo mode support is not good, patch is welcome\n"); - - /* Fast and more accurate way of doing for (i = 0; i < 20; i++) - c->scale_tab[i] = ceil(ff_exp10(i * 0.1) * 16) / 32; + // We add -0.01 before ceil() to avoid any values to fall at exactly the + // midpoint between different ceil values. The results are identical to + // using pow(10, i / 10.0) without such bias + for (i = 0; i < 20; i++) + c->scale_tab[i] = ceil(ff_exp10(i * 0.1) * 16 - 0.01) / 32; for (; i < 128; i++) - c->scale_tab[i] = ceil(ff_exp10(i * 0.1) * 0.5); */ - for (i = 0; i < 10; i++) { - c->scale_tab[i] = ceil(exp10_lut[i] * 16) / 32; - c->scale_tab[i+10] = ceil(exp10_lut[i] * 160) / 32; - } - - for (i = 20, ph = 0; i < 128; i++, ph++) { - if (i % 10 == 0) { - exp10_base *= 10; - ph = 0; - } - c->scale_tab[i] = ceil(exp10_base * exp10_lut[ph] * 0.5); - } + c->scale_tab[i] = ceil(ff_exp10(i * 0.1) * 0.5 - 0.01); if (avctx->sample_rate < 32000 || avctx->channels == 1) memcpy(c->long_win, ff_on2avc_window_long_24000, |