{"id":1979,"date":"2019-12-17T14:16:09","date_gmt":"2019-12-17T12:16:09","guid":{"rendered":"https:\/\/alax.info\/blog\/?p=1979"},"modified":"2019-12-17T16:55:20","modified_gmt":"2019-12-17T14:55:20","slug":"media-foundation-primitives-exposed-in-form-factor-of-winrt-windows-mediacodec","status":"publish","type":"post","link":"https:\/\/alax.info\/blog\/1979","title":{"rendered":"Media Foundation API primitive styling of WinRT windows.mediaCodec"},"content":{"rendered":"\n<p>An interesting Media Foundation question on StackOverflow: <a href=\"https:\/\/stackoverflow.com\/questions\/59368680\/weird-connection-between-coinitializesecurity-and-media-foundation-encoders\">Weird connection between CoInitializeSecurity() and Media Foundation Encoders<\/a><\/p>\n\n\n\n<p>A developer has reasons to discard standard COM security and go <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/com\/impersonation-levels\">RPC_C_IMP_LEVEL_ANONYMOUS<\/a>. Surprisingly this has effect on Windows Media Foundation API in the part of available codecs (Media Foundation Transforms). <\/p>\n\n\n\n<p>Sample code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;iostream>\n\n#include &lt;winrt\\base.h>\n#include &lt;mfapi.h>\n#include &lt;mftransform.h>\n\n#pragma comment(lib, \"mf.lib\")\n#pragma comment(lib, \"mfplat.lib\")\n#pragma comment(lib, \"mfuuid.lib\")\n\nint main()\n{\n\t\/\/ https:\/\/stackoverflow.com\/questions\/59368680\/weird-connection-between-coinitializesecurity-and-media-foundation-encoders\n\tWINRT_VERIFY(SUCCEEDED(MFStartup(MF_VERSION, MFSTARTUP_FULL)));\n\tWINRT_VERIFY(SUCCEEDED(CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_ANONYMOUS, nullptr, EOAC_NONE, nullptr)));\n\t\/\/WINRT_VERIFY(SUCCEEDED(CoInitializeEx(nullptr, COINITBASE_MULTITHREADED)));\n\tIMFActivate** Activates = nullptr;\n\tUINT32 ActivateCount = 0;\n\tWINRT_VERIFY(SUCCEEDED(MFTEnumEx(MFT_CATEGORY_VIDEO_ENCODER, MFT_ENUM_FLAG_ALL, nullptr, nullptr, &amp;Activates, &amp;ActivateCount)));\n\tWINRT_ASSERT(Activates || !ActivateCount);\n\tBOOL Found = FALSE;\n\tfor(UINT32 Index = 0; Index &lt; ActivateCount; Index++)\n\t{\n\t\tIMFActivate*&amp; Activate = Activates[Index];\n\t\tWINRT_ASSERT(Activate);\n\t\tWCHAR* FriendlyName = nullptr;\n\t\tUINT32 FriendlyNameLength;\n\t\tWINRT_VERIFY(SUCCEEDED(Activate->GetAllocatedString(MFT_FRIENDLY_NAME_Attribute, &amp;FriendlyName, &amp;FriendlyNameLength)));\n\t\tstd::wcout &lt;&lt; FriendlyName &lt;&lt; std::endl;\n\t\tif(wcscmp(FriendlyName, L\"HEVCVideoExtensionEncoder\") == 0)\n\t\t\tFound = TRUE;\n\t\tCoTaskMemFree(FriendlyName);\n\t}\n\tWINRT_ASSERT(Found);\n\tCoTaskMemFree(Activates);\n\t\/\/CoUninitialize();\n\tWINRT_VERIFY(SUCCEEDED(MFShutdown()));\n}<\/code><\/pre>\n\n\n\n<p><code><a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/combaseapi\/nf-combaseapi-coinitializesecurity\">CoInitializeSecurity<\/a><\/code> line in the code above removes the following from enumeration:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>HEIFImageExtension<\/li><li>VP9VideoExtensionEncoder<\/li><li>HEVCVideoExtensionEncoder<\/li><\/ul>\n\n\n\n<p>See the pattern? Why? <\/p>\n\n\n\n<p>Similarly to other and older APIs like DirectShow enumeration function combines uniformly interfaced primitives coming from multiple sources. In this case of Media Foundation, enumeration combines (and filters\/orders when requested) traditional transforms registered with the API with information in system registry, limited scope transforms and also transforms coming from Windows Store.<\/p>\n\n\n\n<p>For example, H.256\/HEVC video decoder and encoder is added to the system as <a href=\"https:\/\/www.microsoft.com\/en-us\/p\/hevc-video-extensions\/9nmzlz57r3t7\">HEVC Video Extension<\/a> Windows Store item.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;Identity ProcessorArchitecture=\"x64\" Version=\"1.0.23254.0\" Publisher=\"CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US\" Name=\"Microsoft.HEVCVideoExtension\"\/><\/code><\/pre>\n\n\n\n<p> Its video encoder, in turn, is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        &lt;uap4:Extension Category=\"windows.mediaCodec\">\n          &lt;uap4:MediaCodec DisplayName=\"HEVCVideoExtensionEncoder\" Description=\"This is a video codec\" Category=\"videoEncoder\" wincap3:ActivatableClassId=\"H265Encoder.CH265EncoderTransform\" wincap3:Path=\"x86\\mfh265enc.dll\" wincap3:ProcessorArchitecture=\"x86\">\n            &lt;uap4:MediaEncodingProperties>\n              &lt;uap4:InputTypes>\n                &lt;!-- NV12 -->\n                &lt;uap4:InputType SubType=\"3231564e-0000-0010-8000-00aa00389b71\" \/>\n                &lt;!-- IYUV -->\n                &lt;uap4:InputType SubType=\"56555949-0000-0010-8000-00AA00389B71\" \/>\n                &lt;!-- YV12 -->\n                &lt;uap4:InputType SubType=\"32315659-0000-0010-8000-00AA00389B71\" \/>\n                &lt;!-- YUY2 -->\n                &lt;uap4:InputType SubType=\"32595559-0000-0010-8000-00AA00389B71\" \/>\n              &lt;\/uap4:InputTypes>\n              &lt;uap4:OutputTypes>\n                &lt;!-- HEVC -->\n                &lt;uap4:OutputType SubType=\"43564548-0000-0010-8000-00AA00389B71\" \/>\n              &lt;\/uap4:OutputTypes>\n            &lt;\/uap4:MediaEncodingProperties>\n          &lt;\/uap4:MediaCodec>\n        &lt;\/uap4:Extension>\n      &lt;\/Extensions><\/code><\/pre>\n\n\n\n<p>Media Foundation API is capable to pick such <code><a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/medfound\/windows-media-codecs\">mediaCodec<\/a><\/code> from Windows Store applications and make it available to desktop applications. However, there in COM security in the middle of the glue layer. Media Foundation would create a special activation object (<code>CMFWinrtInprocActivate<\/code>) to implement <code><a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/mfobjects\/nn-mfobjects-imfactivate\">IMFActivate<\/a><\/code> for such WinRT codec and once activated, the transform acts as usual and as documented. These codecs are also dual interfaced and in addition to traditional Media Foundation interfaces like <code><a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/mftransform\/nn-mftransform-imftransform\">IMFTransform<\/a><\/code> expose UWP interfaces like <code><a href=\"https:\/\/docs.microsoft.com\/en-us\/uwp\/api\/Windows.Media.IMediaExtension\">IMediaExtension<\/a><\/code> and so they are consumable by UWP applications as well.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>An interesting Media Foundation question on StackOverflow: Weird connection between CoInitializeSecurity() and Media Foundation Encoders A developer has reasons to discard standard COM security and go RPC_C_IMP_LEVEL_ANONYMOUS. Surprisingly this has effect on Windows Media Foundation API in the part of available codecs (Media Foundation Transforms). Sample code: CoInitializeSecurity line in the code above removes the&hellip; <\/p>\n<p><a class=\"moretag\" href=\"https:\/\/alax.info\/blog\/1979\">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":[1],"tags":[141,95,504,424,549,486,70],"class_list":["post-1979","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-codec","tag-com","tag-h-265","tag-media-foundation","tag-uwp","tag-video","tag-winapi"],"_links":{"self":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/1979","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=1979"}],"version-history":[{"count":0,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/1979\/revisions"}],"wp:attachment":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/media?parent=1979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/categories?post=1979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/tags?post=1979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}