⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stats.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
        /* 1st sample : if started: start_date, else last_time, b_started */        p_sample = (counter_sample_t *)malloc( sizeof( counter_sample_t ) );        INSERT_ELEM( p_counter->pp_samples, p_counter->i_samples,                     p_counter->i_samples, p_sample );        p_sample->date = 0; p_sample->value.b_bool = 0;        /* 2nd sample : global_time, i_samples */        p_sample = (counter_sample_t *)malloc( sizeof( counter_sample_t ) );        INSERT_ELEM( p_counter->pp_samples, p_counter->i_samples,                     p_counter->i_samples, p_sample );        p_sample->date = 0; p_sample->value.i_int = 0;    }    if( p_counter->pp_samples[0]->value.b_bool == true )    {        msg_Warn( p_obj, "timer '%s' was already started !", psz_name );        goto out;    }    p_counter->pp_samples[0]->value.b_bool = true;    p_counter->pp_samples[0]->date = mdate();out:    vlc_mutex_unlock( &priv->timer_lock );}void __stats_TimerStop( vlc_object_t *p_obj, unsigned int i_id ){    counter_t *p_counter = NULL;    libvlc_priv_t *priv = libvlc_priv (p_obj->p_libvlc);    if( !priv->b_stats ) return;    vlc_mutex_lock( &priv->timer_lock );    for( int i = 0 ; i < priv->i_timers; i++ )    {        if( priv->pp_timers[i]->i_id == i_id            && priv->pp_timers[i]->p_obj == p_obj )        {            p_counter = priv->pp_timers[i];            break;        }    }    if( !p_counter || p_counter->i_samples != 2 )    {        msg_Err( p_obj, "timer does not exist" );        goto out;    }    p_counter->pp_samples[0]->value.b_bool = false;    p_counter->pp_samples[1]->value.i_int += 1;    p_counter->pp_samples[0]->date = mdate() - p_counter->pp_samples[0]->date;    p_counter->pp_samples[1]->date += p_counter->pp_samples[0]->date;out:    vlc_mutex_unlock( &priv->timer_lock );}void __stats_TimerDump( vlc_object_t *p_obj, unsigned int i_id ){    counter_t *p_counter = NULL;    libvlc_priv_t *priv = libvlc_priv (p_obj->p_libvlc);    if( !priv->b_stats ) return;    vlc_mutex_lock( &priv->timer_lock );    for( int i = 0 ; i < priv->i_timers; i++ )    {        if( priv->pp_timers[i]->i_id == i_id            && priv->pp_timers[i]->p_obj == p_obj )        {            p_counter = priv->pp_timers[i];            break;        }    }    TimerDump( p_obj, p_counter, true );    vlc_mutex_unlock( &priv->timer_lock );}void __stats_TimersDumpAll( vlc_object_t *p_obj ){    libvlc_priv_t *priv = libvlc_priv (p_obj->p_libvlc);    if( !priv->b_stats ) return;    vlc_mutex_lock( &priv->timer_lock );    for ( int i = 0 ; i < priv->i_timers ; i++ )        TimerDump( p_obj, priv->pp_timers[i], false );    vlc_mutex_unlock( &priv->timer_lock );}void __stats_TimerClean( vlc_object_t *p_obj, unsigned int i_id ){    libvlc_priv_t *priv = libvlc_priv (p_obj->p_libvlc);    vlc_mutex_lock( &priv->timer_lock );    for ( int i = priv->i_timers -1 ; i >= 0; i-- )    {        counter_t *p_counter = priv->pp_timers[i];        if( p_counter->i_id == i_id && p_counter->p_obj == p_obj )        {            REMOVE_ELEM( priv->pp_timers, priv->i_timers, i );            stats_CounterClean( p_counter );        }    }    vlc_mutex_unlock( &priv->timer_lock );}void __stats_TimersCleanAll( vlc_object_t *p_obj ){    libvlc_priv_t *priv = libvlc_priv (p_obj->p_libvlc);    vlc_mutex_lock( &priv->timer_lock );    for ( int i = priv->i_timers -1 ; i >= 0; i-- )    {        counter_t *p_counter = priv->pp_timers[i];        REMOVE_ELEM( priv->pp_timers, priv->i_timers, i );        stats_CounterClean( p_counter );    }    vlc_mutex_unlock( &priv->timer_lock );}void stats_CounterClean( counter_t *p_c ){    if( p_c )    {        int i = p_c->i_samples - 1 ;        while( i >= 0 )        {            counter_sample_t *p_s = p_c->pp_samples[i];            REMOVE_ELEM( p_c->pp_samples, p_c->i_samples, i );            free( p_s );            i--;        }        free( p_c->psz_name );        free( p_c );    }}/******************************************************************** * Following functions are local ********************************************************************//** * Update a statistics counter, according to its type * If needed, perform a bit of computation (derivative, mostly) * This function must be entered with stats handler lock * \param p_counter the counter to update * \param val the "new" value * \return an error code */static int CounterUpdate( vlc_object_t *p_handler,                          counter_t *p_counter,                          vlc_value_t val, vlc_value_t *new_val ){    switch( p_counter->i_compute_type )    {    case STATS_LAST:    case STATS_MIN:    case STATS_MAX:        if( p_counter->i_samples > 1)        {            msg_Err( p_handler, "LAST counter has several samples !" );            return VLC_EGENERIC;        }        if( p_counter->i_type != VLC_VAR_FLOAT &&            p_counter->i_type != VLC_VAR_INTEGER &&            p_counter->i_compute_type != STATS_LAST )        {            msg_Err( p_handler, "unable to compute MIN or MAX for this type");            return VLC_EGENERIC;        }        if( p_counter->i_samples == 0 )        {            counter_sample_t *p_new = (counter_sample_t*)malloc(                                               sizeof( counter_sample_t ) );            p_new->value.psz_string = NULL;            INSERT_ELEM( p_counter->pp_samples, p_counter->i_samples,                         p_counter->i_samples, p_new );        }        if( p_counter->i_samples == 1 )        {            /* Update if : LAST or (MAX and bigger) or (MIN and bigger) */            if( p_counter->i_compute_type == STATS_LAST ||                ( p_counter->i_compute_type == STATS_MAX &&                   ( ( p_counter->i_type == VLC_VAR_INTEGER &&                       p_counter->pp_samples[0]->value.i_int > val.i_int ) ||                     ( p_counter->i_type == VLC_VAR_FLOAT &&                       p_counter->pp_samples[0]->value.f_float > val.f_float )                   ) ) ||                ( p_counter->i_compute_type == STATS_MIN &&                   ( ( p_counter->i_type == VLC_VAR_INTEGER &&                       p_counter->pp_samples[0]->value.i_int < val.i_int ) ||                     ( p_counter->i_type == VLC_VAR_FLOAT &&                       p_counter->pp_samples[0]->value.f_float < val.f_float )                   ) ) )            {                if( p_counter->i_type == VLC_VAR_STRING &&                    p_counter->pp_samples[0]->value.psz_string )                {                    free( p_counter->pp_samples[0]->value.psz_string );                }                p_counter->pp_samples[0]->value = val;                *new_val = p_counter->pp_samples[0]->value;            }        }        break;    case STATS_DERIVATIVE:    {        counter_sample_t *p_new, *p_old;        mtime_t now = mdate();        if( now - p_counter->last_update < p_counter->update_interval )        {            return VLC_EGENERIC;        }        p_counter->last_update = now;        if( p_counter->i_type != VLC_VAR_FLOAT &&            p_counter->i_type != VLC_VAR_INTEGER )        {            msg_Err( p_handler, "Unable to compute DERIVATIVE for this type");            return VLC_EGENERIC;        }        /* Insert the new one at the beginning */        p_new = (counter_sample_t*)malloc( sizeof( counter_sample_t ) );        p_new->value = val;        p_new->date = p_counter->last_update;        INSERT_ELEM( p_counter->pp_samples, p_counter->i_samples,                     0, p_new );        if( p_counter->i_samples == 3 )        {            p_old = p_counter->pp_samples[2];            REMOVE_ELEM( p_counter->pp_samples, p_counter->i_samples, 2 );            free( p_old );        }        break;    }    case STATS_COUNTER:        if( p_counter->i_samples > 1)        {            msg_Err( p_handler, "LAST counter has several samples !" );            return VLC_EGENERIC;        }        if( p_counter->i_samples == 0 )        {            counter_sample_t *p_new = (counter_sample_t*)malloc(                                               sizeof( counter_sample_t ) );            p_new->value.psz_string = NULL;            INSERT_ELEM( p_counter->pp_samples, p_counter->i_samples,                         p_counter->i_samples, p_new );        }        if( p_counter->i_samples == 1 )        {            switch( p_counter->i_type )            {            case VLC_VAR_INTEGER:                p_counter->pp_samples[0]->value.i_int += val.i_int;                if( new_val )                    new_val->i_int = p_counter->pp_samples[0]->value.i_int;                break;            case VLC_VAR_FLOAT:                p_counter->pp_samples[0]->value.f_float += val.f_float;                if( new_val )                    new_val->f_float = p_counter->pp_samples[0]->value.f_float;            default:                msg_Err( p_handler, "Trying to increment invalid variable %s",                         p_counter->psz_name );                return VLC_EGENERIC;            }        }        break;    }    return VLC_SUCCESS;}static void TimerDump( vlc_object_t *p_obj, counter_t *p_counter,                       bool b_total ){    if( !p_counter )        return;    mtime_t last, total;    int i_total;    if( p_counter->i_samples != 2 )    {        msg_Err( p_obj, "timer %s does not exist", p_counter->psz_name );        return;    }    i_total = p_counter->pp_samples[1]->value.i_int;    total = p_counter->pp_samples[1]->date;    if( p_counter->pp_samples[0]->value.b_bool == true )    {        last = mdate() - p_counter->pp_samples[0]->date;        i_total += 1;        total += last;    }    else    {        last = p_counter->pp_samples[0]->date;    }    if( b_total )    {        msg_Dbg( p_obj,             "TIMER %s : %.3f ms - Total %.3f ms / %i intvls (Avg %.3f ms)",             p_counter->psz_name, (float)last/1000, (float)total/1000, i_total,             (float)(total)/(1000*(float)i_total ) );    }    else    {        msg_Dbg( p_obj,             "TIMER %s : Total %.3f ms / %i intvls (Avg %.3f ms)",             p_counter->psz_name, (float)total/1000, i_total,             (float)(total)/(1000*(float)i_total ) );    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -