windows-nt/Source/XPSP1/NT/enduser/netmeeting/av/nac/counters.cpp
2020-09-26 16:20:57 +08:00

145 lines
6.2 KiB
C++

// COUNTERS.CPP
//
// Global performance counters for the nac
//
// Created 13-Nov-96 [JonT]
#include "precomp.h"
// Global ICounterMgr. We just use as an CLSID_Counter class factory
ICounterMgr* g_pCtrMgr;
// Define all counters here
ICounter* g_pctrVideoSend;
ICounter* g_pctrVideoReceive;
ICounter* g_pctrVideoSendBytes;
ICounter* g_pctrVideoReceiveBytes;
ICounter* g_pctrVideoSendLost;
ICounter* g_pctrVideoCPUuse;
ICounter* g_pctrVideoBWuse;
ICounter* g_pctrAudioSendBytes;
ICounter* g_pctrAudioReceiveBytes;
ICounter* g_pctrAudioSendLost;
ICounter* g_pctrAudioJBDelay;
// Define all reports here
IReport* g_prptCallParameters;
IReport* g_prptSystemSettings;
// Put these in a .LIB file someday
const IID IID_ICounterMgr = {0x9CB7FE5B,0x3444,0x11D0,{0xB1,0x43,0x00,0xC0,0x4F,0xC2,0xA1,0x18}};
const CLSID CLSID_CounterMgr = {0x65DDC229,0x38FE,0x11d0,{0xB1,0x43,0x00,0xC0,0x4F,0xC2,0xA1,0x18}};
// InitCountersAndReports
// Initializes all counters and reports that we want to use
extern "C" BOOL WINAPI InitCountersAndReports(void)
{
// Get a pointer to the statistics counter interface if it's around
if (CoCreateInstance(CLSID_CounterMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICounterMgr, (void**)&g_pCtrMgr) != S_OK)
return FALSE;
// Create counters here
DEFINE_COUNTER(&g_pctrVideoSend, "Video Send Frames Per Second", COUNTER_FLAG_ACCUMULATE);
DEFINE_COUNTER(&g_pctrVideoReceive, "Video Receive Frames Per Second", COUNTER_FLAG_ACCUMULATE);
DEFINE_COUNTER(&g_pctrVideoSendBytes, "Video Send Bits Per Second", COUNTER_FLAG_ACCUMULATE);
DEFINE_COUNTER(&g_pctrVideoReceiveBytes, "Video Receive Bits Per Second", COUNTER_FLAG_ACCUMULATE);
DEFINE_COUNTER(&g_pctrAudioSendBytes, "Audio Send Bits Per Second", COUNTER_FLAG_ACCUMULATE);
DEFINE_COUNTER(&g_pctrAudioReceiveBytes, "Audio Receive Bits Per Second", COUNTER_FLAG_ACCUMULATE);
DEFINE_COUNTER(&g_pctrAudioSendLost, "Audio Send Packets Lost", 0);
DEFINE_COUNTER(&g_pctrVideoSendLost, "Video Send Packets Lost", 0);
DEFINE_COUNTER(&g_pctrAudioJBDelay, "Audio Jitter Buffer Delay", 0);
DEFINE_COUNTER(&g_pctrVideoCPUuse, "Video CPU use calculation", COUNTER_CLEAR);
DEFINE_COUNTER(&g_pctrVideoBWuse, "Video Bit rate calculation", COUNTER_CLEAR);
// Create reports here
DEFINE_REPORT(&g_prptCallParameters, "Call Parameters", 0);
DEFINE_REPORT(&g_prptSystemSettings, "System Settings", 0);
// Create call parameters report entries here
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Audio Send Format", REP_SEND_AUDIO_FORMAT);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Audio Send Sampling Rate (Hz)", REP_SEND_AUDIO_SAMPLING);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Audio Send Bitrate (w/o network overhead - bps)", REP_SEND_AUDIO_BITRATE);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Audio Send Packetization (ms / packet)", REP_SEND_AUDIO_PACKET);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Audio Recv Format", REP_RECV_AUDIO_FORMAT);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Audio Recv Sampling Rate (Hz)", REP_RECV_AUDIO_SAMPLING);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Audio Recv Bitrate (w/o network overhead - bps)", REP_RECV_AUDIO_BITRATE);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Audio Recv Packetization (ms / packet)", REP_RECV_AUDIO_PACKET);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Video Send Format", REP_SEND_VIDEO_FORMAT);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Video Send Max Frame Rate (negotiated - fps)", REP_SEND_VIDEO_MAXFPS);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Video Send Max Bitrate (negotiated - bps)", REP_SEND_VIDEO_BITRATE);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Video Recv Format", REP_RECV_VIDEO_FORMAT);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Video Recv Max Frame Rate (negotiated - fps)", REP_RECV_VIDEO_MAXFPS);
DEFINE_REPORT_ENTRY(g_prptCallParameters, "Video Recv Max Bitrate (negotiated - bps)", REP_RECV_VIDEO_BITRATE);
// Create system settings report entries here
DEFINE_REPORT_ENTRY(g_prptSystemSettings, "Bandwidth (user setting)", REP_SYS_BANDWIDTH);
DEFINE_REPORT_ENTRY(g_prptSystemSettings, "Audio Subsystem", REP_SYS_AUDIO_DSOUND);
DEFINE_REPORT_ENTRY(g_prptSystemSettings, "Audio Record", REP_SYS_AUDIO_RECORD);
DEFINE_REPORT_ENTRY(g_prptSystemSettings, "Audio Playback", REP_SYS_AUDIO_PLAYBACK);
DEFINE_REPORT_ENTRY(g_prptSystemSettings, "Audio Duplex Type", REP_SYS_AUDIO_DUPLEX);
DEFINE_REPORT_ENTRY(g_prptSystemSettings, "Capture", REP_SYS_VIDEO_DEVICE);
DEFINE_REPORT_ENTRY(g_prptSystemSettings, "Device Image Size", REP_DEVICE_IMAGE_SIZE);
// Provide defaults for some entries
UPDATE_REPORT_ENTRY(g_prptSystemSettings, 4, REP_SYS_BANDWIDTH);
UPDATE_REPORT_ENTRY(g_prptSystemSettings, 0, REP_SYS_AUDIO_DSOUND);
UPDATE_REPORT_ENTRY(g_prptSystemSettings, 0, REP_SYS_AUDIO_RECORD);
UPDATE_REPORT_ENTRY(g_prptSystemSettings, 0, REP_SYS_AUDIO_PLAYBACK);
UPDATE_REPORT_ENTRY(g_prptSystemSettings, 0, REP_SYS_VIDEO_DEVICE);
UPDATE_REPORT_ENTRY(g_prptSystemSettings, 0, REP_DEVICE_IMAGE_SIZE);
UPDATE_COUNTER(g_pctrAudioJBDelay, 0);
UPDATE_COUNTER(g_pctrAudioSendLost,0);
UPDATE_COUNTER(g_pctrVideoSendLost,0);
INIT_COUNTER_MAX(g_pctrAudioJBDelay, 500); // jitter delay above 500ms is bad
return TRUE;
}
// DoneCountersAndReports
// Cleans up after all counters and reports we wanted to use
extern "C" void WINAPI DoneCountersAndReports(void)
{
ICounterMgr* pctrmgr;
// Release the statistics stuff if it's around
if (!g_pCtrMgr)
return;
// Zero out the interface pointer so we don't accidentally use it elsewhere
pctrmgr = g_pCtrMgr;
g_pCtrMgr = NULL;
// Remove counters here
DELETE_COUNTER(&g_pctrVideoSend);
DELETE_COUNTER(&g_pctrVideoReceive);
DELETE_COUNTER(&g_pctrVideoSendBytes);
DELETE_COUNTER(&g_pctrVideoReceiveBytes);
DELETE_COUNTER(&g_pctrVideoSendLost);
DELETE_COUNTER(&g_pctrAudioSendBytes);
DELETE_COUNTER(&g_pctrAudioReceiveBytes);
DELETE_COUNTER(&g_pctrAudioSendLost);
DELETE_COUNTER(&g_pctrVideoCPUuse);
DELETE_COUNTER(&g_pctrVideoBWuse);
DELETE_COUNTER(&g_pctrAudioJBDelay);
// Remove reports here
DELETE_REPORT(&g_prptCallParameters);
DELETE_REPORT(&g_prptSystemSettings);
// Done with ICounterMgr
pctrmgr->Release();
}