aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGanesh Ajjanagadde <gajjanagadde@gmail.com>2015-11-25 16:26:08 -0500
committerGanesh Ajjanagadde <gajjanagadde@gmail.com>2015-12-01 19:05:19 -0500
commit16d4c28cbb9add358d4e6f30c412860638dc4f90 (patch)
treec0cbf8772bd09b5e9903ba250f3ed9c528e3bb87
parent538e8ab512ab1bee5c313f6a2e040e3f7cc7fe87 (diff)
downloadffmpeg-16d4c28cbb9add358d4e6f30c412860638dc4f90.tar.gz
avcodec/mpegaudio_tablegen: speed up dynamic table creation
This does some miscellaneous stuff mainly avoiding the usage of pow to achieve significant speedups. This is not speed critical, but is unnecessary latency and cycles wasted for a user. All tables tested and are identical to the old ones (bit-exact even in floating point case). Sample benchmark (x86-64, Haswell, GNU/Linux): old: 102329530 decicycles in mpegaudio_tableinit, 1 runs, 0 skips new: 34111900 decicycles in mpegaudio_tableinit, 1 runs, 0 skips Reviewed-by: Ronald S. Bultje <rsbultje@gmail.com> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
-rw-r--r--libavcodec/mpegaudio_tablegen.c1
-rw-r--r--libavcodec/mpegaudio_tablegen.h19
2 files changed, 14 insertions, 6 deletions
diff --git a/libavcodec/mpegaudio_tablegen.c b/libavcodec/mpegaudio_tablegen.c
index 90c9de430a..9a9bb4d056 100644
--- a/libavcodec/mpegaudio_tablegen.c
+++ b/libavcodec/mpegaudio_tablegen.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#define CONFIG_HARDCODED_TABLES 0
#include "mpegaudio_tablegen.h"
+#include "libavutil/tablegen.h"
#include "tableprint.h"
int main(void)
diff --git a/libavcodec/mpegaudio_tablegen.h b/libavcodec/mpegaudio_tablegen.h
index 86b2cd32b0..dd67a0977e 100644
--- a/libavcodec/mpegaudio_tablegen.h
+++ b/libavcodec/mpegaudio_tablegen.h
@@ -45,12 +45,21 @@ static float expval_table_float[512][16];
static av_cold void mpegaudio_tableinit(void)
{
int i, value, exponent;
+ double exp2_lut[4] = {
+ 1.00000000000000000000, /* 2 ^ (0 * 0.25) */
+ 1.18920711500272106672, /* 2 ^ (1 * 0.25) */
+ M_SQRT2 , /* 2 ^ (2 * 0.25) */
+ 1.68179283050742908606, /* 2 ^ (3 * 0.25) */
+ };
+ double cbrt_lut[16];
+ for (i = 0; i < 16; ++i)
+ cbrt_lut[i] = cbrt(i);
+
for (i = 1; i < TABLE_4_3_SIZE; i++) {
double value = i / 4;
double f, fm;
int e, m;
- /* cbrtf() isn't available on all systems, so we use powf(). */
- f = value / IMDCT_SCALAR * pow(value, 1.0 / 3.0) * pow(2, (i & 3) * 0.25);
+ f = value / IMDCT_SCALAR * cbrt(value) * exp2_lut[i & 3];
fm = frexp(f, &e);
m = (uint32_t)(fm * (1LL << 31) + 0.5);
e += FRAC_BITS - 31 + 5 - 100;
@@ -61,10 +70,8 @@ static av_cold void mpegaudio_tableinit(void)
}
for (exponent = 0; exponent < 512; exponent++) {
for (value = 0; value < 16; value++) {
- /* cbrtf() isn't available on all systems, so we use powf(). */
- double f = (double)value * pow(value, 1.0 / 3.0) * pow(2, (exponent - 400) * 0.25 + FRAC_BITS + 5) / IMDCT_SCALAR;
- /* llrint() isn't always available, so round and cast manually. */
- expval_table_fixed[exponent][value] = (long long int) (f < 0xFFFFFFFF ? floor(f + 0.5) : 0xFFFFFFFF);
+ double f = value * cbrt_lut[value] * pow(2, (exponent - 400) * 0.25 + FRAC_BITS + 5) / IMDCT_SCALAR;
+ expval_table_fixed[exponent][value] = (f < 0xFFFFFFFF ? llrint(f) : 0xFFFFFFFF);
expval_table_float[exponent][value] = f;
}
exp_table_fixed[exponent] = expval_table_fixed[exponent][1];