b=913854 add speex_resampler_set_skip_frac_num r=jmspeex
authorKarl Tomlinson <karlt+@karlt.net>
Thu, 27 Feb 2014 11:44:40 +1300
changeset 171175 441506ef7062b9b16f08c404d392409d9cea4a4e
parent 171174 8423ee98bc775bc060b249ecef057bcabbec245d
child 171176 36e1f6623a6d9b633c8ea20c16b0973b8ee8d0ff
push id270
push userpvanderbeken@mozilla.com
push dateThu, 06 Mar 2014 09:24:21 +0000
reviewersjmspeex
bugs913854
milestone30.0a1
b=913854 add speex_resampler_set_skip_frac_num r=jmspeex This allows a client to align output samples consistently for independent resampling of contiguous input buffers.
layout/media/symbols.def.in
media/libspeex_resampler/set-skip-frac.patch
media/libspeex_resampler/src/resample.c
media/libspeex_resampler/src/speex_resampler.h
media/libspeex_resampler/update.sh
--- a/layout/media/symbols.def.in
+++ b/layout/media/symbols.def.in
@@ -122,16 +122,17 @@ speex_resampler_set_quality
 speex_resampler_get_quality
 speex_resampler_set_input_stride
 speex_resampler_get_input_stride
 speex_resampler_set_output_stride
 speex_resampler_get_output_stride
 speex_resampler_get_input_latency
 speex_resampler_get_output_latency
 speex_resampler_skip_zeros
+speex_resampler_set_skip_frac_num
 speex_resampler_reset_mem
 speex_resampler_strerror
 cubeb_destroy
 cubeb_init
 cubeb_get_max_channel_count
 cubeb_get_min_latency
 cubeb_get_preferred_sample_rate
 cubeb_stream_destroy
