//------------------------------------------------------------------------------ // File: DXMPerf.h // // Desc: Macros for DirectShow performance logging. // // Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ #ifndef _DXMPERF_H_ #define _DXMPERF_H_ #include #include "perflog.h" #ifdef _IA64_ extern "C" unsigned __int64 __getReg( int whichReg ); #pragma intrinsic(__getReg) #endif // _IA64_ inline ULONGLONG _RDTSC( void ) { #ifdef _X86_ LARGE_INTEGER li; __asm { _emit 0x0F _emit 0x31 mov li.LowPart,eax mov li.HighPart,edx } return li.QuadPart; #if 0 // This isn't tested yet #elif defined (_IA64_) #define INL_REGID_APITC 3116 return __getReg( INL_REGID_APITC ); #endif // 0 #else // unsupported platform // not implemented on non x86/IA64 platforms return 0; #endif // _X86_/_IA64_ } #define DXMPERF_VIDEOREND 0x00000001 #define DXMPERF_AUDIOGLITCH 0x00000002 //#define GETTIME_BIT 0x00000001 //#define AUDIOREND_BIT 0x00000004 //#define FRAMEDROP_BIT 0x00000008 #define AUDIOBREAK_BIT 0x00000010 #define DXMPERF_AUDIORECV 0x00000020 #define DXMPERF_AUDIOSLAVE 0x00000040 #define DXMPERF_AUDIOBREAK 0x00000080 #define PERFLOG_CTOR( name, iface ) #define PERFLOG_DTOR( name, iface ) #define PERFLOG_DELIVER( name, source, dest, sample, pmt ) #define PERFLOG_RECEIVE( name, source, dest, sample, pmt ) #define PERFLOG_RUN( name, iface, time, oldstate ) #define PERFLOG_PAUSE( name, iface, oldstate ) #define PERFLOG_STOP( name, iface, oldstate ) #define PERFLOG_JOINGRAPH( name, iface, graph ) #define PERFLOG_GETBUFFER( allocator, sample ) #define PERFLOG_RELBUFFER( allocator, sample ) #define PERFLOG_CONNECT( connector, connectee, status, pmt ) #define PERFLOG_RXCONNECT( connector, connectee, status, pmt ) #define PERFLOG_DISCONNECT( disconnector, disconnectee, status ) #define PERFLOG_GETTIME( clock, time ) /*{ \ PERFINFO_WMI_GETTIME perfData; \ if (NULL != g_pTraceEvent) { \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_GETTIME; \ perfData.data.cycleCounter = _RDTSC(); \ perfData.data.dshowClock = (ULONGLONG) (time); \ if (g_perfMasks[GETTIME_INDEX] & GETTIME_BIT) \ (*g_pTraceEvent)( g_traceHandle, (PEVENT_TRACE_HEADER) &perfData ); \ } \ }*/ #define PERFLOG_AUDIOREND( clocktime, sampletime, psample, bytetime, cbytes ) /*{ \ PERFINFO_WMI_AVREND perfData; \ if (NULL != g_pTraceEvent) { \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_AUDIOREND; \ perfData.data.cycleCounter = _RDTSC(); \ perfData.data.dshowClock = (clocktime); \ perfData.data.sampleTime = (sampletime); \ if (g_perfMasks[AUDIOREND_INDEX] & AUDIOREND_BIT) \ (*g_pTraceEvent)( g_traceHandle, (PEVENT_TRACE_HEADER) &perfData ); \ } \ }*/ #define PERFLOG_AUDIORECV(StreamTime,SampleStart,SampleStop,Discontinuity,Duration) \ if (PerflogEnableFlags & DXMPERF_AUDIORECV) { \ PERFINFO_WMI_AUDIORECV perfData; \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_AUDIORECV; \ perfData.data.streamTime = StreamTime; \ perfData.data.sampleStart = SampleStart; \ perfData.data.sampleStop = SampleStop; \ perfData.data.discontinuity = Discontinuity; \ perfData.data.hwduration = Duration; \ PerflogTraceEvent((PEVENT_TRACE_HEADER) &perfData); \ } #define PERFLOG_AUDIOSLAVE(MasterClock,SlaveClock,ErrorAccum,LastHighErrorSeen,LastLowErrorSeen) \ if (PerflogEnableFlags & DXMPERF_AUDIOSLAVE) { \ PERFINFO_WMI_AUDIOSLAVE perfData; \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_AUDIOSLAVE; \ perfData.data.masterClock = MasterClock; \ perfData.data.slaveClock = SlaveClock; \ perfData.data.errorAccum = ErrorAccum; \ perfData.data.lastHighErrorSeen = LastHighErrorSeen;\ perfData.data.lastLowErrorSeen = LastLowErrorSeen; \ PerflogTraceEvent((PEVENT_TRACE_HEADER) &perfData); \ } #define PERFLOG_AUDIOADDBREAK(IterNextWrite,OffsetNextWrite,IterWrite,OffsetWrite) \ if (PerflogEnableFlags & DXMPERF_AUDIOBREAK) { \ PERFINFO_WMI_AUDIOADDBREAK perfData; \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_AUDIOADDBREAK; \ perfData.data.iterNextWrite = IterNextWrite; \ perfData.data.offsetNextWrite = OffsetNextWrite; \ perfData.data.iterWrite = IterWrite; \ perfData.data.offsetWrite = OffsetWrite; \ PerflogTraceEvent((PEVENT_TRACE_HEADER) &perfData); \ } #define PERFLOG_VIDEOREND( sampletime, clocktime, psample ) \ if (PerflogEnableFlags & DXMPERF_VIDEOREND) { \ PERFINFO_WMI_AVREND perfData; \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_VIDEOREND; \ perfData.data.cycleCounter = _RDTSC(); \ perfData.data.dshowClock = (clocktime); \ perfData.data.sampleTime = (sampletime); \ PerflogTraceEvent ((PEVENT_TRACE_HEADER) &perfData); \ } #define PERFLOG_AUDIOGLITCH( instance, glitchtype, currenttime, previoustime ) \ if (PerflogEnableFlags & DXMPERF_AUDIOGLITCH) { \ PERFINFO_WMI_AUDIOGLITCH perfData; \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_DSOUNDGLITCH; \ perfData.data.cycleCounter = _RDTSC(); \ perfData.data.glitchType = (glitchtype); \ perfData.data.sampleTime = (currenttime); \ perfData.data.previousTime = (previoustime); \ perfData.data.instanceId = (instance); \ PerflogTraceEvent ((PEVENT_TRACE_HEADER) &perfData); \ } #define PERFLOG_FRAMEDROP( sampletime, clocktime, psample, renderer ) /*{ \ PERFINFO_WMI_FRAMEDROP perfData; \ if (NULL != g_pTraceEvent) { \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_FRAMEDROP; \ perfData.data.cycleCounter = _RDTSC(); \ perfData.data.dshowClock = (clocktime); \ perfData.data.frameTime = (sampletime); \ if (g_perfMasks[FRAMEDROP_INDEX] & FRAMEDROP_BIT) \ (*g_pTraceEvent)( g_traceHandle, (PEVENT_TRACE_HEADER) &perfData ); \ } \ }*/ /* #define PERFLOG_AUDIOBREAK( nextwrite, writepos, msecs ) { \ PERFINFO_WMI_AUDIOBREAK perfData; \ if (NULL != g_pTraceEvent) { \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_AUDIOBREAK; \ perfData.data.cycleCounter = _RDTSC(); \ perfData.data.dshowClock = (writepos); \ perfData.data.sampleTime = (nextwrite); \ perfData.data.sampleDuration = (msecs); \ if (g_perfMasks[AUDIOBREAK_INDEX] & AUDIOBREAK_BIT) \ (*g_pTraceEvent)( g_traceHandle, (PEVENT_TRACE_HEADER) &perfData ); \ } \ } */ #define PERFLOG_AUDIOBREAK( nextwrite, writepos, msecs ) \ if (PerflogEnableFlags & AUDIOBREAK_BIT) { \ PERFINFO_WMI_AUDIOBREAK perfData; \ memset( &perfData, 0, sizeof( perfData ) ); \ perfData.header.Size = sizeof( perfData ); \ perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ perfData.header.Guid = GUID_AUDIOBREAK; \ perfData.data.cycleCounter = _RDTSC(); \ perfData.data.dshowClock = (writepos); \ perfData.data.sampleTime = (nextwrite); \ perfData.data.sampleDuration = (msecs); \ PerflogTraceEvent ((PEVENT_TRACE_HEADER) &perfData); \ } \ inline VOID PERFLOG_STREAMTRACE( ULONG Level, ULONG Id, ULONGLONG DShowClock, ULONGLONG Data1, ULONGLONG Data2, ULONGLONG Data3, ULONGLONG Data4 ) { if (Level <= PerflogModuleLevel) { PERFINFO_WMI_STREAMTRACE perfData; memset( &perfData, 0, sizeof( perfData ) ); perfData.header.Size = sizeof( perfData ); perfData.header.Flags = WNODE_FLAG_TRACED_GUID; perfData.header.Guid = GUID_STREAMTRACE; perfData.data.dshowClock = DShowClock; perfData.data.id = Id; perfData.data.data[0] = Data1; perfData.data.data[1] = Data2; perfData.data.data[2] = Data3; perfData.data.data[3] = Data4; PerflogTraceEvent((PEVENT_TRACE_HEADER) &perfData); } } #endif // _DXMPERF_H_