shithub: aacdec

Download patch

ref: 056bcd7aa532463f1fc3421fcd612360c0f35c8a
parent: e6c584d53be18a56d628409c77fee356d7401f85
author: menno <menno>
date: Fri Nov 7 16:04:14 EST 2003

speed update for float -> linear conversion

--- a/libfaad/common.h
+++ b/libfaad/common.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: common.h,v 1.36 2003/11/04 21:43:30 menno Exp $
+** $Id: common.h,v 1.37 2003/11/07 21:04:14 menno Exp $
 **/
 
 #ifndef __COMMON_H__
@@ -261,6 +261,22 @@
   #define REAL_CONST(A) ((real_t)(A))
   #define COEF_CONST(A) ((real_t)(A))
 
+
+  #ifdef _WIN32
+    #define HAS_LRINTF
+    __inline int lrintf(float f)
+    {
+        int i;
+        __asm
+        {
+            fld   f
+            fistp i
+        }
+        return i;
+    }
+  #endif
+
+
   #ifdef __ICL /* only Intel C compiler has fmath ??? */
 
     #include <mathf.h>
@@ -274,6 +290,14 @@
 
   #else
 
+#ifdef HAVE_LRINTF
+#  define HAS_LRINTF
+#  define _ISOC9X_SOURCE 1
+#  define _ISOC99_SOURCE 1
+#  define __USE_ISOC9X   1
+#  define __USE_ISOC99   1
+#endif
+
     #include <math.h>
 
 #ifdef HAVE_SINF
@@ -301,6 +325,11 @@
 
   #endif
 
+#endif
+
+#ifndef HAS_LRINTF
+/* standard cast */
+#define lrintf(f) ((int32_t)(f))
 #endif
 
 typedef real_t complex_t[2];
--- a/libfaad/lt_predict.c
+++ b/libfaad/lt_predict.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: lt_predict.c,v 1.16 2003/11/04 21:43:30 menno Exp $
+** $Id: lt_predict.c,v 1.17 2003/11/07 21:04:14 menno Exp $
 **/
 
 
@@ -97,7 +97,7 @@
                 /* lt_pred_stat is a 16 bit int, multiplied with the fixed point real
                    this gives a real for x_est
                 */
-                x_est[i] = lt_pred_stat[num_samples + i - ltp->lag] * codebook[ltp->coef];
+                x_est[i] = (real_t)lt_pred_stat[num_samples + i - ltp->lag] * codebook[ltp->coef];
 #endif
             }
 
@@ -124,28 +124,43 @@
     }
 }
 
-static int16_t real_to_int16(real_t sig_in)
+#ifdef FIXED_POINT
+INLINE int16_t real_to_int16(real_t sig_in)
 {
-    int16_t sig_out = 0;
+    if (sig_in >= 0)
+    {
+        sig_in += (1 << (REAL_BITS-1));
+        if (sig_in > REAL_CONST(32767))
+            sig_in = 32767.0f;
+    } else {
+        sig_in += -(1 << (REAL_BITS-1));
+        if (sig_in < REAL_CONST(-32768))
+            sig_in = -32768.0f;
+    }
 
-    if (sig_in > REAL_CONST(32767))
-        sig_out = 32767;
-    else if (sig_in < REAL_CONST(-32768))
-        sig_out = -32768;
-#ifndef FIXED_POINT
-    else if (sig_in > 0.0)
-        sig_out = (int16_t)(sig_in + 0.5);
-    else if (sig_in <= 0.0)
-        sig_out = (int16_t)(sig_in - 0.5);
+    return (sig_in >> REAL_BITS);
+}
 #else
-    else if (sig_in > 0)
-        sig_out = (int16_t)((sig_in + (1 << (REAL_BITS-1))) >> REAL_BITS);
-    else if (sig_in <= 0)
-        sig_out = (int16_t)((sig_in - (1 << (REAL_BITS-1))) >> REAL_BITS);
+INLINE int16_t real_to_int16(real_t sig_in)
+{
+    if (sig_in >= 0)
+    {
+#ifndef HAS_LRINTF
+        sig_in += 0.5f;
 #endif
+        if (sig_in > REAL_CONST(32767))
+            sig_in = 32767.0f;
+    } else {
+#ifndef HAS_LRINTF
+        sig_in -= 0.5f;
+#endif
+        if (sig_in < REAL_CONST(-32768))
+            sig_in = -32768.0f;
+    }
 
-    return sig_out;
+    return lrintf(sig_in);
 }
+#endif
 
 void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap,
                      uint16_t frame_len, uint8_t object_type)
--- a/libfaad/output.c
+++ b/libfaad/output.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: output.c,v 1.27 2003/11/06 15:43:59 menno Exp $
+** $Id: output.c,v 1.28 2003/11/07 21:04:14 menno Exp $
 **/
 
 #include "common.h"
@@ -38,6 +38,7 @@
 
 #define DM_MUL ((real_t)1.0/((real_t)1.0+(real_t)sqrt(2.0)))
 
+
 static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample,
                                 uint8_t downMatrix, uint8_t *internal_channel)
 {
@@ -82,19 +83,23 @@
                 real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel);
                 if (inp >= 0.0f)
                 {
+#ifndef HAS_LRINTF
                     inp += 0.5f;
+#endif
                     if (inp >= 32768.0f)
                     {
                         inp = 32767.0f;
                     }
                 } else {
+#ifndef HAS_LRINTF
                     inp += -0.5f;
+#endif
                     if (inp <= -32769.0f)
                     {
                         inp = -32768.0f;
                     }
                 }
-                short_sample_buffer[(i*channels)+ch] = (int16_t)inp;
+                short_sample_buffer[(i*channels)+ch] = (int16_t)lrintf(inp);
             }
             break;
         case FAAD_FMT_24BIT:
@@ -104,19 +109,23 @@
                 inp *= 256.0f;
                 if (inp >= 0.0f)
                 {
+#ifndef HAS_LRINTF
                     inp += 0.5f;
+#endif
                     if (inp >= 8388608.0f)
                     {
                         inp = 8388607.0f;
                     }
                 } else {
+#ifndef HAS_LRINTF
                     inp += -0.5f;
+#endif
                     if (inp <= -8388609.0f)
                     {
                         inp = -8388608.0f;
                     }
                 }
-                int_sample_buffer[(i*channels)+ch] = (int32_t)inp;
+                int_sample_buffer[(i*channels)+ch] = lrintf(inp);
             }
             break;
         case FAAD_FMT_32BIT:
@@ -126,19 +135,23 @@
                 inp *= 65536.0f;
                 if (inp >= 0.0f)
                 {
+#ifndef HAS_LRINTF
                     inp += 0.5f;
+#endif
                     if (inp >= 2147483648.0f)
                     {
                         inp = 2147483647.0f;
                     }
                 } else {
+#ifndef HAS_LRINTF
                     inp += -0.5f;
+#endif
                     if (inp <= -2147483649.0f)
                     {
                         inp = -2147483648.0f;
                     }
                 }
-                int_sample_buffer[(i*channels)+ch] = (int32_t)inp;
+                int_sample_buffer[(i*channels)+ch] = lrintf(inp);
             }
             break;
         case FAAD_FMT_FLOAT: