Summary
DirectShow Spy receives a set of new powerful updates helping to develop and troubleshoot DirectShow applications:
- UI combining Markdown formatted filter graph details as well as property pages for all participating filters
- available interactively via filter graph list
- available via helper COM class letting DirectShow application integrate incredible troubleshooting capabilities
- Option to email filter graph details
On of the next posts should be summarizing all DirectShowSpy capabilities currently split across posts.
Filter Graph Details UI
Filter graph list window received a new button Properties with the associated action duplicated on double click handler for the list item. Once clicked, a new UI pops up to bring information about the entire graph.
The window contains a tree control on the left, items of which show the following elements:
- Top “Filters” item shows Markdown formatted text, mentioned in an earlier post
- Second level items are one per each filter participating in the filter graph
- a double click of such item brings up standard
OleCreatePropertyFrame
property sheet with filter properties - an edit control to the right lists filter specific information, with connections and media types
- a double click of such item brings up standard
- Third level items are property pages of the filter, the property pages are integrated into the window; all together, the window provides access to all property pages of all filters in the graph
- Bottom first level “Email” items provides a convenient way to send the information via email
The picture below shows a property page integrated into the UI:
Email interface adds basic information about the system, and also provides space to enter a note about the graph. Email information (From, To etc) is put on registry for further reuse.
Programmatic Interface
Additionally to interactive access from filter graph list, the new UI is also accessible viaFilterGraphHelper
COM class. This lets applications integrate new capability right into the application as a troubleshooting option.
While accessing the graph through ROT using GraphStudioNext/GraphEdit application remains the most convenient interactive way to work with the graph, the helper’s advantage is access to the graph without crossing process boundaries: this, in particular, provides smooth access to property pages not implemented well for marshaling, such as, for example, Audio Renderer related property pages.
FilterGraphHelper
‘s FilterGraph
property accepts filter graph interface pointer (from now on, it is also possible to supply any filter or pin interface, and helper will walk up to the graph automatically).
IFilterGraphHelper::DoPropertyFrameModal
method shows the UI modal window introduced above.
Two samples are demonstrating programmatic access to the new helper method.
Sample\FilterGraphHelperDialog
(SVN) C# application (code snippet) shows it straightforward way: to build a graph, to initialize helper, to show modal UI:IFilterGraph2 graph = new FilterGraph() as IFilterGraph2; graph.RenderFile(@"E:\Media\GoPro 2010 Highlights - You in HD - 1920x1080.mp4", ""); FilterGraphHelper helper = new FilterGraphHelper(); helper.FilterGraph = graph; helper.DoPropertyFrameModal(0);
Sample\RegistrationFreeFilterGraphHelper
(SVN) C++ application features an advanced technique to leverage new capability in application, without need to COM-register the Spy.
Registration of the DirectShowSpy requires, generally speaking, administrative privileges. Then in addition spy hooks the system which might be not desirable.
The application however load the Spy directly using LoadLibrary
API and instantiates the helper directly bypassing COM registration. This is sufficient to start the new UI feature and access the graph interactively.
CComPtr<IFilterGraphHelper> pFilterGraphHelper;
#if TRUE
const HMODULE hModule = LoadLibrary(_T("DirectShowSpy.dll"));
[...]
ATLENSURE_SUCCEEDED(pClassFactory->CreateInstance(NULL, __uuidof(IFilterGraphHelper), (VOID**) &pFilterGraphHelper));
// TODO: FreeLibrary against hModule
#else
ATLENSURE_SUCCEEDED(pFilterGraphHelper.CoCreateInstance(__uuidof(FilterGraphHelper)));
#endif
ATLENSURE_SUCCEEDED(pFilterGraphHelper->put_FilterGraph(pFilterGraph));
ATLENSURE_SUCCEEDED(pFilterGraphHelper->DoPropertyFrameModal(0));
The alternate #if
code path shows the COM registration equivalent for the code.
Download links
- Binaries: Win32 – DirectShowSpy-Win32.dll (1.0.0.1125), x64 – DirectShowSpy-x64.dll (1.0.0.1124)
- Shortcuts to Exported Functions: Helper
.BAT
files - License: This software is free to use
- Installation Instructions: Original post