summaryrefslogtreecommitdiff
path: root/libavcodec/ffv1enc.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2022-05-27 19:31:33 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2022-05-30 12:13:29 +0200
commit366ef56f7f126398c813407c45f91216978224ba (patch)
treeff14ec2a45346459a7bb079dc82c1bc9256a6739 /libavcodec/ffv1enc.c
parent9e4d1549e84eac99f038342a9c14a31c64188ef0 (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.c25
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));
}