Blame media/libspeex_resampler/set-skip-frac.patch

Packit f0b94e
# HG changeset patch
Packit f0b94e
# User Karl Tomlinson <karlt+@karlt.net>
Packit f0b94e
b=913854 add speex_resampler_set_skip_frac_num r=jmspeex
Packit f0b94e
Packit f0b94e
This allows a client to align output samples consistently for independent
Packit f0b94e
resampling of contiguous input buffers.
Packit f0b94e
Packit f0b94e
diff --git a/media/libspeex_resampler/src/resample.c b/media/libspeex_resampler/src/resample.c
Packit f0b94e
--- a/media/libspeex_resampler/src/resample.c
Packit f0b94e
+++ b/media/libspeex_resampler/src/resample.c
Packit f0b94e
@@ -1128,16 +1128,28 @@ EXPORT int speex_resampler_get_output_la
Packit f0b94e
 EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st)
Packit f0b94e
 {
Packit f0b94e
    spx_uint32_t i;
Packit f0b94e
    for (i=0;i<st->nb_channels;i++)
Packit f0b94e
       st->last_sample[i] = st->filt_len/2;
Packit f0b94e
    return RESAMPLER_ERR_SUCCESS;
Packit f0b94e
 }
Packit f0b94e
 
Packit f0b94e
+EXPORT int speex_resampler_set_skip_frac_num(SpeexResamplerState *st, spx_uint32_t skip_frac_num)
Packit f0b94e
+{
Packit f0b94e
+   spx_uint32_t i;
Packit f0b94e
+   spx_uint32_t last_sample = skip_frac_num / st->den_rate;
Packit f0b94e
+   spx_uint32_t samp_frac_num = skip_frac_num % st->den_rate;
Packit f0b94e
+   for (i=0;i<st->nb_channels;i++) {
Packit f0b94e
+      st->last_sample[i] = last_sample;
Packit f0b94e
+      st->samp_frac_num[i] = samp_frac_num;
Packit f0b94e
+   }
Packit f0b94e
+   return RESAMPLER_ERR_SUCCESS;
Packit f0b94e
+}
Packit f0b94e
+
Packit f0b94e
 EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st)
Packit f0b94e
 {
Packit f0b94e
    spx_uint32_t i;
Packit f0b94e
    for (i=0;i<st->nb_channels;i++)
Packit f0b94e
    {
Packit f0b94e
       st->last_sample[i] = 0;
Packit f0b94e
       st->magic_samples[i] = 0;
Packit f0b94e
       st->samp_frac_num[i] = 0;
Packit f0b94e
diff --git a/media/libspeex_resampler/src/speex_resampler.h b/media/libspeex_resampler/src/speex_resampler.h
Packit f0b94e
--- a/media/libspeex_resampler/src/speex_resampler.h
Packit f0b94e
+++ b/media/libspeex_resampler/src/speex_resampler.h
Packit f0b94e
@@ -69,16 +69,17 @@
Packit f0b94e
 #define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality)
Packit f0b94e
 #define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride)
Packit f0b94e
 #define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride)
Packit f0b94e
 #define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride)
Packit f0b94e
 #define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride)
Packit f0b94e
 #define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency)
Packit f0b94e
 #define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency)
Packit f0b94e
 #define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros)
Packit f0b94e
+#define speex_resampler_set_skip_frac_num CAT_PREFIX(RANDOM_PREFIX,_resampler_set_skip_frac_num)
Packit f0b94e
 #define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem)
Packit f0b94e
 #define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror)
Packit f0b94e
 
Packit f0b94e
 #define spx_int16_t short
Packit f0b94e
 #define spx_int32_t int
Packit f0b94e
 #define spx_uint16_t unsigned short
Packit f0b94e
 #define spx_uint32_t unsigned int
Packit f0b94e
       
Packit f0b94e
@@ -317,16 +318,32 @@ int speex_resampler_get_output_latency(S
Packit f0b94e
  * resampler. It is recommended to use that when resampling an audio file, as
Packit f0b94e
  * it will generate a file with the same length. For real-time processing,
Packit f0b94e
  * it is probably easier not to use this call (so that the output duration
Packit f0b94e
  * is the same for the first frame).
Packit f0b94e
  * @param st Resampler state
Packit f0b94e
  */
Packit f0b94e
 int speex_resampler_skip_zeros(SpeexResamplerState *st);
Packit f0b94e
 
Packit f0b94e
+/** Set the numerator in a fraction determining the advance through input
Packit f0b94e
+ * samples before writing any output samples. The denominator of the fraction
Packit f0b94e
+ * is the value returned from speex_resampler_get_ratio() in ratio_den. This
Packit f0b94e
+ * is only useful before starting to use a newly created or reset resampler.
Packit f0b94e
+ * If the first input sample is interpreted as the signal at time
Packit f0b94e
+ * input_latency*in_rate, then the first output sample represents the signal
Packit f0b94e
+ * at the time frac_num/ratio_num*out_rate.
Packit f0b94e
+ * This is intended for careful alignment of output sample points wrt input
Packit f0b94e
+ * sample points. Large values are not an efficient offset into the in buffer.
Packit f0b94e
+ * @param st Resampler state
Packit f0b94e
+ * @param skip_frac_num Numerator of the offset fraction,
Packit f0b94e
+ *                      between 0 and ratio_den-1.
Packit f0b94e
+ */
Packit f0b94e
+int speex_resampler_set_skip_frac_num(SpeexResamplerState *st,
Packit f0b94e
+                                      spx_uint32_t skip_frac_num);
Packit f0b94e
+
Packit f0b94e
 /** Reset a resampler so a new (unrelated) stream can be processed.
Packit f0b94e
  * @param st Resampler state
Packit f0b94e
  */
Packit f0b94e
 int speex_resampler_reset_mem(SpeexResamplerState *st);
Packit f0b94e
 
Packit f0b94e
 /** Returns the English meaning for an error code
Packit f0b94e
  * @param err Error code
Packit f0b94e
  * @return English string