{"id":1241,"date":"2011-07-17T20:22:04","date_gmt":"2011-07-17T18:22:04","guid":{"rendered":"https:\/\/alax.info\/blog\/?p=1241"},"modified":"2011-07-19T08:15:40","modified_gmt":"2011-07-19T06:15:40","slug":"using-ip-video-source-programmatically-as-a-standalone-directshow-video-source-filter-for-jpeg-and-m-jpeg-ip-cameras","status":"publish","type":"post","link":"https:\/\/alax.info\/blog\/1241","title":{"rendered":"Using IP Video Source programmatically as a standalone DirectShow Video Source Filter for JPEG and M-JPEG IP Cameras"},"content":{"rendered":"<p>Recent <a href=\"https:\/\/alax.info\/blog\/1216\">IP Video Source<\/a> class\/module is not limited to use via registration as a video input\/capture\/source device. The filter is also registered as a regular filter and can be used programmatically in a regular way: <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms686615%28VS.85%29.aspx\">CoCreateInstance<\/a>, <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd390016%28VS.85%29.aspx\">AddFilter<\/a> etc.<\/p>\n<p>A C++ code snippet below shows how to import interface definition, create an instance of the filter, set it up and start video from a camera:<\/p>\n<pre style=\"color: #000000; background: #ffffff;\"><span style=\"color: #004a43;\">#<\/span><span style=\"color: #004a43;\">include <\/span><span style=\"color: #800000;\">&lt;<\/span><span style=\"color: #40015a;\">dshow.h<\/span><span style=\"color: #800000;\">&gt;<\/span>\r\n<span style=\"color: #004a43;\">#<\/span><span style=\"color: #004a43; font-weight: bold;\">pragma <\/span><span style=\"color: #bb7977; font-weight: bold;\">comment(lib, <\/span><span style=\"color: #0000e6; font-weight: bold;\">\"strmiids.lib\"<\/span><span style=\"color: #bb7977; font-weight: bold;\">)<\/span>\r\n\r\n<span style=\"color: #004a43;\">#import <\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #0000e6;\">libid:BDCE8B49-8895-4605-8278-E9A1FBC889AC<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #004a43;\"> no_namespace raw_interfaces_only raw_dispinterfaces named_guids <\/span><span style=\"color: #696969;\">\/\/ IpVideoSource<\/span>\r\n\r\n<span style=\"color: #696969;\">\/\/ [...]<\/span>\r\n\r\n<span style=\"color: #800000; font-weight: bold;\">inline<\/span> <span style=\"color: #603000;\">VOID<\/span> ATLENSURE_INLINE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>HRESULT nResult<span style=\"color: #808030;\">)<\/span>\r\n<span style=\"color: #800080;\">{<\/span>\r\n    ATLENSURE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>nResult<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n<span style=\"color: #800080;\">}<\/span>\r\n\r\n<span style=\"color: #696969;\">\/\/ [...]<\/span>\r\n\r\nCComPtr<span style=\"color: #800080;\">&lt;<\/span>IBaseFilter<span style=\"color: #800080;\">&gt;<\/span> pBaseFilter<span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_INLINE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pBaseFilter<span style=\"color: #808030;\">.<\/span>CoCreateInstance<span style=\"color: #808030;\">(<\/span>CLSID_JpegVideoSourceFilter<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nCComQIPtr<span style=\"color: #800080;\">&lt;<\/span>IJpegVideoSourceFilter<span style=\"color: #800080;\">&gt;<\/span> pJpegVideoSourceFilter <span style=\"color: #808030;\">=<\/span> pBaseFilter<span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_THROW<span style=\"color: #808030;\">(<\/span>pJpegVideoSourceFilter<span style=\"color: #808030;\">,<\/span> E_NOINTERFACE<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_INLINE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pFilterGraph<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>AddFilter<span style=\"color: #808030;\">(<\/span>pBaseFilter<span style=\"color: #808030;\">,<\/span> <span style=\"color: #800000;\">L\"<\/span><span style=\"color: #0000e6;\">Source<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n\r\nATLENSURE_INLINE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pJpegVideoSourceFilter<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>put_Location<span style=\"color: #808030;\">(<\/span>CComBSTR<span style=\"color: #808030;\">(<\/span>_T<span style=\"color: #808030;\">(<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #0000e6;\">http:\/\/p.viewnetcam.com:60001\/nphMotionJpeg?Resolution=640x480&amp;Quality=Standard<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_INLINE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pJpegVideoSourceFilter<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>put_Width<span style=\"color: #808030;\">(<\/span><span style=\"color: #008c00;\">640<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_INLINE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pJpegVideoSourceFilter<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>put_Height<span style=\"color: #808030;\">(<\/span><span style=\"color: #008c00;\">480<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n\r\n<span style=\"color: #004a43;\">#<\/span><span style=\"color: #004a43; font-weight: bold;\">pragma <\/span><span style=\"color: #bb7977; font-weight: bold;\">region Render Output Pin<\/span>\r\nCComPtr<span style=\"color: #800080;\">&lt;<\/span>IEnumPins<span style=\"color: #800080;\">&gt;<\/span> pEnumPins<span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_INLINE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pBaseFilter<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>EnumPins<span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">&amp;<\/span>pEnumPins<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nCComPtr<span style=\"color: #800080;\">&lt;<\/span>IPin<span style=\"color: #800080;\">&gt;<\/span> pPin<span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_THROW<span style=\"color: #808030;\">(<\/span>pEnumPins<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>Next<span style=\"color: #808030;\">(<\/span><span style=\"color: #008c00;\">1<\/span><span style=\"color: #808030;\">,<\/span> <span style=\"color: #808030;\">&amp;<\/span>pPin<span style=\"color: #808030;\">,<\/span> <span style=\"color: #7d0045;\">NULL<\/span><span style=\"color: #808030;\">)<\/span> <span style=\"color: #808030;\">=<\/span><span style=\"color: #808030;\">=<\/span> S_OK<span style=\"color: #808030;\">,<\/span> E_FAIL<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nATLASSERT<span style=\"color: #808030;\">(<\/span>pPin<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_INLINE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pFilterGraph<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>Render<span style=\"color: #808030;\">(<\/span>pPin<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n<span style=\"color: #004a43;\">#<\/span><span style=\"color: #004a43; font-weight: bold;\">pragma <\/span><span style=\"color: #bb7977; font-weight: bold;\">endregion<\/span><\/pre>\n<p>This starts M-JPEG video from Panasonic BB-HCM381A camera available to public online at http:\/\/p.viewnetcam.com:60001\/nphMotionJpeg?Resolution=640&#215;480&amp;Quality=Standard<\/p>\n<p>UPDATE: ATLENSURE_SUCCEEDED macro in the snippet replaced with ATLENSURE_INLINE_SUCCEEDED &#8211; see additional post on this.<\/p>\n<p>C#.NET code snippet will look like this (using <a href=\"http:\/\/directshownet.sourceforge.net\/\">DirectShowLib<\/a>):<\/p>\n<pre style=\"color: #000000; background: #ffffff;\"><span style=\"color: #800000; font-weight: bold;\">using<\/span> DirectShowLib<span style=\"color: #800080;\">;<\/span>\r\n<span style=\"color: #800000; font-weight: bold;\">using<\/span> AlaxInfoIpVideoSource<span style=\"color: #800080;\">;<\/span>\r\n\r\n<span style=\"color: #696969;\">\/\/ [...]<\/span>\r\n\r\nFilterGraph filterGraph <span style=\"color: #808030;\">=<\/span> <span style=\"color: #800000; font-weight: bold;\">new<\/span> FilterGraph<span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nIJpegVideoSourceFilter sourceFilter <span style=\"color: #808030;\">=<\/span> Activator<span style=\"color: #808030;\">.<\/span>CreateInstance<span style=\"color: #808030;\">(<\/span>Type<span style=\"color: #808030;\">.<\/span>GetTypeFromCLSID<span style=\"color: #808030;\">(<\/span><span style=\"color: #800000; font-weight: bold;\">new<\/span> Guid<span style=\"color: #808030;\">(<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #0000e6;\">{A8DA2ECB-DEF6-414D-8CE2-E651640DBA4F}<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span> <span style=\"color: #800000; font-weight: bold;\">as<\/span> IJpegVideoSourceFilter<span style=\"color: #800080;\">;<\/span>\r\nIBaseFilter sourceBaseFilter <span style=\"color: #808030;\">=<\/span> sourceFilter <span style=\"color: #800000; font-weight: bold;\">as<\/span> IBaseFilter<span style=\"color: #800080;\">;<\/span>\r\n<span style=\"color: #808030;\">(<\/span>filterGraph <span style=\"color: #800000; font-weight: bold;\">as<\/span> IFilterGraph2<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">.<\/span>AddFilter<span style=\"color: #808030;\">(<\/span>sourceBaseFilter<span style=\"color: #808030;\">,<\/span> <span style=\"color: #800000;\">\"<\/span><span style=\"color: #0000e6;\">Source<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nsourceFilter<span style=\"color: #808030;\">.<\/span>Location <span style=\"color: #808030;\">=<\/span> @<span style=\"color: #800000;\">\"<\/span><span style=\"color: #0000e6;\">http:\/\/p.viewnetcam.com:60001\/nphMotionJpeg?Resolution=640x480&amp;Quality=Standard<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #800080;\">;<\/span>\r\nsourceFilter<span style=\"color: #808030;\">.<\/span>Width <span style=\"color: #808030;\">=<\/span> <span style=\"color: #008c00;\">640<\/span><span style=\"color: #800080;\">;<\/span>\r\nsourceFilter<span style=\"color: #808030;\">.<\/span>Height <span style=\"color: #808030;\">=<\/span> <span style=\"color: #008c00;\">480<\/span><span style=\"color: #800080;\">;<\/span>\r\nIPin pin <span style=\"color: #808030;\">=<\/span> DsFindPin<span style=\"color: #808030;\">.<\/span>ByDirection<span style=\"color: #808030;\">(<\/span>sourceBaseFilter<span style=\"color: #808030;\">,<\/span> PinDirection<span style=\"color: #808030;\">.<\/span>Output<span style=\"color: #808030;\">,<\/span> <span style=\"color: #008c00;\">0<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n<span style=\"color: #808030;\">(<\/span>filterGraph <span style=\"color: #800000; font-weight: bold;\">as<\/span> IFilterGraph2<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">.<\/span>Render<span style=\"color: #808030;\">(<\/span>pin<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n<span style=\"color: #808030;\">(<\/span>filterGraph <span style=\"color: #800000; font-weight: bold;\">as<\/span> IMediaControl<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">.<\/span>Run<span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nEventCode eventCode<span style=\"color: #800080;\">;<\/span>\r\n<span style=\"color: #808030;\">(<\/span>filterGraph <span style=\"color: #800000; font-weight: bold;\">as<\/span> IMediaEvent<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">.<\/span>WaitForCompletion<span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">-<\/span><span style=\"color: #008c00;\">1<\/span><span style=\"color: #808030;\">,<\/span> <span style=\"color: #800000; font-weight: bold;\">out<\/span> eventCode<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Recent IP Video Source class\/module is not limited to use via registration as a video input\/capture\/source device. The filter is also registered as a regular filter and can be used programmatically in a regular way: CoCreateInstance, AddFilter etc. A C++ code snippet below shows how to import interface definition, create an instance of the filter,&hellip; <\/p>\n<p><a class=\"moretag\" href=\"https:\/\/alax.info\/blog\/1241\">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":[38,82,75,158,351,137,486],"class_list":["post-1241","post","type-post","status-publish","format-standard","hentry","category-utilities","tag-c","tag-camera","tag-jpeg","tag-m-jpeg","tag-panasonic","tag-sample","tag-video"],"_links":{"self":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/1241","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=1241"}],"version-history":[{"count":0,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/1241\/revisions"}],"wp:attachment":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/media?parent=1241"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/categories?post=1241"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/tags?post=1241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}