X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fstats.c;h=594f954672ed503b27a83da057ed57d62b7626c0;hb=5bd61a8060701e1c0c6b70066f0e2f27b117ea43;hp=6f2d33b29f3989989e6c15841089676f19a76b10;hpb=a5058059abe0fbf691227e9242565939e71f5a0c;p=vlc diff --git a/src/misc/stats.c b/src/misc/stats.c index 6f2d33b29f..594f954672 100644 --- a/src/misc/stats.c +++ b/src/misc/stats.c @@ -1,8 +1,8 @@ /***************************************************************************** * stats.c: Statistics handling ***************************************************************************** - * Copyright (C) 1998-2005 the VideoLAN team - * $Id: messages.c 12729 2005-10-02 08:00:06Z courmisch $ + * Copyright (C) 2006 the VideoLAN team + * $Id$ * * Authors: Clément Stenac * @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -44,6 +44,31 @@ static stats_handler_t *stats_HandlerGet( vlc_object_t *p_this ); * Exported functions *****************************************************************************/ +/** + * Cleanup statistics handler stuff + * \param p_stats the handler to clean + * \return nothing + */ +void stats_HandlerDestroy( stats_handler_t *p_stats ) +{ + int i; + for ( i = p_stats->i_counters - 1 ; i >= 0 ; i-- ) + { + int j; + counter_t * p_counter = p_stats->pp_counters[i]; + + for( j = p_counter->i_samples -1; j >= 0 ; j-- ) + { + counter_sample_t *p_sample = p_counter->pp_samples[j]; + REMOVE_ELEM( p_counter->pp_samples, p_counter->i_samples, j ); + free( p_sample ); + } + free( p_counter->psz_name ); + REMOVE_ELEM( p_stats->pp_counters, p_stats->i_counters, i ); + free( p_counter ); + } +} + /** * Create a statistics counter * \param p_this the object for which to create the counter @@ -59,7 +84,13 @@ int __stats_Create( vlc_object_t *p_this, char *psz_name, int i_type, int i_compute_type ) { counter_t *p_counter; - stats_handler_t *p_handler = stats_HandlerGet( p_this ); + stats_handler_t *p_handler; + + if( p_this->p_libvlc->b_stats == VLC_FALSE ) + { + return VLC_EGENERIC; + } + p_handler = stats_HandlerGet( p_this ); if( !p_handler ) return VLC_ENOMEM; vlc_mutex_lock( &p_handler->object_lock ); @@ -98,11 +129,15 @@ int __stats_Update( vlc_object_t *p_this, char *psz_name, vlc_value_t val ) counter_t *p_counter; /* Get stats handler singleton */ - stats_handler_t *p_handler = stats_HandlerGet( p_this ); + stats_handler_t *p_handler; + if( p_this->p_libvlc->b_stats == VLC_FALSE ) + { + return VLC_EGENERIC; + } + p_handler = stats_HandlerGet( p_this ); if( !p_handler ) return VLC_ENOMEM; vlc_mutex_lock( &p_handler->object_lock ); - /* Look for existing element */ p_counter = GetCounter( p_handler, p_this->i_object_id, psz_name ); @@ -132,11 +167,15 @@ int __stats_Get( vlc_object_t *p_this, int i_object_id, char *psz_name, vlc_valu counter_t *p_counter; /* Get stats handler singleton */ - stats_handler_t *p_handler = stats_HandlerGet( p_this ); + stats_handler_t *p_handler; + if( p_this->p_libvlc->b_stats == VLC_FALSE ) + { + return VLC_EGENERIC; + } + p_handler = stats_HandlerGet( p_this ); if( !p_handler ) return VLC_ENOMEM; vlc_mutex_lock( &p_handler->object_lock ); - /* Look for existing element */ p_counter = GetCounter( p_handler, i_object_id, psz_name ); @@ -150,6 +189,7 @@ int __stats_Get( vlc_object_t *p_this, int i_object_id, char *psz_name, vlc_valu if( p_counter->i_samples == 0 ) { vlc_mutex_unlock( &p_handler->object_lock ); + val->i_int = val->f_float = 0.0; return VLC_EGENERIC; } @@ -162,7 +202,14 @@ int __stats_Get( vlc_object_t *p_this, int i_object_id, char *psz_name, vlc_valu *val = p_counter->pp_samples[0]->value; break; case STATS_DERIVATIVE: - if( p_counter->i_type == VLC_VAR_INTEGER ) + /* Not ready yet */ + if( p_counter->i_samples < 2 ) + { + vlc_mutex_unlock( &p_handler->object_lock ); + val->i_int = 0; val->f_float = 0.0; + return VLC_EGENERIC; + } + if( p_counter->i_type == VLC_VAR_INTEGER ) { float f = ( p_counter->pp_samples[0]->value.i_int - p_counter->pp_samples[1]->value.i_int ) / @@ -176,7 +223,6 @@ int __stats_Get( vlc_object_t *p_this, int i_object_id, char *psz_name, vlc_valu p_counter->pp_samples[1]->value.f_float ) / (float)( p_counter->pp_samples[0]->date - p_counter->pp_samples[1]->date ); - val->i_int = (int)f; val->f_float = f; } break; @@ -198,8 +244,12 @@ counter_t *__stats_CounterGet( vlc_object_t *p_this, int i_object_id, { counter_t *p_counter; - /* Get stats handler singleton */ - stats_handler_t *p_handler = stats_HandlerGet( p_this ); + stats_handler_t *p_handler; + if( p_this->p_libvlc->b_stats == VLC_FALSE ) + { + return NULL; + } + p_handler = stats_HandlerGet( p_this ); if( !p_handler ) return NULL; vlc_mutex_lock( &p_handler->object_lock ); @@ -217,22 +267,67 @@ counter_t *__stats_CounterGet( vlc_object_t *p_this, int i_object_id, void stats_ComputeInputStats( input_thread_t *p_input, input_stats_t *p_stats ) { + vlc_object_t *p_obj; + vlc_list_t *p_list; + int i_index; vlc_mutex_lock( &p_stats->lock ); - /* read_packets and read_bytes are common to all streams */ + + /* Input */ stats_GetInteger( p_input, p_input->i_object_id, "read_packets", &p_stats->i_read_packets ); stats_GetInteger( p_input, p_input->i_object_id, "read_bytes", &p_stats->i_read_bytes ); stats_GetFloat( p_input, p_input->i_object_id, "input_bitrate", - &p_stats->f_bitrate ); + &p_stats->f_input_bitrate ); + + stats_GetInteger( p_input, p_input->i_object_id, "demux_read", + &p_stats->i_demux_read_bytes ); + stats_GetFloat( p_input, p_input->i_object_id, "demux_bitrate", + &p_stats->f_demux_bitrate ); + + stats_GetInteger( p_input, p_input->i_object_id, "decoded_video", + &p_stats->i_decoded_video ); + stats_GetInteger( p_input, p_input->i_object_id, "decoded_audio", + &p_stats->i_decoded_audio ); + + /* Aout - We store in p_input because aout is shared */ + stats_GetInteger( p_input, p_input->i_object_id, "played_abuffers", + &p_stats->i_played_abuffers ); + stats_GetInteger( p_input, p_input->i_object_id, "lost_abuffers", + &p_stats->i_lost_abuffers ); + + /* Vouts */ + p_list = vlc_list_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD ); + if( p_list ) + { + p_stats->i_displayed_pictures = 0 ; + p_stats->i_lost_pictures = 0; + for( i_index = 0; i_index < p_list->i_count ; i_index ++ ) + { + int i_displayed = 0, i_lost = 0; + p_obj = (vlc_object_t *)p_list->p_values[i_index].p_object; + stats_GetInteger( p_obj, p_obj->i_object_id, "displayed_pictures", + &i_displayed ); + stats_GetInteger( p_obj, p_obj->i_object_id, "lost_pictures", + &i_lost ); + p_stats->i_displayed_pictures += i_displayed; + p_stats->i_lost_pictures += i_lost; + } + vlc_list_release( p_list ); + } + vlc_mutex_unlock( &p_stats->lock ); } void stats_ReinitInputStats( input_stats_t *p_stats ) { p_stats->i_read_packets = p_stats->i_read_bytes = - p_stats->f_bitrate = p_stats->f_average_bitrate = - p_stats->i_displayed_pictures = p_stats->i_lost_pictures = 0; + p_stats->f_input_bitrate = p_stats->f_average_input_bitrate = + p_stats->i_demux_read_packets = p_stats->i_demux_read_bytes = + p_stats->f_demux_bitrate = p_stats->f_average_demux_bitrate = + p_stats->i_displayed_pictures = p_stats->i_lost_pictures = + p_stats->i_played_abuffers = p_stats->i_lost_abuffers = + p_stats->i_decoded_video = p_stats->i_decoded_audio = 0; } void stats_DumpInputStats( input_stats_t *p_stats ) @@ -240,9 +335,14 @@ void stats_DumpInputStats( input_stats_t *p_stats ) vlc_mutex_lock( &p_stats->lock ); /* f_bitrate is in bytes / microsecond * *1000 => bytes / millisecond => kbytes / seconds */ - fprintf( stderr, "Read packets : %i (%i bytes) - %f kB/s\n", + fprintf( stderr, "Input : %i (%i bytes) - %f kB/s - Demux : %i (%i bytes) - %f kB/s\n" + " - Vout : %i/%i - Aout : %i/%i\n", p_stats->i_read_packets, p_stats->i_read_bytes, - p_stats->f_bitrate * 1000 ); + p_stats->f_input_bitrate * 1000, + p_stats->i_demux_read_packets, p_stats->i_demux_read_bytes, + p_stats->f_demux_bitrate * 1000, + p_stats->i_displayed_pictures, p_stats->i_lost_pictures, + p_stats->i_played_abuffers, p_stats->i_lost_abuffers ); vlc_mutex_unlock( &p_stats->lock ); } @@ -384,7 +484,7 @@ static counter_t *GetCounter( stats_handler_t *p_handler, int i_object_id, char *psz_name ) { int i; - for( i = 0; i< p_handler->i_counters; i++ ) + for( i = 0; i< p_handler->i_counters; i++ ) { counter_t *p_counter = p_handler->pp_counters[i]; if( p_counter->i_source_object == i_object_id && @@ -397,8 +497,6 @@ static counter_t *GetCounter( stats_handler_t *p_handler, int i_object_id, } - - static stats_handler_t *stats_HandlerGet( vlc_object_t *p_this ) { stats_handler_t *p_handler = (stats_handler_t*) @@ -444,5 +542,3 @@ static stats_handler_t* stats_HandlerCreate( vlc_object_t *p_this ) return p_handler; } - -