From 71af38954b18c2956932f0221b1874e228c983fe Mon Sep 17 00:00:00 2001 From: Ganesh Ajjanagadde Date: Sat, 26 Dec 2015 16:53:12 -0800 Subject: [PATCH] avcodec/on2avc: fix regression on icc since 5495c7f Should fix the regression, and also speeds up table generation. Tables tested on GNU/Linux+clang: they are identical to the ones prior to 5495c7f. ff_exp10 caused one slight change in one entry, 50000 became 50001 due to somewhat incorrect rounding. Untested on ICC; passes FATE on GNU/Linux+gcc. Signed-off-by: Ganesh Ajjanagadde --- libavcodec/on2avc.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/libavcodec/on2avc.c b/libavcodec/on2avc.c index 879b71a48e9..3309d990857 100644 --- a/libavcodec/on2avc.c +++ b/libavcodec/on2avc.c @@ -912,7 +912,23 @@ 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; + 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; if (avctx->channels > 2U) { avpriv_request_sample(avctx, "Decoding more than 2 channels"); @@ -934,10 +950,23 @@ 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"); - for (i = 0; i < 20; i++) + + /* 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; for (; i < 128; i++) - c->scale_tab[i] = ceil(ff_exp10(i * 0.1) * 0.5); + 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); + } if (avctx->sample_rate < 32000 || avctx->channels == 1) memcpy(c->long_win, ff_on2avc_window_long_24000, -- 2.39.2