[MPlayer-cvslog] r33824 - trunk/libaf/af_format.c
    iive 
    subversion at mplayerhq.hu
       
    Thu Jul  7 01:35:39 CEST 2011
    
    
  
Author: iive
Date: Thu Jul  7 01:35:39 2011
New Revision: 33824
Log:
Fix the precision loss in float -> 32bit conversion case, introduced 
by my earlier commit. Instead use method proposed by Reimar.
Also, avoid using ldexp, it is slower than multiply with constant.
Modified:
   trunk/libaf/af_format.c
Modified: trunk/libaf/af_format.c
==============================================================================
--- trunk/libaf/af_format.c	Tue Jul  5 18:50:52 2011	(r33823)
+++ trunk/libaf/af_format.c	Thu Jul  7 01:35:39 2011	(r33824)
@@ -489,15 +489,21 @@ static void float2int(float* in, void* o
     break;
   case(3):
     for(i=0;i<len;i++){
-      f = ldexp(in[i], 23);
+      f = in[i] * 8388608;
       store24bit(out, i,   av_clip(lrintf(f), -1*(1<<23), (1<<23)-1) << 8);
     }
     break;
   case(4):
     for(i=0;i<len;i++){
-      f = ldexp(in[i], 23);
-      //The mantissa is only 23 bit, that's all the precision there is.
-      ((int32_t*)out)[i] = av_clip(lrintf(f), -1*(1<<23), (1<<23)-1) << 8;
+      f = in[i];
+      if (f <= -1.0)
+        ((int32_t*)out)[i] = INT_MIN;
+      else
+      if (f >=  1.0)//no need to use corrected constant, rounding won't cause overflow
+        ((int32_t*)out)[i] = INT_MAX;
+      else
+        ((int32_t*)out)[i] = lrintf(f*2147483648.0);
+
     }
     break;
   }
    
    
More information about the MPlayer-cvslog
mailing list