new file mode 100644
--- /dev/null
+++ b/media/libspeex_resampler/set-skip-frac.patch
@@ -0,0 +1,115 @@
+# HG changeset patch
+# Parent 091c02c13c8ba50903248432d0c7561104dace21
+# User Karl Tomlinson <karlt+@karlt.net>
+b=913854 add speex_resampler_set_skip_frac_num r=jmspeex
+
+This allows a client to align output samples consistently for independent
+resampling of contiguous input buffers.
+
+diff --git a/layout/media/symbols.def.in b/layout/media/symbols.def.in
+--- a/layout/media/symbols.def.in
++++ b/layout/media/symbols.def.in
+@@ -122,16 +122,17 @@ speex_resampler_set_quality
+ speex_resampler_get_quality
+ speex_resampler_set_input_stride
+ speex_resampler_get_input_stride
+ speex_resampler_set_output_stride
+ speex_resampler_get_output_stride
+ speex_resampler_get_input_latency
+ speex_resampler_get_output_latency
+ speex_resampler_skip_zeros
++speex_resampler_set_skip_frac_num
+ speex_resampler_reset_mem
+ speex_resampler_strerror
+ cubeb_destroy
+ cubeb_init
+ cubeb_get_max_channel_count
+ cubeb_get_min_latency
+ cubeb_get_preferred_sample_rate
+ cubeb_stream_destroy
+diff --git a/media/libspeex_resampler/src/resample.c b/media/libspeex_resampler/src/resample.c
+--- a/media/libspeex_resampler/src/resample.c
++++ b/media/libspeex_resampler/src/resample.c
+@@ -1138,16 +1138,28 @@ SPX_RESAMPLE_EXPORT int speex_resampler_
+ SPX_RESAMPLE_EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st)
+ {
+    spx_uint32_t i;
+    for (i=0;i<st->nb_channels;i++)
+       st->last_sample[i] = st->filt_len/2;
+    return RESAMPLER_ERR_SUCCESS;
+ }
+ 
++SPX_RESAMPLE_EXPORT int speex_resampler_set_skip_frac_num(SpeexResamplerState *st, spx_uint32_t skip_frac_num)
++{
++   spx_uint32_t i;
++   spx_uint32_t last_sample = skip_frac_num / st->den_rate;
++   spx_uint32_t samp_frac_num = skip_frac_num % st->den_rate;
++   for (i=0;i<st->nb_channels;i++) {
++      st->last_sample[i] = last_sample;
++      st->samp_frac_num[i] = samp_frac_num;
++   }
++   return RESAMPLER_ERR_SUCCESS;
++}
++
+ SPX_RESAMPLE_EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st)
+ {
+    spx_uint32_t i;
+    for (i=0;i<st->nb_channels;i++)
+    {
+       st->last_sample[i] = 0;
+       st->magic_samples[i] = 0;
+       st->samp_frac_num[i] = 0;
+diff --git a/media/libspeex_resampler/src/speex_resampler.h b/media/libspeex_resampler/src/speex_resampler.h
+--- a/media/libspeex_resampler/src/speex_resampler.h
++++ b/media/libspeex_resampler/src/speex_resampler.h
+@@ -69,16 +69,17 @@
+ #define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality)
+ #define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride)
+ #define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride)
+ #define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride)
+ #define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride)
+ #define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency)
+ #define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency)
+ #define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros)
++#define speex_resampler_set_skip_frac_num CAT_PREFIX(RANDOM_PREFIX,_resampler_set_skip_frac_num)
+ #define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem)
+ #define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror)
+ 
+ #define spx_int16_t short
+ #define spx_int32_t int
+ #define spx_uint16_t unsigned short
+ #define spx_uint32_t unsigned int
+       
+@@ -321,16 +322,32 @@ int speex_resampler_get_output_latency(S
+  * resampler. It is recommended to use that when resampling an audio file, as
+  * it will generate a file with the same length. For real-time processing,
+  * it is probably easier not to use this call (so that the output duration
+  * is the same for the first frame).
+  * @param st Resampler state
+  */
+ int speex_resampler_skip_zeros(SpeexResamplerState *st);
+ 
++/** Set the numerator in a fraction determining the advance through input
++ * samples before writing any output samples. The denominator of the fraction
++ * is the value returned from speex_resampler_get_ratio() in ratio_den. This
++ * is only useful before starting to use a newly created or reset resampler.
++ * If the first input sample is interpreted as the signal at time
++ * input_latency*in_rate, then the first output sample represents the signal
++ * at the time frac_num/ratio_num*out_rate.
++ * This is intended for careful alignment of output sample points wrt input
++ * sample points. Large values are not an efficient offset into the in buffer.
++ * @param st Resampler state
++ * @param skip_frac_num Numerator of the offset fraction,
++ *                      between 0 and ratio_den-1.
++ */
++int speex_resampler_set_skip_frac_num(SpeexResamplerState *st,
++                                      spx_uint32_t skip_frac_num);
++
+ /** Reset a resampler so a new (unrelated) stream can be processed.
+  * @param st Resampler state
+  */
+ int speex_resampler_reset_mem(SpeexResamplerState *st);
+ 
+ /** Returns the English meaning for an error code
+  * @param err Error code
+  * @return English string
--- a/media/libspeex_resampler/src/resample.c
+++ b/media/libspeex_resampler/src/resample.c
@@ -1138,16 +1138,28 @@ SPX_RESAMPLE_EXPORT int speex_resampler_
 SPX_RESAMPLE_EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st)
 {
    spx_uint32_t i;
    for (i=0;i<st->nb_channels;i++)
       st->last_sample[i] = st->filt_len/2;
    return RESAMPLER_ERR_SUCCESS;
 }
 
+SPX_RESAMPLE_EXPORT int speex_resampler_set_skip_frac_num(SpeexResamplerState *st, spx_uint32_t skip_frac_num)
+{
+   spx_uint32_t i;
+   spx_uint32_t last_sample = skip_frac_num / st->den_rate;
+   spx_uint32_t samp_frac_num = skip_frac_num % st->den_rate;
+   for (i=0;i<st->nb_channels;i++) {
+      st->last_sample[i] = last_sample;
+      st->samp_frac_num[i] = samp_frac_num;
+   }
+   return RESAMPLER_ERR_SUCCESS;
+}
+
 SPX_RESAMPLE_EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st)
 {
    spx_uint32_t i;
    for (i=0;i<st->nb_channels;i++)
    {
       st->last_sample[i] = 0;
       st->magic_samples[i] = 0;
       st->samp_frac_num[i] = 0;
--- a/media/libspeex_resampler/src/speex_resampler.h
+++ b/media/libspeex_resampler/src/speex_resampler.h
@@ -69,16 +69,17 @@
 #define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality)
 #define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride)
 #define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride)
 #define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride)
 #define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride)
 #define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency)
 #define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency)
 #define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros)
+#define speex_resampler_set_skip_frac_num CAT_PREFIX(RANDOM_PREFIX,_resampler_set_skip_frac_num)
 #define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem)
 #define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror)
 
 #define spx_int16_t short
 #define spx_int32_t int
 #define spx_uint16_t unsigned short
 #define spx_uint32_t unsigned int
       
@@ -321,16 +322,32 @@ int speex_resampler_get_output_latency(S
  * resampler. It is recommended to use that when resampling an audio file, as
  * it will generate a file with the same length. For real-time processing,
  * it is probably easier not to use this call (so that the output duration
  * is the same for the first frame).
  * @param st Resampler state
  */
 int speex_resampler_skip_zeros(SpeexResamplerState *st);
 
+/** Set the numerator in a fraction determining the advance through input
+ * samples before writing any output samples. The denominator of the fraction
+ * is the value returned from speex_resampler_get_ratio() in ratio_den. This
+ * is only useful before starting to use a newly created or reset resampler.
+ * If the first input sample is interpreted as the signal at time
+ * input_latency*in_rate, then the first output sample represents the signal
+ * at the time frac_num/ratio_num*out_rate.
+ * This is intended for careful alignment of output sample points wrt input
+ * sample points. Large values are not an efficient offset into the in buffer.
+ * @param st Resampler state
+ * @param skip_frac_num Numerator of the offset fraction,
+ *                      between 0 and ratio_den-1.
+ */
+int speex_resampler_set_skip_frac_num(SpeexResamplerState *st,
+                                      spx_uint32_t skip_frac_num);
+
 /** Reset a resampler so a new (unrelated) stream can be processed.
  * @param st Resampler state
  */
 int speex_resampler_reset_mem(SpeexResamplerState *st);
 
 /** Returns the English meaning for an error code
  * @param err Error code
  * @return English string
--- a/media/libspeex_resampler/update.sh
+++ b/media/libspeex_resampler/update.sh
@@ -15,8 +15,9 @@ cp $1/src/arch.h src
 cp $1/src/stack_alloc.h src
 cp $1/src/speex_resampler.h src
 cp $1/AUTHORS .
 cp $1/COPYING .
 
 # apply outstanding local patches
 patch -p1 < sse-detect-runtime.patch
 patch -p3 < reset.patch
+patch -p3 < set-skip-frac.patch