Changeset 569
- Timestamp:
- Jan 15, 2016, 4:22:49 AM (7 years ago)
- Location:
- trunk/DirectShowSpy
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/DirectShowSpy/Common.h
r545 r569 544 544 }; 545 545 546 547 //////////////////////////////////////////////////////////// 548 // CCommandLineArguments 549 550 class CCommandLineArguments 551 { 552 public: 553 554 //////////////////////////////////////////////////////// 555 // CArgument 556 557 class CArgument 558 { 559 public: 560 BOOL m_bSwitch; 561 CString m_sSwitchName; 562 CString m_sSwitchValue; 563 BOOL m_bIntegerSwitchValueAvailable; 564 INT m_nIntegerSwitchValue; 565 CString m_sValue; 566 567 public: 568 // CArgument 569 CArgument() : 570 m_bSwitch(FALSE), 571 m_bIntegerSwitchValueAvailable(FALSE) 572 { 573 } 574 VOID Initialize() 575 { 576 m_bSwitch = FALSE; 577 m_sSwitchName.Empty();; 578 m_sSwitchValue.Empty();; 579 m_bIntegerSwitchValueAvailable = FALSE; 580 m_sValue.Empty(); 581 } 582 }; 583 584 private: 585 SIZE_T m_argc; 586 TCHAR** m_argv; 587 SIZE_T m_nIndex; 588 589 public: 590 // CCommandLineArguments 591 CCommandLineArguments(SIZE_T argc, TCHAR* argv[]) : 592 m_argc(argc), 593 m_argv(argv), 594 m_nIndex(1) 595 { 596 } 597 CCommandLineArguments(LPCWSTR pszCommandLine, SIZE_T nIndex = 1) : 598 m_nIndex(nIndex) 599 { 600 INT nArgumentCount = 0; 601 LPWSTR* pszArguments = CommandLineToArgvW(pszCommandLine, &nArgumentCount); 602 m_argc = nArgumentCount; 603 m_argv = pszArguments; 604 } 605 BOOL Next(CArgument& Argument) 606 { 607 if(m_nIndex >= m_argc) 608 return FALSE; 609 CString sArgument = m_argv[m_nIndex++]; 610 _A(!sArgument.IsEmpty()); 611 Argument.Initialize(); 612 if(_tcschr(_T("-/"), sArgument[0])) 613 { 614 Argument.m_bSwitch = TRUE; 615 sArgument.Delete(0); 616 const INT nSeparatorPosition = sArgument.Find(_T(':')); 617 if(nSeparatorPosition > 0) 618 { 619 Argument.m_sSwitchName = sArgument.Left(nSeparatorPosition); 620 Argument.m_sSwitchValue = sArgument.Mid(nSeparatorPosition + 1); 621 if(!Argument.m_sSwitchValue.IsEmpty()) 622 Argument.m_bIntegerSwitchValueAvailable = AtlStringToInteger(Argument.m_sSwitchValue, Argument.m_nIntegerSwitchValue); 623 } else 624 Argument.m_sSwitchName = sArgument; 625 return TRUE; 626 } 627 if(sArgument.GetLength() >= 2 && sArgument[0] == _T('"') && sArgument[sArgument.GetLength() - 1] == _T('"')) 628 sArgument = sArgument.Mid(1, sArgument.GetLength() - 2); 629 Argument.m_sValue = sArgument; 630 return TRUE; 631 } 632 }; 633 546 634 //////////////////////////////////////////////////////////// 547 635 // DIRECTSHOWSPY_NAMESPACE_PREFIX -
trunk/DirectShowSpy/FilterGraphSpy.cpp
r545 r569 104 104 } 105 105 106 #if defined(_WIN64) 107 extern "C" __declspec(dllexport) 108 #else 109 #pragma comment(linker, "/EXPORT:DoMediaSampleTraceTasks=_DoMediaSampleTraceTasks@16,PRIVATE") 110 extern "C" // __declspec(dllexport) 111 #endif // defined(_WIN64) 112 113 HRESULT STDMETHODCALLTYPE DoMediaSampleTraceTasks(HWND hParentWindow, HINSTANCE, LPSTR pszCommandLine, INT nShowCommand) 114 { 115 _ATLTRY 116 { 117 CSingleThreadedApartment SingleThreadedApartment; 118 hParentWindow; nShowCommand; 119 CCommandLineArguments Arguments((LPCWSTR) CStringW(pszCommandLine), 0); 120 for(; ; ) 121 { 122 CCommandLineArguments::CArgument Argument; 123 if(!Arguments.Next(Argument)) 124 break; 125 __D(!Argument.m_bSwitch, E_INVALIDARG); 126 if(Argument.m_sValue.CompareNoCase(_T("reset")) == 0) 127 { 128 CMediaSampleTraceBase::ResetData(); 129 } else 130 if(Argument.m_sValue.CompareNoCase(_T("write")) == 0) 131 { 132 CCommandLineArguments::CArgument PathArgument; 133 __D(Arguments.Next(PathArgument), E_INVALIDARG); 134 __D(!PathArgument.m_bSwitch, E_INVALIDARG); 135 CMediaSampleTraceBase::SaveToFile(CMediaSampleTraceBase::CreateDataText(), (LPCTSTR) PathArgument.m_sValue); 136 } else 137 __C(E_INVALIDARG); 138 } 139 } 140 _ATLCATCH(Exception) 141 { 142 _C(Exception); 143 } 144 return S_OK; 145 } 146 -
trunk/DirectShowSpy/MediaSampleTrace.h
r460 r569 558 558 public: 559 559 // CMediaSampleTraceBase 560 static BOOL ResetData() 561 { 562 CPages Pages; 563 if(!Pages.Initialize()) 564 return FALSE; 565 Pages.ResetData(); 566 return TRUE; 567 } 568 static CString FormatTime(UINT64 nTime) 569 { 570 SYSTEMTIME Time; 571 FileTimeToSystemTime(&reinterpret_cast<const FILETIME&>(nTime), &Time); 572 return AtlFormatString(_T("%02d:%02d:%02d.%03d"), Time.wHour, Time.wMinute, Time.wSecond, Time.wMilliseconds); 573 } 574 static CString CreateDataItemHeaderText() 575 { 576 LPCTSTR g_ppszHeader[] = 577 { 578 _T("Time"), 579 _T("Process Identifier"), 580 _T("Thread Identifier"), 581 _T("Filter Graph Identifier"), 582 _T("Filter Graph Name"), 583 _T("Filter Identifier"), 584 _T("Filter Name"), 585 _T("Stream"), 586 _T("Type"), 587 _T("Media Sample Flags"), 588 _T("Start Time"), 589 _T("Stop Time"), 590 _T("Length Time"), 591 _T("Data Size"), 592 _T("Comment"), 593 _T("Highlight"), 594 }; 595 return _StringHelper::Join(g_ppszHeader, _T("\t")) + _T("\r\n"); 596 } 597 static CString CreateDataItemText(const CData::CItem& Item) 598 { 599 CRoArrayT<CString> Array; 600 Array.Add(FormatTime(Item.m_PageItem.nTime)); 601 Array.Add(AtlFormatString(_T("%d"), Item.m_Item.nProcessIdentifier)); 602 Array.Add(AtlFormatString(_T("%d"), Item.m_PageItem.nThreadIdentifier)); 603 Array.Add(AtlFormatString(_T("0x%p"), Item.m_Item.nFilterGraphIdentifier)); 604 Array.Add(CString(Item.m_Item.pszFilterGraphName)); 605 Array.Add(AtlFormatString(_T("0x%p"), Item.m_PageItem.nFilterIdentifier)); 606 Array.Add(CString(Item.m_PageItem.pszFilterName)); 607 Array.Add(CString(Item.m_PageItem.pszStreamName)); 608 Array.Add(Item.FormatType()); 609 switch(Item.m_PageItem.nFlags & PAGEITEMFLAG_TYPE_MASK) 610 { 611 case PAGEITEMFLAG_NEWSEGMENT: 612 Array.Add(_T("")); 613 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.NewSegment.nStartTime)); 614 if(Item.m_PageItem.Data.NewSegment.nStopTime < LLONG_MAX) 615 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.NewSegment.nStopTime)); 616 //Item.m_PageItem.Data.NewSegment.fRate 617 break; 618 case PAGEITEMFLAG_MEDIASAMPLE: 619 Array.Add(_FilterGraphHelper::FormatSampleFlags(Item.m_PageItem.Data.MediaSample.Properties.dwSampleFlags)); 620 if(Item.m_PageItem.Data.MediaSample.Properties.dwSampleFlags & AM_SAMPLE_TIMEVALID) 621 { 622 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.MediaSample.Properties.tStart)); 623 if(Item.m_PageItem.Data.MediaSample.Properties.dwSampleFlags & AM_SAMPLE_STOPVALID) 624 { 625 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.MediaSample.Properties.tStop)); 626 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.MediaSample.Properties.tStop - Item.m_PageItem.Data.MediaSample.Properties.tStart)); 627 } 628 } 629 while(Array.GetCount() < 13) 630 Array.Add(_T("")); 631 Array.Add(AtlFormatString(_T("%d"), Item.m_PageItem.Data.MediaSample.Properties.lActual)); 632 break; 633 case PAGEITEMFLAG_ENDOFSTREAM: 634 case PAGEITEMFLAG_COMMENT: 635 break; 636 default: 637 _A(FALSE); 638 } 639 if(*Item.m_PageItem.pszComment) 640 { 641 while(Array.GetCount() < 14) 642 Array.Add(_T("")); 643 Array.Add(CString(Item.m_PageItem.pszComment)); 644 } 645 if(Item.m_nHighlightIndex) 646 { 647 while(Array.GetCount() < 15) 648 Array.Add(_T("")); 649 Array.Add(AtlFormatString(_T("*%d"), Item.m_nHighlightIndex)); 650 } 651 return _StringHelper::Join(Array, _T("\t")) + _T("\r\n"); 652 } 653 static CStringA CreateDataText() 654 { 655 CString sText; 656 CPages Pages; 657 if(Pages.Initialize()) 658 { 659 CData Data; 660 CHandleMap HandleMap; 661 Pages.GetData(Data, &HandleMap); 662 Data.Sort(); 663 sText += CreateDataItemHeaderText(); 664 for(auto&& Item: Data.m_ItemArray) 665 sText += CreateDataItemText(Item); 666 } 667 return CStringA(sText); 668 } 669 static VOID SaveToFile(const CStringA sText, const CPath& sPath) 670 { 671 LPCTSTR pszExtension = FindExtension(sPath); 672 CAtlFile File; 673 __C(File.Create(sPath, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS)); 674 _ATLTRY 675 { 676 if(_tcsicmp(pszExtension, _T(".bz2")) == 0) 677 { 678 CLocalObjectPtr<CBzip2Item> pItem; 679 pItem->SetRawData((const BYTE*) (LPCSTR) sText, sText.GetLength()); 680 CHeapPtr<BYTE> pnData; 681 SIZE_T nDataSize; 682 pItem->GetData(pnData, nDataSize); 683 __C(File.Write(pnData, (DWORD) nDataSize)); 684 } else 685 { 686 __C(File.Write(sText, sText.GetLength() * sizeof (CHAR))); 687 } 688 } 689 _ATLCATCHALL() 690 { 691 File.Close(); 692 DeleteFile(sPath); 693 _ATLRETHROW; 694 } 695 } 560 696 }; 561 697 … … 1157 1293 m_FilterDialog.Reset(); 1158 1294 } 1159 static CString FormatTime(UINT64 nTime)1160 {1161 SYSTEMTIME Time;1162 FileTimeToSystemTime(&reinterpret_cast<const FILETIME&>(nTime), &Time);1163 return AtlFormatString(_T("%02d:%02d:%02d.%03d"), Time.wHour, Time.wMinute, Time.wSecond, Time.wMilliseconds);1164 }1165 1295 static CString GetFilterGraphFriendlyName(const ITEM& Item) 1166 1296 { … … 1184 1314 { 1185 1315 CString sText; 1186 #pragma region Header 1187 LPCTSTR g_ppszHeader[] = 1188 { 1189 _T("Time"), 1190 _T("Process Identifier"), 1191 _T("Thread Identifier"), 1192 _T("Filter Graph Identifier"), 1193 _T("Filter Graph Name"), 1194 _T("Filter Identifier"), 1195 _T("Filter Name"), 1196 _T("Stream"), 1197 _T("Type"), 1198 _T("Media Sample Flags"), 1199 _T("Start Time"), 1200 _T("Stop Time"), 1201 _T("Length Time"), 1202 _T("Data Size"), 1203 _T("Comment"), 1204 _T("Highlight"), 1205 }; 1206 sText += _StringHelper::Join(g_ppszHeader, _T("\t")) + _T("\r\n"); 1207 #pragma endregion 1316 sText += CreateDataItemHeaderText(); 1208 1317 for(INT nItem = 0; nItem < m_ListView.GetItemCount(); nItem++) 1209 { 1210 const CData::CItem& Item = m_ListView.GetItemData(nItem); 1211 CRoArrayT<CString> Array; 1212 Array.Add(FormatTime(Item.m_PageItem.nTime)); 1213 Array.Add(AtlFormatString(_T("%d"), Item.m_Item.nProcessIdentifier)); 1214 Array.Add(AtlFormatString(_T("%d"), Item.m_PageItem.nThreadIdentifier)); 1215 Array.Add(AtlFormatString(_T("0x%p"), Item.m_Item.nFilterGraphIdentifier)); 1216 Array.Add(CString(Item.m_Item.pszFilterGraphName)); 1217 Array.Add(AtlFormatString(_T("0x%p"), Item.m_PageItem.nFilterIdentifier)); 1218 Array.Add(CString(Item.m_PageItem.pszFilterName)); 1219 Array.Add(CString(Item.m_PageItem.pszStreamName)); 1220 Array.Add(Item.FormatType()); 1221 switch(Item.m_PageItem.nFlags & PAGEITEMFLAG_TYPE_MASK) 1222 { 1223 case PAGEITEMFLAG_NEWSEGMENT: 1224 Array.Add(_T("")); 1225 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.NewSegment.nStartTime)); 1226 if(Item.m_PageItem.Data.NewSegment.nStopTime < LLONG_MAX) 1227 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.NewSegment.nStopTime)); 1228 //Item.m_PageItem.Data.NewSegment.fRate 1229 break; 1230 case PAGEITEMFLAG_MEDIASAMPLE: 1231 Array.Add(_FilterGraphHelper::FormatSampleFlags(Item.m_PageItem.Data.MediaSample.Properties.dwSampleFlags)); 1232 if(Item.m_PageItem.Data.MediaSample.Properties.dwSampleFlags & AM_SAMPLE_TIMEVALID) 1233 { 1234 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.MediaSample.Properties.tStart)); 1235 if(Item.m_PageItem.Data.MediaSample.Properties.dwSampleFlags & AM_SAMPLE_STOPVALID) 1236 { 1237 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.MediaSample.Properties.tStop)); 1238 Array.Add(AtlFormatString(_T("%I64d"), Item.m_PageItem.Data.MediaSample.Properties.tStop - Item.m_PageItem.Data.MediaSample.Properties.tStart)); 1239 } 1240 } 1241 while(Array.GetCount() < 13) 1242 Array.Add(_T("")); 1243 Array.Add(AtlFormatString(_T("%d"), Item.m_PageItem.Data.MediaSample.Properties.lActual)); 1244 break; 1245 case PAGEITEMFLAG_ENDOFSTREAM: 1246 case PAGEITEMFLAG_COMMENT: 1247 break; 1248 default: 1249 _A(FALSE); 1250 } 1251 if(*Item.m_PageItem.pszComment) 1252 { 1253 while(Array.GetCount() < 14) 1254 Array.Add(_T("")); 1255 Array.Add(CString(Item.m_PageItem.pszComment)); 1256 } 1257 if(Item.m_nHighlightIndex) 1258 { 1259 while(Array.GetCount() < 15) 1260 Array.Add(_T("")); 1261 Array.Add(AtlFormatString(_T("*%d"), Item.m_nHighlightIndex)); 1262 } 1263 sText += _StringHelper::Join(Array, _T("\t")); 1264 sText += _T("\r\n"); 1265 } 1318 sText += CreateDataItemText(m_ListView.GetItemData(nItem)); 1266 1319 return CStringA(sText); 1267 1320 } … … 1524 1577 return 0; 1525 1578 CWaitCursor WaitCursor; 1526 const CStringA sText = CreateText(); 1527 LPCTSTR pszExtension = FindExtension(sPath); 1528 CAtlFile File; 1529 __C(File.Create(sPath, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS)); 1530 _ATLTRY 1531 { 1532 if(_tcsicmp(pszExtension, _T(".bz2")) == 0) 1533 { 1534 CLocalObjectPtr<CBzip2Item> pItem; 1535 pItem->SetRawData((const BYTE*) (LPCSTR) sText, sText.GetLength()); 1536 CHeapPtr<BYTE> pnData; 1537 SIZE_T nDataSize; 1538 pItem->GetData(pnData, nDataSize); 1539 __C(File.Write(pnData, (DWORD) nDataSize)); 1540 } else 1541 { 1542 __C(File.Write(sText, sText.GetLength() * sizeof (CHAR))); 1543 } 1544 } 1545 _ATLCATCHALL() 1546 { 1547 File.Close(); 1548 DeleteFile(sPath); 1549 _ATLRETHROW; 1550 } 1579 SaveToFile(CreateText(), sPath); 1551 1580 return 0; 1552 1581 }
Note: See TracChangeset
for help on using the changeset viewer.