[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