Tweaks the CELT fractional resampling delay to get perfect alignment
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Tue, 31 Jan 2012 07:03:39 +0000 (02:03 -0500)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Tue, 31 Jan 2012 07:18:05 +0000 (02:18 -0500)
Also using the same int->float conversion functions for SILK as for CELT
and changed encoder implementation default to constrained VBR just to
be safe when VBR gets more aggressive.

celt/celt.c
celt/float_cast.h
silk/float/SigProc_FLP.h
src/opus_encoder.c

index eeed05a..6c1eb6b 100644 (file)
@@ -472,9 +472,10 @@ static void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsa
          x++;
          /* Technically the store could be moved outside of the if because
             the stores we don't want will just be overwritten */
+         if (count==0)
+            *y = SCALEOUT(SIG2WORD16(tmp));
          if (++count==downsample)
          {
-            *y = SCALEOUT(SIG2WORD16(tmp));
             y+=C;
             count=0;
          }
index 39f63d4..079307a 100644 (file)
@@ -29,6 +29,9 @@
 #ifndef FLOAT_CAST_H
 #define FLOAT_CAST_H
 
+
+#include "arch.h"
+
 /*============================================================================
 **      On Intel Pentium processors (especially PIII and probably P4), converting
 **      from float to int is very slow. To meet the C specs, the code produced by
index 0d70ca1..7c7601f 100644 (file)
@@ -29,6 +29,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #define SILK_SIGPROC_FLP_H
 
 #include "SigProc_FIX.h"
+#include "float_cast.h"
 #include <math.h>
 
 #ifdef  __cplusplus
@@ -163,12 +164,7 @@ static inline silk_float silk_sigmoid( silk_float x )
 /* floating-point to integer conversion (rounding) */
 static inline opus_int32 silk_float2int( double x )
 {
-#ifdef _WIN32
-    double t = x + 6755399441055744.0;
-    return *((opus_int32 *)( &t ));
-#else
-    return (opus_int32)( ( x > 0 ) ? x + 0.5 : x - 0.5 );
-#endif
+    return (opus_int32)float2int( x );
 }
 
 /* floating-point to integer conversion (rounding) */
@@ -180,13 +176,8 @@ static inline void silk_float2short_array(
 {
     opus_int32 k;
     for( k = length - 1; k >= 0; k-- ) {
-#ifdef _WIN32
-        double t = in[k] + 6755399441055744.0;
-        out[k] = (opus_int16)silk_SAT16(*(( opus_int32 * )( &t )));
-#else
         double x = in[k];
-        out[k] = (opus_int16)silk_SAT16( ( x > 0 ) ? x + 0.5 : x - 0.5 );
-#endif
+        out[k] = silk_SAT16( (opus_int32)float2int( x ) );
     }
 }
 
index b95cf28..805bffb 100644 (file)
@@ -194,6 +194,8 @@ int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int applicat
     celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(10));
 
     st->use_vbr = 1;
+    /* Makes constrained VBR the default (safer for real-time use) */
+    st->vbr_constraint = 1;
     st->user_bitrate_bps = OPUS_AUTO;
     st->bitrate_bps = 3000+Fs*channels;
     st->application = application;