[FFmpeg-cvslog] avutil/rational: use frexp rather than ad-hoc log to get floating point exponent

Ganesh Ajjanagadde git at videolan.org
Sat Oct 31 04:20:08 CET 2015


ffmpeg | branch: master | Ganesh Ajjanagadde <gajjanagadde at gmail.com> | Thu Oct 29 00:18:15 2015 -0400| [8d9f86bd3791d4448460faee03f07751d0202c32] | committer: Ganesh Ajjanagadde

avutil/rational: use frexp rather than ad-hoc log to get floating point exponent

This simplifies and cleans up the code.
Furthermore, it is much faster due to absence of the slow log computation.

Reviewed-by: Michael Niedermayer <michael at niedermayer.cc>
Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8d9f86bd3791d4448460faee03f07751d0202c32
---

 libavutil/rational.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavutil/rational.c b/libavutil/rational.c
index 21d2bb7..81a9402 100644
--- a/libavutil/rational.c
+++ b/libavutil/rational.c
@@ -106,14 +106,14 @@ AVRational av_sub_q(AVRational b, AVRational c)
 AVRational av_d2q(double d, int max)
 {
     AVRational a;
-#define LOG2  0.69314718055994530941723212145817656807550013436025
     int exponent;
     int64_t den;
     if (isnan(d))
         return (AVRational) { 0,0 };
     if (fabs(d) > INT_MAX + 3LL)
         return (AVRational) { d < 0 ? -1 : 1, 0 };
-    exponent = FFMAX( (int)(log(fabs(d) + 1e-20)/LOG2), 0);
+    frexp(d, &exponent);
+    exponent = FFMAX(exponent-1, 0);
     den = 1LL << (61 - exponent);
     // (int64_t)rint() and llrint() do not work with gcc on ia64 and sparc64
     av_reduce(&a.num, &a.den, floor(d * den + 0.5), den, max);



More information about the ffmpeg-cvslog mailing list