{"id":893,"date":"2009-04-01T09:48:45","date_gmt":"2009-04-01T07:48:45","guid":{"rendered":"https:\/\/alax.info\/blog\/?p=893"},"modified":"2009-04-01T15:21:24","modified_gmt":"2009-04-01T13:21:24","slug":"yv12-extended-video-renderer-strides-private-dmo-and-more","status":"publish","type":"post","link":"https:\/\/alax.info\/blog\/893","title":{"rendered":"YV12, Extended Video Renderer Strides, Private DMO and more"},"content":{"rendered":"<p>Recently it was the time to sort out an issue with a video <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd375512(VS.85).aspx\">DMO<\/a>, which outputs <a href=\"http:\/\/fourcc.org\/yuv.php#YV12\">YV12<\/a> video and in the same time is capable of supporting <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd388799(VS.85).aspx\">extended video strides<\/a> in order to efficiently make a direct connection to <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd407343(VS.85).aspx\">Video Mixing Renderer Filters<\/a>.<\/p>\n<p>From past experience, I already knew that some bugs are definitely involved but their effect was yet unexplored. For a testbed application, I took good old <a href=\"https:\/\/alax.info\/blog\/551\">FrameRateSample02<\/a> application, which generates multiple video feeds and routes it to video renderers:<\/p>\n<p><a href=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image001.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-894\" title=\"FrameRateSample02 Application with New Choices\" src=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image001.png\" alt=\"FrameRateSample02 Application with New Choices\" width=\"539\" height=\"317\" srcset=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image001.png 539w, https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image001-300x176.png 300w\" sizes=\"auto, (max-width: 539px) 100vw, 539px\" \/><\/a><\/p>\n<p>With new source video choices the application is capable of constructing filter graphs that use a private DMO (that is hosted inside the executable) wrapped with <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd375519(VS.85).aspx\">DMO Wrapper Filter<\/a>, with a graph topology shown below:<\/p>\n<p><a href=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image002.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-895\" title=\"Filter Graph with a Private DMO\" src=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image002-300x172.png\" alt=\"Filter Graph with a Private DMO\" width=\"300\" height=\"172\" srcset=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image002-300x172.png 300w, https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image002.png 659w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><!--more-->The DMO does not do any processing, except support for extended strides while copying original data into buffer streamed to video renderer. Extended strides for a planar YUV format is a bit tricky. Are they supported at all? Yes, they are and video renderer might still request an extended stride and in which case origial MxN video needs to be copied into (M+P)xN buffer. Unlike packed pixel format, unused space is distributed in a bit different way but still very much similarly: output buffer is still a regular  (M+P)xN rectangle, where the effective picture of size MxN should be copied into top left corner.<\/p>\n<p>The problem I was aware of from past experience showed up immediately once the filters connected. After a dynamic format change initiated by the VMR, the filters report different connection media types. <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd375519(VS.85).aspx\">DMO Wrapper Filter<\/a> still shows original connection time connection media type, while <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd407343(VS.85).aspx\">Video Mixing Renderer Filter<\/a> shows media type it switched to.<\/p>\n<p><a href=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image003.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-896\" title=\"Media Type Mismatch\" src=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image003-300x241.png\" alt=\"Media Type Mismatch\" width=\"300\" height=\"241\" srcset=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image003-300x241.png 300w, https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image003.png 956w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>This looks like <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd375519(VS.85).aspx\">DMO Wrapper Filter<\/a> bug, but was yet to check if it still handles the new media type properly and passes the format change to the underlying DMO object. Taking into consideration the extent DMOs are used by <a href=\"http:\/\/microsoft.com\">Microsoft<\/a>, it had to, thought I never met this in the <a href=\"http:\/\/msdn.microsoft.com\">MSDN<\/a> documentation.<\/p>\n<p>Further debugging revealed that <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd375519(VS.85).aspx\">DMO Wrapper Filter<\/a> does handle the media type change and forward it to the DMO through <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd406963(VS.85).aspx\">IMediaObject::SetOutputType<\/a> method. This happens when DMO already received its first input, and immediately before following <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd406960(VS.85).aspx\">IMediaObject::ProcessOutput<\/a> method call:<\/p>\n<pre>rodmo.h(293) : CMediaObjectT&lt;class CVideoDmo&gt;::AllocateStreamingResources: ...\r\nrodshow.h(2716) : CBaseFilterT&lt;class CMainDialog::CSourceFilter&gt;::Pause: ...\r\nrodshow.h(2722) : CBaseFilterT&lt;class CMainDialog::CSourceFilter&gt;::Pause: m_State 0\r\nrodshow.h(2730) : CBaseFilterT&lt;class CMainDialog::CSourceFilter&gt;::Pause: m_State 1\r\nrodshow.h(2784) : CBaseFilterT&lt;class CMainDialog::CSourceFilter&gt;::GetState: nTimeout 0\r\nrodmo.h(679) : CSimpleMediaObjectT&lt;class CVideoDmo,1&gt;::GetInputStatus: nInputStreamIndex 0\r\n<span style=\"color: #ff0000;\"><strong>rodmo.h(702) : CSimpleMediaObjectT&lt;class CVideoDmo,1&gt;::ProcessInput: nInputStreamIndex 0, nFlags 0x1\r\nrodmo.h(527) : CSimpleMediaObjectT&lt;class CVideoDmo,1&gt;::SetOutputType: nOutputStreamIndex 0, nFlags 0x0<\/strong>\r\n<\/span>rodmo.h(727) : CSimpleMediaObjectT&lt;class CVideoDmo,1&gt;::ProcessOutput: nFlags 0x1, nOutputBufferCount 1<\/pre>\n<p>So, the media type change is handled and the problem is only limited to reporting wrong (original) media type off the wrapper filter output pin.<\/p>\n<p>Investigation of filter connection however brought up another interesting fact, memory allocator properties:<\/p>\n<p><a href=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image004.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-897\" title=\"Memory Allocator Properties\" src=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image004-300x241.png\" alt=\"Memory Allocator Properties\" width=\"300\" height=\"241\" srcset=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image004-300x241.png 300w, https:\/\/alax.info\/blog\/wp-content\/uploads\/2009\/04\/01-image004.png 956w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>As the filters switched to a new media type, with extended strides, the memory allocator should obviously have been updated accordingly, in order to support larger buffer. However current <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd373419(VS.85).aspx\">memory allocator properties<\/a> indicate old buffer size of 460,800 bytes, while new media type assumes 737,280 buffer size at the very least. The samples are however streamed fine, so the issue is also limited to incorrectly reported size.<\/p>\n<p>This memory allocator is managed by the <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd407343(VS.85).aspx\">Video Mixing Renderer Filter<\/a>, so the problem seems to be relating to it.<\/p>\n<p>Good news however was that video was streamed and displayed correctly.<\/p>\n<p>One thing that deserves special attention is making a DMO private. I <a href=\"https:\/\/alax.info\/blog\/674\">already wrote another post on private DMOs<\/a> some time ago, and this time the sample shows even a better way in case one does not need the DMO available for <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd390342(VS.85).aspx\">Intelligent Connect<\/a> (in which case <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd375491.aspx\">DMORegister<\/a> call along with administrative privileges will be required),\u00a0 just for a private instantiation. DMO is typically created by <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms686615.aspx\">CoCreateInstance<\/a> from inside the <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd375519(VS.85).aspx\">DMO Wrapper Filter<\/a>, e.g. using <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd406849(VS.85).aspx\">IDMOWrapperFilter::Init<\/a> method, so it is necessary to either register COM class, or&#8230; just register its class object for the process using <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms693407.aspx\">CoRegisterClassObject<\/a>.<\/p>\n<p>There is no need for direct usage of API since ATL already wrapped the calls and we are to take advantage of what is already available. First of all, the DMO class requires certain CLSID, because we don&#8217;t have one typically declared in IDL. A good place for attaching CLSID is class declaration and <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dabb5z75.aspx\">__declspec keyword<\/a>:<\/p>\n<pre><span style=\"color: #800000; font-weight: bold;\">class<\/span> <span style=\"color: #800000; font-weight: bold;\">__declspec<\/span><span style=\"color: #808030;\">(<\/span>uuid<span style=\"color: #808030;\">(<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #0000e6;\">88B976BE-EEE6-45b1-A21B-42A941DF8819<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span> ATL_NO_VTABLE CVideoDmo <span style=\"color: #800080;\">:<\/span>\r\n    <span style=\"color: #800000; font-weight: bold;\">public<\/span> CComObjectRootEx<span style=\"color: #800080;\">&lt;<\/span>CComMultiThreadModelNoCS<span style=\"color: #800080;\">&gt;<\/span><span style=\"color: #808030;\">,<\/span>\r\n    <span style=\"color: #800000; font-weight: bold;\">public<\/span> CComCoClass<span style=\"color: #800080;\">&lt;<\/span>CVideoDmo<span style=\"color: #800080;\">&gt;<\/span><span style=\"color: #808030;\">,<\/span>\r\n    <span style=\"color: #800000; font-weight: bold;\">public<\/span> CSimpleMediaObjectT<span style=\"color: #800080;\">&lt;<\/span>CVideoDmo<span style=\"color: #808030;\">,<\/span> <span style=\"color: #008c00;\">1<\/span><span style=\"color: #800080;\">&gt;<\/span>\r\n<span style=\"color: #800080;\">{<\/span><\/pre>\n<p>Further a COM class is typically referenced into module&#8217;s object map byan <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/exx3wywe.aspx\">OBJECT_ENTRY_AUTO<\/a> macro:<\/p>\n<pre><span class=\"Comment\"><span class=\"Comment\">\/\/<\/span>OBJECT_ENTRY_AUTO(__uuidof(VideoDmo), CVideoDmo<\/span>)<\/pre>\n<p>But we don&#8217;t need this this time as we don&#8217;t need standard COM registration for the class. We will register its class object manually and temporarily, at the time of DMO initialization:<\/p>\n<pre>CComQIPtr<span style=\"color: #800080;\">&lt;<\/span>IBaseFilter<span style=\"color: #800080;\">&gt;<\/span> pBaseFilter<span style=\"color: #800080;\">;<\/span>\r\nCVideoDmo<span style=\"color: #808030;\">*<\/span> pVideoDmo<span style=\"color: #800080;\">;<\/span>\r\n<span style=\"color: #800080;\">{<\/span>\r\n    BEGIN_OBJECT_MAP<span style=\"color: #808030;\">(<\/span>g_pObjectMap<span style=\"color: #808030;\">)<\/span>\r\n        OBJECT_ENTRY<span style=\"color: #808030;\">(<\/span><span style=\"color: #800000; font-weight: bold;\">__uuidof<\/span><span style=\"color: #808030;\">(<\/span>CVideoDmo<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">,<\/span> CVideoDmo<span style=\"color: #808030;\">)<\/span>\r\n    END_OBJECT_MAP<span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">)<\/span>\r\n    ATLASSERT<span style=\"color: #808030;\">(<\/span>DIM<span style=\"color: #808030;\">(<\/span>g_pObjectMap<span style=\"color: #808030;\">)<\/span> <span style=\"color: #808030;\">=<\/span><span style=\"color: #808030;\">=<\/span> <span style=\"color: #008c00;\">2<\/span> <span style=\"color: #808030;\">&amp;<\/span><span style=\"color: #808030;\">&amp;<\/span> <span style=\"color: #808030;\">!<\/span>g_pObjectMap<span style=\"color: #808030;\">[<\/span><span style=\"color: #008c00;\">1<\/span><span style=\"color: #808030;\">]<\/span><span style=\"color: #808030;\">.<\/span>pclsid<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n    ATLENSURE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>g_pObjectMap<span style=\"color: #808030;\">[<\/span><span style=\"color: #008c00;\">0<\/span><span style=\"color: #808030;\">]<\/span><span style=\"color: #808030;\">.<\/span>RegisterClassObject<span style=\"color: #808030;\">(<\/span>CLSCTX_INPROC_SERVER<span style=\"color: #808030;\">,<\/span> REGCLS_SINGLEUSE<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n    _ATLTRY\r\n    <span style=\"color: #800080;\">{<\/span>\r\n        CComPtr<span style=\"color: #800080;\">&lt;<\/span>IDMOWrapperFilter<span style=\"color: #800080;\">&gt;<\/span> pDmoWrapperFilter <span style=\"color: #808030;\">=<\/span> ConstructDmoWrappedFilter<span style=\"color: #808030;\">(<\/span><span style=\"color: #800000; font-weight: bold;\">__uuidof<\/span><span style=\"color: #808030;\">(<\/span>CVideoDmo<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">,<\/span> CVideoDmo<span style=\"color: #800080;\">::<\/span>GetCategory<span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n        pBaseFilter <span style=\"color: #808030;\">=<\/span> pDmoWrapperFilter<span style=\"color: #800080;\">;<\/span>\r\n        ATLENSURE_THROW<span style=\"color: #808030;\">(<\/span>pBaseFilter<span style=\"color: #808030;\">,<\/span> E_NOINTERFACE<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n        CComQIPtr<span style=\"color: #800080;\">&lt;<\/span>IMediaObject<span style=\"color: #800080;\">&gt;<\/span> pMediaObject <span style=\"color: #808030;\">=<\/span> pDmoWrapperFilter<span style=\"color: #800080;\">;<\/span>\r\n        ATLENSURE_THROW<span style=\"color: #808030;\">(<\/span>pMediaObject<span style=\"color: #808030;\">,<\/span> E_NOINTERFACE<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n        pVideoDmo <span style=\"color: #808030;\">=<\/span> <span style=\"color: #800000; font-weight: bold;\">static_cast<\/span><span style=\"color: #800080;\">&lt;<\/span>CVideoDmo<span style=\"color: #808030;\">*<\/span><span style=\"color: #800080;\">&gt;<\/span><span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">(<\/span>IMediaObject<span style=\"color: #808030;\">*<\/span><span style=\"color: #808030;\">)<\/span> pMediaObject<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n    <span style=\"color: #800080;\">}<\/span>\r\n    _ATLCATCHALL<span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">)<\/span>\r\n    <span style=\"color: #800080;\">{<\/span>\r\n        ATLVERIFY<span style=\"color: #808030;\">(<\/span>SUCCEEDED<span style=\"color: #808030;\">(<\/span>g_pObjectMap<span style=\"color: #808030;\">[<\/span><span style=\"color: #008c00;\">0<\/span><span style=\"color: #808030;\">]<\/span><span style=\"color: #808030;\">.<\/span>RevokeClassObject<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\n        _ATLRETHROW<span style=\"color: #800080;\">;<\/span>\r\n    <span style=\"color: #800080;\">}<\/span>\r\n    ATLVERIFY<span style=\"color: #808030;\">(<\/span>SUCCEEDED<span style=\"color: #808030;\">(<\/span>g_pObjectMap<span style=\"color: #808030;\">[<\/span><span style=\"color: #008c00;\">0<\/span><span style=\"color: #808030;\">]<\/span><span style=\"color: #808030;\">.<\/span>RevokeClassObject<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\n<span style=\"color: #800080;\">}<\/span>\r\npVideoDmo<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>Initialize<span style=\"color: #808030;\">(<\/span>CDmoMediaType<span style=\"color: #808030;\">(<\/span>m_pMediaType<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">,<\/span> CopyYv12MediaBuffer<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\nATLENSURE_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pGraphBuilder<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>AddFilter<span style=\"color: #808030;\">(<\/span>pBaseFilter<span style=\"color: #808030;\">,<\/span> CStringW<span style=\"color: #808030;\">(<\/span>_T<span style=\"color: #808030;\">(<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #0000e6;\">Pass-Through DMO<\/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_SUCCEEDED<span style=\"color: #808030;\">(<\/span>pGraphBuilder<span style=\"color: #808030;\">-<\/span><span style=\"color: #808030;\">&gt;<\/span>Connect<span style=\"color: #808030;\">(<\/span>pOutputPin<span style=\"color: #808030;\">,<\/span> _FilterGraphHelper<span style=\"color: #800080;\">::<\/span>GetFilterPin<span style=\"color: #808030;\">(<\/span>pBaseFilter<span style=\"color: #808030;\">,<\/span> PINDIR_INPUT<span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\npOutputPin <span style=\"color: #808030;\">=<\/span> _FilterGraphHelper<span style=\"color: #800080;\">::<\/span>GetFilterPin<span style=\"color: #808030;\">(<\/span>pBaseFilter<span style=\"color: #808030;\">,<\/span> PINDIR_OUTPUT<span style=\"color: #808030;\">)<\/span><\/pre>\n<p>What is being done in the code snippet above is:<\/p>\n<ul>\n<li>local object map with a single <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/0f31291x.aspx\">OBJECT_ENTRY<\/a> item to have ATL manage class object registration\/revokation for us<\/li>\n<li>registration of a private class\/CLSID<\/li>\n<li>instantiation and initialization of a <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd375519(VS.85).aspx\">DMO Wrapper Filter<\/a> which is to pick up our class<\/li>\n<li>cast back to native C++ pointer for easy further access (a private interface would be more accurate here)<\/li>\n<li>revokation for CLSID<\/li>\n<\/ul>\n<p>For information, the interfaces queried from the DMO:<\/p>\n<pre style=\"background: #ffffff none repeat scroll 0% 0%; color: #000000;\">Find all <span style=\"color: #800000;\">\"<\/span><span style=\"color: #0000e6;\">CVideoDmo::InternalQueryInterface<\/span><span style=\"color: #800000;\">\"<\/span><span style=\"color: #808030;\">,<\/span> Hidden<span style=\"color: #808030;\">,<\/span> Find Results <span style=\"color: #008c00;\">1<\/span><span style=\"color: #808030;\">,<\/span> Current Document\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IMediaObject<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x00000000<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IDMOQualityControl<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IDMOVideoOutputOptimizations<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IMediaObject<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x00000000<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IWMGetSecureChannel<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IAMOpenProgress<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IAMDeviceRemoval<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IDirectVobSub<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IDirectVobSub<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IWMCodecAMVideoAccelerator<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IDirectVobSub<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IWMCodecAMVideoAccelerator<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IWMCodecAMVideoAccelerator<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IMediaSeeking<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IMediaPosition<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IAMFilterMiscFlags<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IVideoWindow<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IBasicAudio<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IAMFilterMiscFlags<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IKsPropertySet<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IReferenceClock<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IWMCodecAMVideoAccelerator<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IAMDeviceRemoval<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nCVideoDmo<span style=\"color: #800080;\">::<\/span>InternalQueryInterface<span style=\"color: #800080;\">:<\/span> Interface IAMOpenProgress<span style=\"color: #808030;\">,<\/span> Result <span style=\"color: #008000;\">0x80004002<\/span>\r\nMatching lines<span style=\"color: #800080;\">:<\/span> <span style=\"color: #008c00;\">24<\/span><\/pre>\n<p>A Visual C++ .NET 2008 source code <a rel=\"nofollow\" href=\"http:\/\/code.assembla.com\/roatl-utilities\/subversion\/nodes\/trunk\/FrameRateSample02\">is available from SVN<\/a>. Additional files will be required to compile, but <a href=\"http:\/\/code.assembla.com\/roatl-utilities\/subversion\/nodes\/trunk\/FrameRateSample02\/Release\/FrameRateSample02.exe?format=raw\">binary<\/a> is also incuded.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recently it was the time to sort out an issue with a video DMO, which outputs YV12 video and in the same time is capable of supporting extended video strides in order to efficiently make a direct connection to Video Mixing Renderer Filters. From past experience, I already knew that some bugs are definitely involved&hellip; <\/p>\n<p><a class=\"moretag\" href=\"https:\/\/alax.info\/blog\/893\">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":[11,13,10,20],"tags":[487,63,78,83,195,486,111,194,489,90],"class_list":["post-893","post","type-post","status-publish","format-standard","hentry","category-atl","category-source","category-video","category-wtl","tag-atl","tag-bug","tag-directshow","tag-dmo","tag-stride","tag-video","tag-vmr","tag-wrapper","tag-wtl","tag-yv12"],"_links":{"self":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/893","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=893"}],"version-history":[{"count":0,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/893\/revisions"}],"wp:attachment":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/media?parent=893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/categories?post=893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/tags?post=893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}