diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2022-05-27 19:31:33 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2022-05-30 12:13:29 +0200 |
commit | 366ef56f7f126398c813407c45f91216978224ba (patch) | |
tree | ff14ec2a45346459a7bb079dc82c1bc9256a6739 /libavcodec/ffv1enc.c | |
parent | 9e4d1549e84eac99f038342a9c14a31c64188ef0 (diff) |
avcodec/ffv1enc: Eliminate float/double from find_best_state()
log2() remains, this can either be replaced by a integer implementation or the table
hardcoded if needed
Tested-by: Anton Khirnov <anton@khirnov.net>
Tested-by: Martin Storsjö <martin@martin.st>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/ffv1enc.c')
-rw-r--r-- | libavcodec/ffv1enc.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c index cee2627eed..311f377b1e 100644 --- a/libavcodec/ffv1enc.c +++ b/libavcodec/ffv1enc.c @@ -140,32 +140,31 @@ static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256]) { int i, j, k, m; - double l2tab[256]; + uint32_t l2tab[256]; for (i = 1; i < 256; i++) - l2tab[i] = log2(i / 256.0); + l2tab[i] = log2(i / 256.0) * ((-1<<31) / 8); for (i = 0; i < 256; i++) { - double best_len[256]; - double p = i / 256.0; + uint64_t best_len[256]; for (j = 0; j < 256; j++) - best_len[j] = 1 << 30; + best_len[j] = UINT64_MAX; for (j = FFMAX(i - 10, 1); j < FFMIN(i + 11, 256); j++) { - double occ[256] = { 0 }; - double len = 0; - occ[j] = 1.0; + uint32_t occ[256] = { 0 }; + uint64_t len = 0; + occ[j] = UINT32_MAX; if (!one_state[j]) continue; for (k = 0; k < 256; k++) { - double newocc[256] = { 0 }; + uint32_t newocc[256] = { 0 }; for (m = 1; m < 256; m++) if (occ[m]) { - len -=occ[m]*( p *l2tab[ m] - + (1-p)*l2tab[256-m]); + len += (occ[m]*(( i *(uint64_t)l2tab[ m] + + (256-i)*(uint64_t)l2tab[256-m])>>8)) >> 8; } if (len < best_len[k]) { best_len[k] = len; @@ -173,8 +172,8 @@ static void find_best_state(uint8_t best_state[256][256], } for (m = 1; m < 256; m++) if (occ[m]) { - newocc[ one_state[ m]] += occ[m] * p; - newocc[256 - one_state[256 - m]] += occ[m] * (1 - p); + newocc[ one_state[ m]] += occ[m] * (uint64_t) i >> 8; + newocc[256 - one_state[256 - m]] += occ[m] * (uint64_t)(256 - i) >> 8; } memcpy(occ, newocc, sizeof(occ)); } |