Changeset 569 for trunk/DirectShowSpy


Ignore:
Timestamp:
Jan 15, 2016, 4:22:49 AM (8 years ago)
Author:
roman
Message:

Added ability to flush media sample trace data to file via command line

Location:
trunk/DirectShowSpy
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/DirectShowSpy/Common.h

    r545 r569  
    544544};
    545545
     546
     547////////////////////////////////////////////////////////////
     548// CCommandLineArguments
     549
     550class CCommandLineArguments
     551{
     552public:
     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
     584private:
     585        SIZE_T m_argc;
     586        TCHAR** m_argv;
     587        SIZE_T m_nIndex;
     588
     589public:
     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
    546634////////////////////////////////////////////////////////////
    547635// DIRECTSHOWSPY_NAMESPACE_PREFIX
  • trunk/DirectShowSpy/FilterGraphSpy.cpp

    r545 r569  
    104104}
    105105
     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
     113HRESULT 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  
    558558public:
    559559// 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        }
    560696};
    561697
     
    11571293                        m_FilterDialog.Reset();
    11581294                }
    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                 }
    11651295                static CString GetFilterGraphFriendlyName(const ITEM& Item)
    11661296                {
     
    11841314                {
    11851315                        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();
    12081317                        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));
    12661319                        return CStringA(sText);
    12671320                }
     
    15241577                                return 0;
    15251578                        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);
    15511580                        return 0;
    15521581                }
Note: See TracChangeset for help on using the changeset viewer.