audiofxbasefirfilter: Use _CAST macros in some places and do some calculations only once

This commit is contained in:
Sebastian Dröge 2009-11-26 10:45:37 +01:00
parent abb437454e
commit c5f955a3b6

View file

@ -38,6 +38,11 @@
#include <gst/audio/gstaudiofilter.h> #include <gst/audio/gstaudiofilter.h>
#include <gst/controller/gstcontroller.h> #include <gst/controller/gstcontroller.h>
/* FIXME: Remove this once we depend on gst-plugins-base 0.10.26 */
#ifndef GST_AUDIO_FILTER_CAST
#define GST_AUDIO_FILTER_CAST(obj) ((GstAudioFilter *) (obj))
#endif
#include "audiofxbasefirfilter.h" #include "audiofxbasefirfilter.h"
#define GST_CAT_DEFAULT gst_audio_fx_base_fir_filter_debug #define GST_CAT_DEFAULT gst_audio_fx_base_fir_filter_debug
@ -142,7 +147,7 @@ process_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, g##ctype
{ \ { \
gint kernel_length = self->kernel_length; \ gint kernel_length = self->kernel_length; \
gint i, j, k, l; \ gint i, j, k, l; \
gint channels = GST_AUDIO_FILTER (self)->format.channels; \ gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; \
gint res_start; \ gint res_start; \
\ \
/* convolution */ \ /* convolution */ \
@ -187,10 +192,11 @@ gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter * self)
{ {
GstBuffer *outbuf; GstBuffer *outbuf;
GstFlowReturn res; GstFlowReturn res;
gint rate = GST_AUDIO_FILTER (self)->format.rate; gint rate = GST_AUDIO_FILTER_CAST (self)->format.rate;
gint channels = GST_AUDIO_FILTER (self)->format.channels; gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels;
gint outsize, outsamples; gint outsize, outsamples;
gint diffsize, diffsamples; gint diffsize, diffsamples;
gint width = GST_AUDIO_FILTER_CAST (self)->format.width / 8;
guint8 *in, *out; guint8 *in, *out;
if (channels == 0 || rate == 0) { if (channels == 0 || rate == 0) {
@ -201,7 +207,7 @@ gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter * self)
/* Calculate the number of samples and their memory size that /* Calculate the number of samples and their memory size that
* should be pushed from the residue */ * should be pushed from the residue */
outsamples = MIN (self->latency, self->buffer_fill / channels); outsamples = MIN (self->latency, self->buffer_fill / channels);
outsize = outsamples * channels * (GST_AUDIO_FILTER (self)->format.width / 8); outsize = outsamples * channels * width;
if (outsize == 0) { if (outsize == 0) {
self->buffer_fill = 0; self->buffer_fill = 0;
return; return;
@ -211,9 +217,8 @@ gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter * self)
* to start at the actual data instead of starting at the zeros before * to start at the actual data instead of starting at the zeros before
* when we only got one buffer smaller than latency */ * when we only got one buffer smaller than latency */
diffsamples = self->latency - self->buffer_fill / channels; diffsamples = self->latency - self->buffer_fill / channels;
diffsize = if (diffsamples > 0) {
diffsamples * channels * (GST_AUDIO_FILTER (self)->format.width / 8); diffsize = diffsamples * channels * width;
if (diffsize > 0) {
in = g_new0 (guint8, diffsize); in = g_new0 (guint8, diffsize);
out = g_new0 (guint8, diffsize); out = g_new0 (guint8, diffsize);
self->process (self, in, out, diffsamples * channels); self->process (self, in, out, diffsamples * channels);
@ -221,9 +226,9 @@ gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter * self)
g_free (out); g_free (out);
} }
res = gst_pad_alloc_buffer (GST_BASE_TRANSFORM (self)->srcpad, res = gst_pad_alloc_buffer (GST_BASE_TRANSFORM_CAST (self)->srcpad,
GST_BUFFER_OFFSET_NONE, outsize, GST_BUFFER_OFFSET_NONE, outsize,
GST_PAD_CAPS (GST_BASE_TRANSFORM (self)->srcpad), &outbuf); GST_PAD_CAPS (GST_BASE_TRANSFORM_CAST (self)->srcpad), &outbuf);
if (G_UNLIKELY (res != GST_FLOW_OK)) { if (G_UNLIKELY (res != GST_FLOW_OK)) {
GST_WARNING_OBJECT (self, "failed allocating buffer of %d bytes", outsize); GST_WARNING_OBJECT (self, "failed allocating buffer of %d bytes", outsize);
@ -262,7 +267,7 @@ gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter * self)
GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf),
GST_BUFFER_OFFSET_END (outbuf), outsamples); GST_BUFFER_OFFSET_END (outbuf), outsamples);
res = gst_pad_push (GST_BASE_TRANSFORM (self)->srcpad, outbuf); res = gst_pad_push (GST_BASE_TRANSFORM_CAST (self)->srcpad, outbuf);
if (G_UNLIKELY (res != GST_FLOW_OK)) { if (G_UNLIKELY (res != GST_FLOW_OK)) {
GST_WARNING_OBJECT (self, "failed to push residue"); GST_WARNING_OBJECT (self, "failed to push residue");
@ -309,10 +314,10 @@ gst_audio_fx_base_fir_filter_transform (GstBaseTransform * base,
{ {
GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base);
GstClockTime timestamp, expected_timestamp; GstClockTime timestamp, expected_timestamp;
gint channels = GST_AUDIO_FILTER (self)->format.channels; gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels;
gint rate = GST_AUDIO_FILTER (self)->format.rate; gint rate = GST_AUDIO_FILTER_CAST (self)->format.rate;
gint input_samples = gint width = GST_AUDIO_FILTER_CAST (self)->format.width / 8;
GST_BUFFER_SIZE (outbuf) / (GST_AUDIO_FILTER (self)->format.width / 8); gint input_samples = (GST_BUFFER_SIZE (outbuf) / width) / channels;
gint output_samples = input_samples; gint output_samples = input_samples;
gint diff = 0; gint diff = 0;
@ -358,12 +363,12 @@ gst_audio_fx_base_fir_filter_transform (GstBaseTransform * base,
/* Calculate the number of samples we can push out now without outputting /* Calculate the number of samples we can push out now without outputting
* latency zeros in the beginning */ * latency zeros in the beginning */
diff = self->latency * channels - self->buffer_fill; diff = self->latency - self->buffer_fill / channels;
if (diff > 0) if (diff > 0)
output_samples -= diff; output_samples -= diff;
self->process (self, GST_BUFFER_DATA (inbuf), GST_BUFFER_DATA (outbuf), self->process (self, GST_BUFFER_DATA (inbuf), GST_BUFFER_DATA (outbuf),
input_samples); input_samples * channels);
if (output_samples <= 0) { if (output_samples <= 0) {
return GST_BASE_TRANSFORM_FLOW_DROPPED; return GST_BASE_TRANSFORM_FLOW_DROPPED;
@ -371,31 +376,28 @@ gst_audio_fx_base_fir_filter_transform (GstBaseTransform * base,
GST_BUFFER_TIMESTAMP (outbuf) = expected_timestamp; GST_BUFFER_TIMESTAMP (outbuf) = expected_timestamp;
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (outbuf) =
gst_util_uint64_scale_round (output_samples / channels, GST_SECOND, rate); gst_util_uint64_scale_round (output_samples, GST_SECOND, rate);
if (self->start_off != GST_BUFFER_OFFSET_NONE) { if (self->start_off != GST_BUFFER_OFFSET_NONE) {
GST_BUFFER_OFFSET (outbuf) = self->start_off + self->nsamples; GST_BUFFER_OFFSET (outbuf) = self->start_off + self->nsamples;
GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_END (outbuf) = self->start_off + output_samples;
self->start_off + output_samples / channels;
} else { } else {
GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE; GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE;
GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE; GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE;
} }
if (output_samples < input_samples) { if (output_samples < input_samples) {
GST_BUFFER_DATA (outbuf) += GST_BUFFER_DATA (outbuf) += diff * width;
diff * (GST_AUDIO_FILTER (self)->format.width / 8); GST_BUFFER_SIZE (outbuf) -= diff * width;
GST_BUFFER_SIZE (outbuf) -=
diff * (GST_AUDIO_FILTER (self)->format.width / 8);
} }
self->nsamples += output_samples / channels; self->nsamples += output_samples;
GST_DEBUG_OBJECT (self, "Pushing buffer of size %d with timestamp: %" GST_DEBUG_OBJECT (self, "Pushing buffer of size %d with timestamp: %"
GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %" GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %"
G_GUINT64_FORMAT ", offset_end: %" G_GUINT64_FORMAT ", nsamples: %d", G_GUINT64_FORMAT ", offset_end: %" G_GUINT64_FORMAT ", nsamples: %d",
GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf),
GST_BUFFER_OFFSET_END (outbuf), output_samples / channels); GST_BUFFER_OFFSET_END (outbuf), output_samples);
return GST_FLOW_OK; return GST_FLOW_OK;
} }