[FFmpeg-devel] [PATCH 3/3] avcodec/lagarithrac: lag_get_rac: use normal division
Michael Niedermayer
michaelni at gmx.at
Tue May 27 02:05:34 CEST 2014
maybe 0.3% faster and simpler code
---
libavcodec/lagarithrac.c | 3 ---
libavcodec/lagarithrac.h | 12 ++----------
2 files changed, 2 insertions(+), 13 deletions(-)
diff --git a/libavcodec/lagarithrac.c b/libavcodec/lagarithrac.c
index c240646..37ac2cf 100644
--- a/libavcodec/lagarithrac.c
+++ b/libavcodec/lagarithrac.c
@@ -53,7 +53,4 @@ void ff_lag_rac_init(lag_rac *l, GetBitContext *gb, int length)
j++;
l->range_hash[i] = j;
}
-
- /* Add conversion factor to hash_shift so we don't have to in lag_get_rac. */
- l->hash_shift += 23;
}
diff --git a/libavcodec/lagarithrac.h b/libavcodec/lagarithrac.h
index 7d60d56..00f03dd 100644
--- a/libavcodec/lagarithrac.h
+++ b/libavcodec/lagarithrac.h
@@ -85,16 +85,8 @@ static inline uint8_t lag_get_rac(lag_rac *l)
if (l->low < range_scaled * l->prob[1]) {
val = 0;
} else {
- /* FIXME __builtin_clz is ~20% faster here, but not allowed in generic code. */
- shift = 30 - av_log2(range_scaled);
- div = ((range_scaled << shift) + (1 << 23) - 1) >> 23;
- /* low>>24 ensures that any cases too big for exact FASTDIV are
- * under- rather than over-estimated
- */
- low_scaled = FASTDIV(l->low - (l->low >> 24), div);
- shift -= l->hash_shift;
- low_scaled = (low_scaled >> (32 - shift));
- /* low_scaled is now a lower bound of low/range_scaled */
+ low_scaled = l->low / (range_scaled<<(l->hash_shift));
+
val = l->range_hash[low_scaled];
while (l->low >= range_scaled * l->prob[val + 1])
val++;
--
1.7.9.5
More information about the ffmpeg-devel
mailing list