[FFmpeg-devel] [PATCH] ffmpeg: replace log2 by faster variant

Ganesh Ajjanagadde gajjanagadde at gmail.com
Wed Dec 30 04:39:02 CET 2015


The log is anyway rounded to an integer, so one may use an frexp
based approach. Note that this may be made frexpf; if arguments are less than
2^24 there is no loss. Kept as double precision for simplicity; 2^32 is
exactly representable as a double.

Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
---
 ffmpeg.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index 6d01987..ee72f91 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -1486,6 +1486,17 @@ static void print_final_stats(int64_t total_size)
     }
 }
 
+static inline int log2i(double d)
+{
+    int exp;
+    double mant;
+
+    mant = frexp(d, &exp);
+    if (mant >= M_SQRT1_2)
+        return exp;
+    return exp-1;
+}
+
 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
 {
     char buf[1024];
@@ -1559,7 +1570,7 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
                 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
                     qp_histogram[qp]++;
                 for (j = 0; j < 32; j++)
-                    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log2(qp_histogram[j] + 1)));
+                    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", log2i(qp_histogram[j] + 1));
             }
 
             if ((enc->flags & AV_CODEC_FLAG_PSNR) && (ost->pict_type != AV_PICTURE_TYPE_NONE || is_last_report)) {
-- 
2.6.4



More information about the ffmpeg-devel mailing list