{"id":1460,"date":"2013-07-08T22:30:32","date_gmt":"2013-07-08T20:30:32","guid":{"rendered":"https:\/\/alax.info\/blog\/?p=1460"},"modified":"2013-07-08T23:18:56","modified_gmt":"2013-07-08T21:18:56","slug":"directshow-spy-human-friendly-filter-graph-information-and-filter-graph-list","status":"publish","type":"post","link":"https:\/\/alax.info\/blog\/1460","title":{"rendered":"DirectShow Spy: Human Friendly Filter Graph Information and Filter Graph List"},"content":{"rendered":"<p>A typical task for DirectShow Spy is to get installed onto, make the target application filter graphs available for inspection and&#8230; then get inspected with some additional tool. The last step assumes there is an additional application ready to pick the graphs and an interactive user attaches to the graphs for visual inspection and troubleshooting.<\/p>\n<p>There are great tools to access DirectShow filter graphs via Running Object Table, <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/dd407274%28v=vs.85%29.aspx\">GraphEdit<\/a>, <a href=\"http:\/\/blog.monogram.sk\/janos\/tools\/monogram-graphstudio\/\">GraphStudio<\/a> and <a href=\"http:\/\/code.google.com\/p\/graph-studio-next\/\">GraphStudioNext<\/a> &#8211; to name a few. However quite so often the task in question is to simply grab information about the filter graph topology and take it away. DirectShow Spy now offers this capability:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2013\/07\/Image007.png\" alt=\"ROT Filter Graphs\" width=\"618\" height=\"418\" class=\"alignnone size-full wp-image-1461\" srcset=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2013\/07\/Image007.png 618w, https:\/\/alax.info\/blog\/wp-content\/uploads\/2013\/07\/Image007-320x216.png 320w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><\/p>\n<p>The property sheet lists the available ROT filter graphs in a developer-friendly way:<\/p>\n<ul>\n<li>sorted in reverse chronological order to easily pick the one of interest<\/li>\n<li><em>Check<\/em> button updates filter count and state of the selected graphs<\/li>\n<li><em>Copy<\/em> button puts a user friendly filter graph description onto clipboard, for one or several selected filter graphs:\n<ul>\n<li>information is formatted using <a href=\"http:\/\/en.wikipedia.org\/wiki\/Markdown\">Markdown<\/a> formatting (both readable as raw text and even better via HTML conversion; a sample filter graph information is shown below)<\/li>\n<li>the text mentions graph state, filters, connections and media types<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Clipboard integration makes it really easy to pass the information through remote access applications.<\/p>\n<p>More to that, the &#8220;graph to text&#8221; conversion is available programmatically. C# code snippet (full C# project is <a href=\"https:\/\/www.alax.info\/trac\/public\/browser\/trunk\/DirectShowSpy\/Sample\/FilterGraphText\">here<\/a>) as simple as the following makes Markdown filter graph information available to the application for logging or otherwise troubleshooting purposes:<\/p>\n<pre><code>[STAThread]\nstatic void Main(string[] args)\n{\n    IFilterGraph2 graph = new FilterGraph() as IFilterGraph2;\n    graph.RenderFile(@\"E:\\Media\\GoPro 2010 Highlights - You in HD - 1920x1080.mp4\", \"\");\n    FilterGraphHelper helper = new FilterGraphHelper();\n    helper.FilterGraph = graph;\n    Console.WriteLine(helper.Text);\n}\n<\/code><\/pre>\n<p>The new UI is available through exported function <code>DoFilterGraphListPropertySheetModal<\/code>.<\/p>\n<p><!-- more --><\/p>\n<h4>Download links<\/h4>\n<ul>\n<li>Binaries: Win32 \u00e2\u20ac\u201c <a href=\"https:\/\/www.alax.info\/svn\/public\/trunk\/DirectShowSpy\/_Bin\/DirectShowSpy-Win32.dll\">DirectShowSpy-Win32.dll<\/a> (1.0.0.974), x64 &#8211; <a href=\"https:\/\/www.alax.info\/svn\/public\/trunk\/DirectShowSpy\/_Bin\/DirectShowSpy-x64.dll\">DirectShowSpy-x64.dll<\/a> (1.0.0.973)<\/li>\n<li>Shortcuts to Exported Functions: <a href=\"https:\/\/www.alax.info\/svn\/public\/trunk\/DirectShowSpy\/_Bin\/\">Helper <code>.BAT<\/code> files<\/a><\/li>\n<li>License: This software is free to use<\/li>\n<li>Installation Instructions: <a href=\"https:\/\/alax.info\/blog\/777\">Original post<\/a><\/li>\n<\/ul>\n<hr \/>\n<p>An example of filter graph description is shown below:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2013\/07\/Image0081.png\" alt=\"Sample Markdown Output\" width=\"975\" height=\"687\" class=\"alignnone size-full wp-image-1464\" srcset=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2013\/07\/Image0081.png 975w, https:\/\/alax.info\/blog\/wp-content\/uploads\/2013\/07\/Image0081-320x225.png 320w, https:\/\/alax.info\/blog\/wp-content\/uploads\/2013\/07\/Image0081-800x563.png 800w\" sizes=\"auto, (max-width: 975px) 100vw, 975px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A typical task for DirectShow Spy is to get installed onto, make the target application filter graphs available for inspection and&#8230; then get inspected with some additional tool. The last step assumes there is an additional application ready to pick the graphs and an interactive user attaches to the graphs for visual inspection and troubleshooting.&hellip; <\/p>\n<p><a class=\"moretag\" href=\"https:\/\/alax.info\/blog\/1460\">Read the full article<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[95,78,446],"class_list":["post-1460","post","type-post","status-publish","format-standard","hentry","category-utilities","tag-com","tag-directshow","tag-directshowspy"],"_links":{"self":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/1460","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/comments?post=1460"}],"version-history":[{"count":0,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/1460\/revisions"}],"wp:attachment":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/media?parent=1460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/categories?post=1460"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/tags?post=1460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}