| //------------------------------------------------------------------------------ | |
| // 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 <perfstruct.h> | |
| #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_ |