static int vlclua_input_item_stats( lua_State *L ) { input_item_t *p_item = vlclua_input_item_get_internal( L ); lua_newtable( L ); if( p_item ) { vlc_mutex_lock( &p_item->p_stats->lock ); #define STATS_INT( n ) lua_pushinteger( L, p_item->p_stats->i_ ## n ); \ lua_setfield( L, -2, #n ); #define STATS_FLOAT( n ) lua_pushnumber( L, p_item->p_stats->f_ ## n ); \ lua_setfield( L, -2, #n ); STATS_INT( read_packets ) STATS_INT( read_bytes ) STATS_FLOAT( input_bitrate ) STATS_FLOAT( average_input_bitrate ) STATS_INT( demux_read_packets ) STATS_INT( demux_read_bytes ) STATS_FLOAT( demux_bitrate ) STATS_FLOAT( average_demux_bitrate ) STATS_INT( demux_corrupted ) STATS_INT( demux_discontinuity ) STATS_INT( decoded_audio ) STATS_INT( decoded_video ) STATS_INT( displayed_pictures ) STATS_INT( lost_pictures ) STATS_INT( sent_packets ) STATS_INT( sent_bytes ) STATS_FLOAT( send_bitrate ) STATS_INT( played_abuffers ) STATS_INT( lost_abuffers ) #undef STATS_INT #undef STATS_FLOAT vlc_mutex_unlock( &p_item->p_stats->lock ); } return 1; }
static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer, int i_buffer, char *p_request, char **pp_data, int *pi_data ) { intf_sys_t *p_sys = p_args->p_intf->p_sys; int i_request = p_request != NULL ? strlen( p_request ) : 0; char *dst; char position[4]; /* percentage */ char time[12]; /* in seconds */ char length[12]; /* in seconds */ audio_volume_t i_volume; char volume[5]; const char *state; char stats[20]; assert( p_sys->p_input == NULL ); /* FIXME: proper locking anyone? */ p_sys->p_input = playlist_CurrentInput( p_sys->p_playlist ); if( p_sys->p_input ) { snprintf( position, sizeof(position), "%d", (int)(var_GetFloat( p_sys->p_input, "position" ) * 100.)); snprintf( time, sizeof(time), "%"PRIi64, var_GetTime( p_sys->p_input, "time" ) / CLOCK_FREQ ); snprintf( length, sizeof(length), "%"PRIi64, var_GetTime( p_sys->p_input, "length" ) / CLOCK_FREQ ); switch( var_GetInteger( p_sys->p_input, "state" ) ) { case PLAYING_S: state = "playing"; break; case OPENING_S: state = "opening/connecting"; break; case PAUSE_S: state = "paused"; break; default: state = "stop"; break; } } else { strcpy( position, "0" ); strcpy( time, "0" ); strcpy( length, "0" ); state = "stop"; } aout_VolumeGet( p_sys->p_playlist, &i_volume ); snprintf( volume, sizeof(volume), "%d", (int)i_volume ); p_args->vars = mvar_New( "variables", "" ); mvar_AppendNewVar( p_args->vars, "url_param", i_request > 0 ? "1" : "0" ); mvar_AppendNewVar( p_args->vars, "url_value", p_request ); mvar_AppendNewVar( p_args->vars, "version", VLC_Version() ); mvar_AppendNewVar( p_args->vars, "copyright", COPYRIGHT_MESSAGE ); mvar_AppendNewVar( p_args->vars, "vlc_compile_by", VLC_CompileBy() ); mvar_AppendNewVar( p_args->vars, "vlc_compile_host", VLC_CompileHost() ); mvar_AppendNewVar( p_args->vars, "vlc_compiler", VLC_Compiler() ); mvar_AppendNewVar( p_args->vars, "stream_position", position ); mvar_AppendNewVar( p_args->vars, "stream_time", time ); mvar_AppendNewVar( p_args->vars, "stream_length", length ); mvar_AppendNewVar( p_args->vars, "volume", volume ); mvar_AppendNewVar( p_args->vars, "stream_state", state ); mvar_AppendNewVar( p_args->vars, "charset", "UTF-8" ); /* Stats */ if( p_sys->p_input ) { /* FIXME: Workarround a stupid assert in input_GetItem */ input_item_t *p_item = p_sys->p_input && p_sys->p_input->p ? input_GetItem( p_sys->p_input ) : NULL; if( p_item ) { vlc_mutex_lock( &p_item->p_stats->lock ); #define STATS_INT( n ) sprintf( stats, "%d", p_item->p_stats->i_ ## n ); \ mvar_AppendNewVar( p_args->vars, #n, stats ); #define STATS_FLOAT( n ) sprintf( stats, "%f", p_item->p_stats->f_ ## n ); \ mvar_AppendNewVar( p_args->vars, #n, stats ); STATS_INT( read_bytes ) STATS_FLOAT( input_bitrate ) STATS_INT( demux_read_bytes ) STATS_FLOAT( demux_bitrate ) STATS_INT( decoded_video ) STATS_INT( displayed_pictures ) STATS_INT( lost_pictures ) STATS_INT( decoded_audio ) STATS_INT( played_abuffers ) STATS_INT( lost_abuffers ) STATS_INT( sent_packets ) STATS_INT( sent_bytes ) STATS_FLOAT( send_bitrate ) #undef STATS_INT #undef STATS_FLOAT vlc_mutex_unlock( &p_item->p_stats->lock ); } } SSInit( &p_args->stack ); /* allocate output */ *pi_data = i_buffer + 1000; dst = *pp_data = malloc( *pi_data ); /* we parse executing all <vlc /> macros */ Execute( p_args, p_request, i_request, pp_data, pi_data, &dst, &p_buffer[0], &p_buffer[i_buffer] ); *dst = '\0'; *pi_data = dst - *pp_data; if( p_sys->p_input != NULL ) { vlc_object_release( p_sys->p_input ); p_sys->p_input = NULL; } SSClean( &p_args->stack ); mvar_Delete( p_args->vars ); }