gst/filter/: Fix processing with buffer sizes that are larger than the filter kernel...
authorSebastian Dröge <slomo@circular-chaos.org>
Sat, 11 Aug 2007 15:58:30 +0000 (15:58 +0000)
committerSebastian Dröge <slomo@circular-chaos.org>
Sat, 11 Aug 2007 15:58:30 +0000 (15:58 +0000)
Original commit message from CVS:
* gst/filter/gstbpwsinc.c: (process_32), (process_64):
* gst/filter/gstlpwsinc.c: (process_32), (process_64):
Fix processing with buffer sizes that are larger than the filter
kernel size.

gst/audiofx/audiowsincband.c
gst/audiofx/audiowsinclimit.c

index d6bb3d1..9d550ba 100644 (file)
@@ -245,6 +245,7 @@ process_32 (GstBPWSinc * self, gfloat * src, gfloat * dst, guint input_samples)
   gint kernel_length = self->kernel_length;
   gint i, j, k, l;
   gint channels = GST_AUDIO_FILTER (self)->format.channels;
+  gint res_start;
 
   /* convolution */
   for (i = 0; i < input_samples; i++) {
@@ -260,8 +261,17 @@ process_32 (GstBPWSinc * self, gfloat * src, gfloat * dst, guint input_samples)
         dst[i] += src[(l - j) * channels + k] * self->kernel[j];
   }
 
-  /* copy the tail of the current input buffer to the residue */
-  for (i = 0; i < kernel_length * channels; i++)
+  /* copy the tail of the current input buffer to the residue, while
+   * keeping parts of the residue if the input buffer is smaller than
+   * the kernel length */
+  if (input_samples < kernel_length * channels)
+    res_start = kernel_length * channels - input_samples;
+  else
+    res_start = 0;
+
+  for (i = 0; i < res_start; i++)
+    self->residue[i] = self->residue[i + input_samples];
+  for (i = res_start; i < kernel_length * channels; i++)
     self->residue[i] = src[input_samples - kernel_length * channels + i];
 }
 
@@ -272,6 +282,7 @@ process_64 (GstBPWSinc * self, gdouble * src, gdouble * dst,
   gint kernel_length = self->kernel_length;
   gint i, j, k, l;
   gint channels = GST_AUDIO_FILTER (self)->format.channels;
+  gint res_start;
 
   /* convolution */
   for (i = 0; i < input_samples; i++) {
@@ -287,8 +298,17 @@ process_64 (GstBPWSinc * self, gdouble * src, gdouble * dst,
         dst[i] += src[(l - j) * channels + k] * self->kernel[j];
   }
 
-  /* copy the tail of the current input buffer to the residue */
-  for (i = 0; i < kernel_length * channels; i++)
+  /* copy the tail of the current input buffer to the residue, while
+   * keeping parts of the residue if the input buffer is smaller than
+   * the kernel length */
+  if (input_samples < kernel_length * channels)
+    res_start = kernel_length * channels - input_samples;
+  else
+    res_start = 0;
+
+  for (i = 0; i < res_start; i++)
+    self->residue[i] = self->residue[i + input_samples];
+  for (i = res_start; i < kernel_length * channels; i++)
     self->residue[i] = src[input_samples - kernel_length * channels + i];
 }
 
index f639316..54ebc2a 100644 (file)
@@ -240,6 +240,7 @@ process_32 (GstLPWSinc * self, gfloat * src, gfloat * dst, guint input_samples)
   gint kernel_length = self->kernel_length;
   gint i, j, k, l;
   gint channels = GST_AUDIO_FILTER (self)->format.channels;
+  gint res_start;
 
   /* convolution */
   for (i = 0; i < input_samples; i++) {
@@ -255,8 +256,17 @@ process_32 (GstLPWSinc * self, gfloat * src, gfloat * dst, guint input_samples)
         dst[i] += src[(l - j) * channels + k] * self->kernel[j];
   }
 
-  /* copy the tail of the current input buffer to the residue */
-  for (i = 0; i < kernel_length * channels; i++)
+  /* copy the tail of the current input buffer to the residue, while
+   * keeping parts of the residue if the input buffer is smaller than
+   * the kernel length */
+  if (input_samples < kernel_length * channels)
+    res_start = kernel_length * channels - input_samples;
+  else
+    res_start = 0;
+
+  for (i = 0; i < res_start; i++)
+    self->residue[i] = self->residue[i + input_samples];
+  for (i = res_start; i < kernel_length * channels; i++)
     self->residue[i] = src[input_samples - kernel_length * channels + i];
 }
 
@@ -267,6 +277,7 @@ process_64 (GstLPWSinc * self, gdouble * src, gdouble * dst,
   gint kernel_length = self->kernel_length;
   gint i, j, k, l;
   gint channels = GST_AUDIO_FILTER (self)->format.channels;
+  gint res_start;
 
   /* convolution */
   for (i = 0; i < input_samples; i++) {
@@ -282,8 +293,17 @@ process_64 (GstLPWSinc * self, gdouble * src, gdouble * dst,
         dst[i] += src[(l - j) * channels + k] * self->kernel[j];
   }
 
-  /* copy the tail of the current input buffer to the residue */
-  for (i = 0; i < kernel_length * channels; i++)
+  /* copy the tail of the current input buffer to the residue, while
+   * keeping parts of the residue if the input buffer is smaller than
+   * the kernel length */
+  if (input_samples < kernel_length * channels)
+    res_start = kernel_length * channels - input_samples;
+  else
+    res_start = 0;
+
+  for (i = 0; i < res_start; i++)
+    self->residue[i] = self->residue[i + input_samples];
+  for (i = res_start; i < kernel_length * channels; i++)
     self->residue[i] = src[input_samples - kernel_length * channels + i];
 }