spectrum: add helper to only flush ringbuffer data without resetting the fft

Reduces some duplicated code as well.
This commit is contained in:
Stefan Kost 2010-08-11 15:38:24 +03:00
parent 34bdec3d58
commit 61f22f4379

View file

@ -272,9 +272,20 @@ gst_spectrum_init (GstSpectrum * spectrum, GstSpectrumClass * g_class)
spectrum->threshold = DEFAULT_THRESHOLD; spectrum->threshold = DEFAULT_THRESHOLD;
} }
static void
gst_spectrum_flush (GstSpectrum * spectrum)
{
spectrum->num_frames = 0;
spectrum->num_fft = 0;
spectrum->accumulated_error = 0;
}
static void static void
gst_spectrum_reset_state (GstSpectrum * spectrum) gst_spectrum_reset_state (GstSpectrum * spectrum)
{ {
GST_DEBUG_OBJECT (spectrum, "resetting state");
if (spectrum->fft_ctx) if (spectrum->fft_ctx)
gst_fft_f32_free (spectrum->fft_ctx); gst_fft_f32_free (spectrum->fft_ctx);
g_free (spectrum->input); g_free (spectrum->input);
@ -286,14 +297,11 @@ gst_spectrum_reset_state (GstSpectrum * spectrum)
spectrum->fft_ctx = NULL; spectrum->fft_ctx = NULL;
spectrum->input = NULL; spectrum->input = NULL;
spectrum->input_tmp = NULL; spectrum->input_tmp = NULL;
spectrum->freqdata = NULL;
spectrum->spect_magnitude = NULL; spectrum->spect_magnitude = NULL;
spectrum->spect_phase = NULL; spectrum->spect_phase = NULL;
spectrum->freqdata = NULL;
spectrum->num_frames = 0; gst_spectrum_flush (spectrum);
spectrum->num_fft = 0;
spectrum->accumulated_error = 0;
} }
static void static void
@ -390,10 +398,9 @@ gst_spectrum_get_property (GObject * object, guint prop_id,
static gboolean static gboolean
gst_spectrum_start (GstBaseTransform * trans) gst_spectrum_start (GstBaseTransform * trans)
{ {
GstSpectrum *filter = GST_SPECTRUM (trans); GstSpectrum *spectrum = GST_SPECTRUM (trans);
filter->num_frames = 0; gst_spectrum_reset_state (spectrum);
filter->num_fft = 0;
return TRUE; return TRUE;
} }
@ -509,8 +516,8 @@ gst_spectrum_transform_ip (GstBaseTransform * trans, GstBuffer * buffer)
GST_LOG_OBJECT (spectrum, "input size: %d bytes", GST_BUFFER_SIZE (buffer)); GST_LOG_OBJECT (spectrum, "input size: %d bytes", GST_BUFFER_SIZE (buffer));
if (GST_BUFFER_IS_DISCONT (buffer)) { if (GST_BUFFER_IS_DISCONT (buffer)) {
GST_DEBUG_OBJECT (spectrum, "Discontinuity detected -- resetting state"); GST_DEBUG_OBJECT (spectrum, "Discontinuity detected -- flushing");
gst_spectrum_reset_state (spectrum); gst_spectrum_flush (spectrum);
} }
/* If we don't have a FFT context yet (or it was reset due to parameter /* If we don't have a FFT context yet (or it was reset due to parameter
@ -528,9 +535,10 @@ gst_spectrum_transform_ip (GstBaseTransform * trans, GstBuffer * buffer)
spectrum->error_per_interval = (spectrum->interval * rate) % GST_SECOND; spectrum->error_per_interval = (spectrum->interval * rate) % GST_SECOND;
if (spectrum->frames_per_interval == 0) if (spectrum->frames_per_interval == 0)
spectrum->frames_per_interval = 1; spectrum->frames_per_interval = 1;
spectrum->num_frames = 0;
spectrum->num_fft = 0; spectrum->input_pos = 0;
spectrum->accumulated_error = 0;
gst_spectrum_flush (spectrum);
} }
if (spectrum->num_frames == 0) if (spectrum->num_frames == 0)