diff options
author | Claudio Freire <klaussfreire@gmail.com> | 2016-01-14 00:38:22 -0300 |
---|---|---|
committer | Claudio Freire <klaussfreire@gmail.com> | 2016-01-14 00:38:22 -0300 |
commit | 62dfe1d40d87f8f67cd77d4b769b7c6163083c5e (patch) | |
tree | 1b127ce3b9f6e58d2ef943d4070d8642b7029b9f /libavcodec/aacenc_is.c | |
parent | a0a47a09b0e204216072c1f77643de3f6f869732 (diff) | |
download | ffmpeg-62dfe1d40d87f8f67cd77d4b769b7c6163083c5e.tar.gz |
avcodec/aacenc_is: replace pow(x, 0.75) by x/sqrtf(sqrtf(x))
This is quite an accurate approximation; testing shows ~ 2ulp error in
the floating point result. Tested with FATE.
Alternatively, if one wants "full accuracy", one can use powf, or sqrt
instead of sqrtf. With powf, one gets 1 ulp error (theoretically should be 0, as
0.75 is exactly representable) on GNU libm, with sqrt, 0 ulp error.
Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
Abstracted into pos_pow34 utility function
Signed-off-by: Claudio Freire <klaussfreire@gmail.com>
Diffstat (limited to 'libavcodec/aacenc_is.c')
-rw-r--r-- | libavcodec/aacenc_is.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/libavcodec/aacenc_is.c b/libavcodec/aacenc_is.c index 405f178556..46a9773904 100644 --- a/libavcodec/aacenc_is.c +++ b/libavcodec/aacenc_is.c @@ -54,7 +54,7 @@ struct AACISError ff_aac_is_encoding_err(AACEncContext *s, ChannelElement *cpe, FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g]; FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g]; int is_band_type, is_sf_idx = FFMAX(1, sce0->sf_idx[w*16+g]-4); - float e01_34 = phase*pow(ener1/ener0, 3.0/4.0); + float e01_34 = phase*pos_pow34(ener1/ener0); float maxval, dist_spec_err = 0.0f; float minthr = FFMIN(band0->threshold, band1->threshold); for (i = 0; i < sce0->ics.swb_sizes[g]; i++) |