Ignore:
Timestamp:
Sep 2, 2014, 7:00:58 AM (8 years ago)
Author:
roman
Message:

Added memory allocator buffer inspection capability

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/DirectShowSpy/FilterGraphHelper.h

    r319 r322  
    520520                                pMessage;
    521521                                return E_NOTIMPL;
     522                        }
     523                };
     524
     525                ////////////////////////////////////////////////////
     526                // CMemoryAllocatorDialog
     527
     528                class CMemoryAllocatorDialog :
     529                        public CDialogImpl<CMemoryAllocatorDialog>,
     530                        public CDialogResize<CMemoryAllocatorDialog>
     531                {
     532                public:
     533                        enum { IDD = IDD_FILTERGRAPHHELPER_MEMORYALLOCATOR };
     534
     535                BEGIN_MSG_MAP_EX(CMemoryAllocatorDialog)
     536                        //CHAIN_MSG_MAP(CDialogImpl<CMemoryAllocatorDialog>)
     537                        CHAIN_MSG_MAP(CDialogResize<CMemoryAllocatorDialog>)
     538                        MSG_WM_INITDIALOG(OnInitDialog)
     539                        MSG_LVN_GETDISPINFO(IDC_FILTERGRAPHHELPER_MEMORYALLOCATOR_LIST, OnListViewGetDispInfo)
     540                        MSG_LVN_GETINFOTIP(IDC_FILTERGRAPHHELPER_MEMORYALLOCATOR_LIST, OnListViewGetInfoTip)
     541                        COMMAND_ID_HANDLER_EX(IDC_FILTERGRAPHHELPER_MEMORYALLOCATOR_REFRESH, OnRefresh)
     542                        REFLECT_NOTIFICATIONS()
     543                END_MSG_MAP()
     544
     545                BEGIN_DLGRESIZE_MAP(CMemoryAllocatorDialog)
     546                        DLGRESIZE_CONTROL(IDC_FILTERGRAPHHELPER_MEMORYALLOCATOR_LIST, DLSZ_SIZE_X | DLSZ_SIZE_Y)
     547                        DLGRESIZE_CONTROL(IDC_FILTERGRAPHHELPER_MEMORYALLOCATOR_REFRESH, DLSZ_MOVE_Y)
     548                END_DLGRESIZE_MAP()
     549
     550                public:
     551
     552                        ////////////////////////////////////////////////
     553                        // CMemoryAllocatorData
     554
     555                        class CMemoryAllocatorData
     556                        {
     557                        public:
     558                                LONG_PTR m_nIdentifier;
     559                                CString m_sNames;
     560                                HRESULT m_nMemAllocatorResult;
     561                                LONG m_nBufferCount;
     562                                LONG m_nBufferSize;
     563                                LONG m_nBufferAlign;
     564                                LONG m_nBufferPrefix;
     565                                HRESULT m_nMemAllocatorCallbackTempResult;
     566                                LONG m_nFreeBufferCount;
     567
     568                        public:
     569                        // CMemoryAllocatorData
     570                                VOID Initialize(CRoArrayT<CComVariantArray>& Array)
     571                                {
     572                                        SIZE_T nIndex = 0;
     573                                        __D(nIndex + 2 + 1 + 1 <= Array.GetCount(), E_UNNAMED);
     574                                        m_nIdentifier = Array[nIndex++].GetAsType(VT_I4).lVal;
     575                                        m_sNames = Array[nIndex++].GetAsType(VT_BSTR).bstrVal;
     576                                        m_nMemAllocatorResult = Array[nIndex++].GetAsType(VT_I4).lVal;
     577                                        if(SUCCEEDED(m_nMemAllocatorResult))
     578                                        {
     579                                                __D(nIndex + 4 <= Array.GetCount(), E_UNNAMED);
     580                                                m_nBufferCount = Array[nIndex++].GetAsType(VT_I4).lVal;
     581                                                m_nBufferSize = Array[nIndex++].GetAsType(VT_I4).lVal;
     582                                                m_nBufferAlign = Array[nIndex++].GetAsType(VT_I4).lVal;
     583                                                m_nBufferPrefix = Array[nIndex++].GetAsType(VT_I4).lVal;
     584                                        }
     585                                        m_nMemAllocatorCallbackTempResult = Array[nIndex++].GetAsType(VT_I4).lVal;
     586                                        if(SUCCEEDED(m_nMemAllocatorCallbackTempResult))
     587                                        {
     588                                                __D(nIndex + 1 <= Array.GetCount(), E_UNNAMED);
     589                                                m_nFreeBufferCount = Array[nIndex++].GetAsType(VT_I4).lVal;
     590                                        }
     591                                }
     592                        };
     593
     594                private:
     595                        CPropertyFrameDialog* m_pOwner;
     596                        BOOL m_bActivating;
     597                        CStatic m_TitleStatic;
     598                        CFont m_TitleFont;
     599                        CRoListViewT<CMemoryAllocatorData, CRoListControlDataTraitsT> m_ListView;
     600                        CButton m_RefreshButton;
     601                        CRoMapT<INT_PTR, BOOL> m_ChangeMap;
     602
     603                public:
     604                // CMemoryAllocatorDialog
     605                        VOID UpdateListView()
     606                        {
     607                                CWindowRedraw ListViewRedraw(m_ListView);
     608                                CRoArrayT<INT> ValidItemArray;
     609                                _ATLTRY
     610                                {
     611                                        const CComQIPtr<IFilterGraphMemoryAllocatorData> pFilterGraphMemoryAllocatorData = m_pOwner->m_Owner.m_pFilterGraph;
     612                                        if(pFilterGraphMemoryAllocatorData)
     613                                        {
     614                                                CComVariantArray vValue;
     615                                                __C(pFilterGraphMemoryAllocatorData->get_Value(&vValue));
     616                                                if(vValue.vt > VT_NULL)
     617                                                {
     618                                                        CRoArrayT<CComVariantArray> ItemArray;
     619                                                        vValue.ToElementArray(ItemArray);
     620                                                        for(auto&& vItemValue: ItemArray)
     621                                                        {
     622                                                                CRoArrayT<CComVariantArray> ItemItemArray;
     623                                                                vItemValue.ToElementArray(ItemItemArray);
     624                                                                // SUGG: Reuse existing list view items instead of full list replacement
     625                                                                CMemoryAllocatorData Data;
     626                                                                Data.Initialize(ItemItemArray);
     627                                                                const INT nItem = m_ListView.InsertItem(m_ListView.GetItemCount(), Data);
     628                                                                ValidItemArray.Add(nItem);
     629                                                        }
     630                                                }
     631                                        }
     632                                }
     633                                _ATLCATCHALL()
     634                                {
     635                                        m_ListView.DeleteAllItems();
     636                                        ValidItemArray.RemoveAll();
     637                                        _ATLRETHROW;
     638                                }
     639                                for(INT nItem = m_ListView.GetItemCount() - 1; nItem >= 0; nItem--)
     640                                        if(!ValidItemArray.FindFirst(nItem))
     641                                                m_ListView.DeleteItem(nItem);
     642                        }
     643
     644                // Window Message Handler
     645                        LRESULT OnInitDialog(HWND, LPARAM lParam)
     646                        {
     647                                m_pOwner = (CPropertyFrameDialog*) lParam;
     648                                m_bActivating = TRUE;
     649                                _ATLTRY
     650                                {
     651                                        CWaitCursor WaitCursor;
     652                                        m_TitleStatic = GetDlgItem(IDC_FILTERGRAPHHELPER_MEMORYALLOCATOR_TITLE);
     653                                        CreateTitleFont(m_TitleFont, m_TitleStatic);
     654                                        m_ListView.Initialize(GetDlgItem(IDC_FILTERGRAPHHELPER_MEMORYALLOCATOR_LIST));
     655                                        m_RefreshButton = GetDlgItem(IDC_FILTERGRAPHHELPER_MEMORYALLOCATOR_REFRESH);
     656                                        DlgResize_Init(FALSE, FALSE);
     657                                        _ATLTRY
     658                                        {
     659                                                UpdateListView();
     660                                        }
     661                                        _ATLCATCHALL()
     662                                        {
     663                                                _Z_EXCEPTION();
     664                                        }
     665                                        m_bActivating = FALSE;
     666                                }
     667                                _ATLCATCH(Exception)
     668                                {
     669                                        for(CWindow Window = GetWindow(GW_CHILD); Window; Window = Window.GetWindow(GW_HWNDNEXT))
     670                                                Window.EnableWindow(FALSE);
     671                                        AtlExceptionMessageBox(m_hWnd, Exception);
     672                                }
     673                                return TRUE;
     674                        }
     675                        LRESULT OnListViewGetDispInfo(NMLVDISPINFO* pHeader)
     676                        {
     677                                const CMemoryAllocatorData& Data = m_ListView.DataFromParameter(pHeader->item.lParam);
     678                                if(pHeader->item.mask & LVIF_TEXT)
     679                                {
     680                                        CString& sTextBuffer = m_ListView.GetTextBufferString(TRUE);
     681                                        switch(pHeader->item.iSubItem)
     682                                        {
     683                                        case 1: // Buffer Count
     684                                                if(SUCCEEDED(Data.m_nMemAllocatorResult))
     685                                                        sTextBuffer = _StringHelper::FormatNumber(Data.m_nBufferCount);
     686                                                break;
     687                                        case 2: // Free Buffer Count
     688                                                if(SUCCEEDED(Data.m_nMemAllocatorCallbackTempResult))
     689                                                        sTextBuffer = _StringHelper::FormatNumber(Data.m_nFreeBufferCount);
     690                                                break;
     691                                        case 3: // Buffer Size
     692                                                if(SUCCEEDED(Data.m_nMemAllocatorResult))
     693                                                        sTextBuffer = _StringHelper::FormatNumber(Data.m_nBufferSize);
     694                                                break;
     695                                        default: // Name
     696                                                sTextBuffer = Data.m_sNames;
     697                                        }
     698                                        pHeader->item.pszText = m_ListView.GetTextBuffer();
     699                                }
     700                                return 0;
     701                        }
     702                        LRESULT OnListViewGetInfoTip(NMLVGETINFOTIP* pHeader)
     703                        {
     704                                const CMemoryAllocatorData& Data = m_ListView.GetItemData(pHeader->iItem);
     705                                CString& sTextBuffer = m_ListView.GetTextBufferString(TRUE);
     706                                //sTextBuffer.AppendFormat(_T("Identifier: 0x%08X") _T("\r\n"), Data.m_nIdentifier);
     707                                if(SUCCEEDED(Data.m_nMemAllocatorResult))
     708                                {
     709                                        sTextBuffer.AppendFormat(_T("Buffer Count: %s") _T("\r\n"), _StringHelper::FormatNumber(Data.m_nBufferCount));
     710                                        sTextBuffer.AppendFormat(_T("Buffer Size: %s (%s total)") _T("\r\n"), _StringHelper::FormatNumber(Data.m_nBufferSize), _StringHelper::FormatNumber(Data.m_nBufferCount * Data.m_nBufferSize));
     711                                        if(Data.m_nBufferAlign > 1)
     712                                                sTextBuffer.AppendFormat(_T("Buffer Alignment: %s") _T("\r\n"), _StringHelper::FormatNumber(Data.m_nBufferAlign));
     713                                        if(Data.m_nBufferPrefix > 0)
     714                                                sTextBuffer.AppendFormat(_T("Buffer Prefix: %s") _T("\r\n"), _StringHelper::FormatNumber(Data.m_nBufferPrefix));
     715                                } else
     716                                        sTextBuffer.AppendFormat(_T("IMemAllocator: %s") _T("\r\n"), Ds::FormatResult(Data.m_nMemAllocatorResult, _T("Error 0x%08X")));
     717                                if(SUCCEEDED(Data.m_nMemAllocatorCallbackTempResult))
     718                                {
     719                                        sTextBuffer.AppendFormat(_T("Free Buffer Count: %s") _T("\r\n"), _StringHelper::FormatNumber(Data.m_nFreeBufferCount));
     720                                } else
     721                                        sTextBuffer.AppendFormat(_T("IMemAllocatorCallbackTemp: %s") _T("\r\n"), Ds::FormatResult(Data.m_nMemAllocatorCallbackTempResult, _T("Error 0x%08X")));
     722                                CString sNames = Data.m_sNames;
     723                                sNames.Replace(_T(", "), _T("|"));
     724                                CRoArrayT<CString> Array;
     725                                _StringHelper::Split(sNames, _T('|'), Array);
     726                                if(!Array.IsEmpty())
     727                                {
     728                                        sTextBuffer.Append(_T("\r\n") _T("Pin Connections:") _T("\r\n"));
     729                                        for(auto&& sName: Array)
     730                                        {
     731                                                sTextBuffer.AppendFormat(_T("  ") _T("%s") _T("\r\n"), sName);
     732                                        }
     733                                }
     734                                sTextBuffer.TrimRight(_T("\t\n\r ."));
     735                                #pragma region Clipboard Copy
     736                                if(GetKeyState(VK_CONTROL) < 0 && GetKeyState(VK_SHIFT) < 0)
     737                                        _ATLTRY
     738                                        {
     739                                                SetClipboardText(m_hWnd, sTextBuffer);
     740                                                MessageBeep(MB_OK);
     741                                        }
     742                                        _ATLCATCHALL()
     743                                        {
     744                                                _Z_EXCEPTION();
     745                                                MessageBeep(MB_ICONERROR);
     746                                        }
     747                                #pragma endregion
     748                                _tcsncpy_s(pHeader->pszText, pHeader->cchTextMax, m_ListView.GetTextBuffer(), _TRUNCATE);
     749                                return 0;
     750                        }
     751                        LRESULT OnRefresh(UINT, INT, HWND)
     752                        {
     753                                UpdateListView();
     754                                return 0;
    522755                        }
    523756                };
     
    14631696                                TYPE_FILTER,
    14641697                                TYPE_FILTERPROPERTYPAGE,
     1698                                TYPE_MEMORYALLOCATOR,
    14651699                                TYPE_ACTION,
    14661700                                TYPE_EMAIL,
     
    15401774                CRoTreeViewT<CData, CRoListControlDataTraitsT> m_TreeView;
    15411775                CTreeItem m_FiltersItem;
     1776                CTreeItem m_MemoryAllocatorItem;
    15421777                CTreeItem m_ActionItem;
    15431778                CTreeItem m_EmailItem;
     
    15511786                CButton m_ApplyButton;
    15521787                CObjectPtr<CPropertyPageSite> m_pCurrentSite;
     1788                CMemoryAllocatorDialog m_MemoryAllocatorDialog;
    15531789                CActionDialog m_ActionDialog;
    15541790                CEmailDialog m_EmailDialog;
     
    16411877                        m_FiltersItem.m_pTreeView = &m_TreeView;
    16421878                        #pragma endregion
    1643                         CTreeItem ActionItem = m_TreeView.InsertItem(NULL, FiltersItem, CData(CData::TYPE_ACTION), _T("Action"));
     1879                        CTreeItem MemoryAllocatorItem = m_TreeView.InsertItem(NULL, FiltersItem, CData(CData::TYPE_MEMORYALLOCATOR), _T("Memory Allocators"));
     1880                        m_MemoryAllocatorItem.m_hTreeItem = MemoryAllocatorItem;
     1881                        m_MemoryAllocatorItem.m_pTreeView = &m_TreeView;
     1882                        CTreeItem ActionItem = m_TreeView.InsertItem(NULL, MemoryAllocatorItem, CData(CData::TYPE_ACTION), _T("Action"));
    16441883                        m_ActionItem.m_hTreeItem = ActionItem;
    16451884                        m_ActionItem.m_pTreeView = &m_TreeView;
     
    16841923                        if(m_pCurrentSite && m_pCurrentSite->m_pPropertyPage)
    16851924                                _V(m_pCurrentSite->m_pPropertyPage->Move(Position));
     1925                        _W(m_MemoryAllocatorDialog.SetWindowPos(NULL, Position, SWP_NOZORDER | SWP_NOACTIVATE));
    16861926                        _W(m_ActionDialog.SetWindowPos(NULL, Position, SWP_NOZORDER | SWP_NOACTIVATE));
    16871927                        _W(m_EmailDialog.SetWindowPos(NULL, Position, SWP_NOZORDER | SWP_NOACTIVATE));
     
    17311971                                m_CancelButton = GetDlgItem(IDCANCEL);
    17321972                                m_ApplyButton = GetDlgItem(IDC_FILTERGRAPHHELPER_PROPERTYFRAME_APPLY);
     1973                                __E(m_MemoryAllocatorDialog.Create(m_hWnd, (LPARAM) this));
    17331974                                __E(m_ActionDialog.Create(m_hWnd, (LPARAM) this));
    17341975                                __E(m_EmailDialog.Create(m_hWnd, (LPARAM) this));
     
    18202061                        {
    18212062                                CData& Data = m_TreeView.GetItemData(TreeItem);
     2063                                if(Data.m_Type != CData::TYPE_MEMORYALLOCATOR)
     2064                                        m_MemoryAllocatorDialog.ShowWindow(SW_HIDE);
    18222065                                if(Data.m_Type != CData::TYPE_ACTION)
    18232066                                        m_ActionDialog.ShowWindow(SW_HIDE);
     
    19432186                                        switch(Data.m_Type)
    19442187                                        {
     2188                                        #pragma region TYPE_MEMORYALLOCATOR
     2189                                        case CData::TYPE_MEMORYALLOCATOR:
     2190                                                m_TextEdit.ShowWindow(SW_HIDE);
     2191                                                _W(m_MemoryAllocatorDialog.SetWindowPos(NULL, GetTextEditPosition(), SWP_NOZORDER | SWP_SHOWWINDOW));
     2192                                                break;
     2193                                        #pragma endregion
    19452194                                        #pragma region TYPE_ACTION
    19462195                                        case CData::TYPE_ACTION:
     
    19642213                                                m_TextEdit.ShowWindow(SW_SHOW);
    19652214                                                m_TextEdit.SetValue(m_Owner.GetText());
     2215                                                m_MemoryAllocatorDialog.ShowWindow(SW_HIDE);
    19662216                                                m_ActionDialog.ShowWindow(SW_HIDE);
    19672217                                                m_EmailDialog.ShowWindow(SW_HIDE);
     
    19742224                                HideCurrentSite();
    19752225                                m_TextEdit.ShowWindow(SW_HIDE);
     2226                                m_MemoryAllocatorDialog.ShowWindow(SW_HIDE);
    19762227                                m_ActionDialog.ShowWindow(SW_HIDE);
    19772228                                m_EmailDialog.ShowWindow(SW_HIDE);
Note: See TracChangeset for help on using the changeset viewer.