shithub: opus-tools

Download patch

ref: f426ab5260fe9f1618a187fc2a8264dbba4aef08
parent: 00caf732431a47e023bd2eb834b43a9e9cdab320
author: Gregory Maxwell <[email protected]>
date: Tue Jul 24 19:56:14 EDT 2012

Switch 48->44.1k to the direct resampler. 2x speedup for opusdec.

Also fixes a bug where the filter could be size which was
not a multiple of 8 (as required by the SSE code).

--- a/src/resample.c
+++ b/src/resample.c
@@ -61,6 +61,8 @@
 # include "config.h"
 #endif
 
+#define RESAMPLE_HUGEMEM 1
+
 #ifdef OUTSIDE_SPEEX
 #include <stdlib.h>
 static void *speex_alloc (int size) {return calloc(size,1);}
@@ -567,8 +569,8 @@
       st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate;
       /* FIXME: divide the numerator and denominator by a certain amount if they're too large */
       st->filt_len = st->filt_len*st->num_rate / st->den_rate;
-      /* Round down to make sure we have a multiple of 4 */
-      st->filt_len &= (~0x3);
+      /* Round up to make sure we have a multiple of 8 */
+      st->filt_len = ((st->filt_len-1)&(~0x7))+8;
       if (2*st->den_rate < st->num_rate)
          st->oversample >>= 1;
       if (4*st->den_rate < st->num_rate)
@@ -583,9 +585,13 @@
       /* up-sampling */
       st->cutoff = quality_map[st->quality].upsample_bandwidth;
    }
-   
+
+#ifdef RESAMPLE_HUGEMEM
+   if (st->den_rate <= 16*(st->oversample+8))
+#else
    /* Choose the resampling type that requires the least amount of memory */
-   if (st->den_rate <= st->oversample)
+   if (st->den_rate <= (st->oversample+8))
+#endif
    {
       spx_uint32_t i;
       if (!st->sinc_table)