From 68dd76f1cd8ec68e2caeeabe325593ffb93b750c Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Duraffort?= Date: Thu, 19 Nov 2009 10:04:42 +0100 Subject: [PATCH] visual: save a huge number of allocation/deallocation. --- modules/visualization/visual/effects.c | 52 +++++++++++++++----------- modules/visualization/visual/visual.c | 1 + modules/visualization/visual/visual.h | 3 ++ 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/modules/visualization/visual/effects.c b/modules/visualization/visual/effects.c index f2043e6fb6..23c9e47804 100644 --- a/modules/visualization/visual/effects.c +++ b/modules/visualization/visual/effects.c @@ -100,25 +100,7 @@ int spectrum_Run(visual_effect_t * p_effect, vlc_object_t *p_aout, int16_t *p_buffs; /* int16_t converted buffer */ int16_t *p_s16_buff; /* int16_t converted buffer */ - p_s16_buff = malloc( p_buffer->i_nb_samples * p_effect->i_nb_chans * sizeof(int16_t)); - if( !p_s16_buff ) - return -1; - - p_buffs = p_s16_buff; - i_80_bands = config_GetInt ( p_aout, "visual-80-bands" ); - i_peak = config_GetInt ( p_aout, "visual-peaks" ); - - if( i_80_bands != 0) - { - xscale = xscale2; - i_nb_bands = 80; - } - else - { - xscale = xscale1; - i_nb_bands = 20; - } - + /* Create p_data if needed */ if( !p_data ) { p_effect->p_data = p_data = malloc( sizeof( spectrum_data ) ); @@ -130,15 +112,43 @@ int spectrum_Run(visual_effect_t * p_effect, vlc_object_t *p_aout, p_data->peaks = calloc( 80, sizeof(int) ); p_data->prev_heights = calloc( 80, sizeof(int) ); + + p_data->i_prev_nb_samples = 0; + p_data->p_prev_s16_buff = NULL; } peaks = (int *)p_data->peaks; prev_heights = (int *)p_data->prev_heights; + /* Allocate the buffer only if the number of samples change */ + if( p_buffer->i_nb_samples != p_data->i_prev_nb_samples ) + { + free( p_data->p_prev_s16_buff ); + p_data->p_prev_s16_buff = malloc( p_buffer->i_nb_samples * + p_effect->i_nb_chans * + sizeof(int16_t)); + p_data->i_prev_nb_samples = p_buffer->i_nb_samples; + if( !p_data->p_prev_s16_buff ) + return -1; + } + p_buffs = p_s16_buff = p_data->p_prev_s16_buff; + + i_80_bands = config_GetInt ( p_aout, "visual-80-bands" ); + i_peak = config_GetInt ( p_aout, "visual-peaks" ); + + if( i_80_bands != 0) + { + xscale = xscale2; + i_nb_bands = 80; + } + else + { + xscale = xscale1; + i_nb_bands = 20; + } height = malloc( i_nb_bands * sizeof(int) ); if( !height ) { - free( p_s16_buff ); return -1; } /* Convert the buffer to int16_t */ @@ -157,7 +167,6 @@ int spectrum_Run(visual_effect_t * p_effect, vlc_object_t *p_aout, if( !p_state) { free( height ); - free( p_s16_buff ); msg_Err(p_aout,"unable to initialize FFT transform"); return -1; } @@ -321,7 +330,6 @@ int spectrum_Run(visual_effect_t * p_effect, vlc_object_t *p_aout, fft_close( p_state ); - free( p_s16_buff ); free( height ); return 0; diff --git a/modules/visualization/visual/visual.c b/modules/visualization/visual/visual.c index 2b8ca4d9f7..212c4de66f 100644 --- a/modules/visualization/visual/visual.c +++ b/modules/visualization/visual/visual.c @@ -397,6 +397,7 @@ static void Close( vlc_object_t *p_this ) { free( ( ( spectrum_data * )p_effect->p_data )->peaks ); free( ( ( spectrum_data * )p_effect->p_data )->prev_heights ); + free( ( ( spectrum_data * )p_effect->p_data )->p_prev_s16_buff ); } free( p_effect->p_data ); free( p_effect->psz_args ); diff --git a/modules/visualization/visual/visual.h b/modules/visualization/visual/visual.h index aadb7a84ed..f811385876 100644 --- a/modules/visualization/visual/visual.h +++ b/modules/visualization/visual/visual.h @@ -42,6 +42,9 @@ typedef struct spectrum_data { int *peaks; int *prev_heights; + + unsigned i_prev_nb_samples; + int16_t *p_prev_s16_buff; } spectrum_data; -- 2.39.5