Some work on assertions.
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sat, 15 Mar 2008 12:34:39 +0000 (23:34 +1100)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sat, 15 Mar 2008 12:34:39 +0000 (23:34 +1100)
TODO
configure.ac
libcelt/bands.c
libcelt/mathops.h
libcelt/os_support.h
libcelt/vq.c

diff --git a/TODO b/TODO
index 2f62b10..4745a53 100644 (file)
--- a/TODO
+++ b/TODO
@@ -6,8 +6,9 @@
 - Dynamic (intra-frame) bit allocation 
 - Joint encoding of stereo energy
 - Disable intra-frame prediction for more than X pulses
+- Remove contraction?
+- Simplify search?
+- Remove pulse spreading?
 
 - Encode band shape (or just tilt)?
-- Make pitch less aggressive instead of using contraction?
 - Make energy encoding more robust to losses?
-- Revisit pulse spreading
index 5072dcf..d90c216 100644 (file)
@@ -108,6 +108,11 @@ AC_ARG_ENABLE(static-modes, [  --enable-static-modes],
   AC_DEFINE([STATIC_MODES], , [Static modes])
 fi])
 
+AC_ARG_ENABLE(assertions, [  --enable-assertions],
+[if test "$enableval" = yes; then
+  AC_DEFINE([ENABLE_ASSERTIONS], , [Assertions])
+fi])
+
 if test $ac_cv_c_compiler_gnu = yes ; then
         CFLAGS="$CFLAGS -fvisibility=hidden -W -Wstrict-prototypes -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wno-parentheses -Wno-unused-parameter -Wno-sign-compare"
         #CFLAGS="$CFLAGS -fvisibility=hidden -W -Wstrict-prototypes -Wmissing-prototypes -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wno-parentheses"
index 04a2d09..ed3f86c 100644 (file)
@@ -93,7 +93,7 @@ void compute_band_energies(const CELTMode *m, const celt_sig_t *X, celt_ener_t *
             maxval = MAX32(maxval, ABS32(X[j*C+c]));
          if (maxval > 0)
          {
-            int shift = celt_ilog2(maxval)-10;
+            int shift = celt_zlog2(maxval)-10;
             for (j=B*eBands[i];j<B*eBands[i+1];j++)
                sum += VSHR32(X[j*C+c],shift)*VSHR32(X[j*C+c],shift);
             /* We're adding one here to make damn sure we never end up with a pitch vector that's
@@ -122,7 +122,7 @@ void normalise_bands(const CELTMode *m, const celt_sig_t *freq, celt_norm_t *X,
          celt_word16_t g;
          int j,shift;
          celt_word16_t E;
-         shift = celt_ilog2(bank[i*C+c])-13;
+         shift = celt_zlog2(bank[i*C+c])-13;
          E = VSHR32(bank[i*C+c], shift);
          if (E>0)
             g = DIV32_16(QCONST32(1.f,28),MULT16_16_Q14(E,sqrtC_1[C-1]));
@@ -420,7 +420,7 @@ void stereo_mix(const CELTMode *m, celt_norm_t *X, const celt_ener_t *bank, int
       celt_word16_t a1, a2;
       celt_word16_t norm;
 #ifdef FIXED_POINT
-      int shift = celt_ilog2(MAX32(bank[i*C], bank[i*C+1]))-13;
+      int shift = celt_zlog2(MAX32(bank[i*C], bank[i*C+1]))-13;
 #endif
       left = VSHR32(bank[i*C],shift);
       right = VSHR32(bank[i*C+1],shift);
index dacb64e..adaa3d1 100644 (file)
 #ifdef FIXED_POINT
 
 #include "entcode.h"
+#include "os_support.h"
 
 /** Integer log in base2. Undefined for zero and negative numbers */
 static inline celt_int16_t celt_ilog2(celt_word32_t x)
 {
+   celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers");
+   return EC_ILOG(x)-1;
+}
+
+/** Integer log in base2. Defined for zero, but not for negative numbers */
+static inline celt_int16_t celt_zlog2(celt_word32_t x)
+{
    return EC_ILOG(x)-1;
 }
 
index 5868a1b..18381fc 100644 (file)
@@ -157,18 +157,14 @@ static inline void _celt_putc(int ch, void *file)
 #endif
 
 #define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__);
+#ifdef ENABLE_ASSERTIONS
 #define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}}
-
-#ifndef RELEASE
-static inline void print_vec(float *vec, int len, char *name)
-{
-   int i;
-   printf ("%s ", name);
-   for (i=0;i<len;i++)
-      printf (" %f", vec[i]);
-   printf ("\n");
-}
+#define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}}
+#else
+#define celt_assert(cond)
+#define celt_assert2(cond, message)
 #endif
 
-#endif
+
+#endif /* OS_SUPPORT_H */
 
index 440da81..4c7f1b1 100644 (file)
@@ -167,8 +167,7 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
    }
    Rpp = ROUND(Rpp, NORM_SHIFT);
    Rxp = ROUND(Rxp, NORM_SHIFT);
-   if (Rpp>NORM_SCALING)
-      celt_fatal("Rpp > 1");
+   celt_assert2(Rpp<=NORM_SCALING, "Rpp should never have a norm greater than unity");
 
    /* We only need to initialise the zero because the first iteration only uses that */
    for (i=0;i<N;i++)
@@ -266,8 +265,7 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
 
       }
       
-      if (!(nbest[0]->score > -VERY_LARGE32))
-         celt_fatal("Could not find any match in VQ codebook. Something got corrupted somewhere.");
+      celt_assert2(nbest[0]->score > -VERY_LARGE32, "Could not find any match in VQ codebook. Something got corrupted somewhere.");
       /* Only now that we've made the final choice, update ny/iny and others */
       for (k=0;k<Lupdate;k++)
       {