audioresample: don't skip input samples
authorKipp Cannon <kipp.cannon@ligo.org>
Tue, 8 Jul 2014 16:37:41 +0000 (12:37 -0400)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 5 Sep 2014 08:17:43 +0000 (11:17 +0300)
when downsampling, the output buffer can be filled before all the input
samples are consumed.  this is correct:  when downsampling, several input
samples are needed for each output sample, so when only a small number of
input samples are available the number of output samples produced can be 0.

the resampler, however, was discarding those extra input samples instead of
clocking them into its filter history for the next iteration.  this patch
fixes this by removing the check that the output buffer is full.  the code
now always loops until all input samples are consumed, and relies on the
calling code to have provided a suitably sized location for the output.
note that there are already other checks in place in the calling code to
ensure that this is the case.

https://bugzilla.gnome.org/show_bug.cgi?id=732908

gst/audioresample/resample.c

index d4df979..d067192 100644 (file)
@@ -1183,7 +1183,7 @@ speex_resampler_process_float (SpeexResamplerState * st,
   if (st->magic_samples[channel_index])
     olen -= speex_resampler_magic (st, channel_index, &out, olen);
   if (!st->magic_samples[channel_index]) {
-    while (ilen && olen) {
+    while (ilen) {
       spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
       spx_uint32_t ochunk = olen;
 
@@ -1238,7 +1238,7 @@ speex_resampler_process_int (SpeexResamplerState * st,
 
   st->out_stride = 1;
 
-  while (ilen && olen) {
+  while (ilen) {
     spx_word16_t *y = ystack;
     spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
     spx_uint32_t ochunk = (olen > ylen) ? ylen : olen;