繁体   English   中英

如何从 Hololens 2 上的 C++ 程序获取 VP9 解码器?

[英]How to get the VP9 decoder from a C++ program on Hololens 2?

我正在实现一个可以在 PC 和 Hololens 2 上运行的 VP9 硬件解码器。
当我尝试加载“MSVP9DEC.dll”时,它在 PC 上运行良好,但在 Hololens 上找不到 DLL。
我已经在设备上安装了 VP9 Video Extensions。

这里是截取的代码。 Hololens 上的“assert(DecoderDll)”失败:

HRESULT CreateCOMObjectFromDll(HMODULE dll,
const CLSID& clsid,
const IID& iid,
void** object);

void CreateVP9Decoder()
{
#if PLATFORM_HOLOLENS
    HMODULE DecoderDll = ::LoadPackagedLibrary(L"MSVP9DEC.dll", 0ul);
#else
    HMODULE DecoderDll = ::LoadLibrary(L"MSVP9DEC.dll");
#endif

    assert(DecoderDll);

    const GUID CLSID_VpxDecoder = { 0xE3AAF548, 0xC9A4, 0x4C6E,  {0x23, 0x4D, 0x5A, 0xDA, 0x37, 0x4B, 0x00, 0x00 } };

    Microsoft::WRL::ComPtr<IMFTransform> VP9Decoder;

    HRESULT hr = CreateCOMObjectFromDll(DecoderDll, CLSID_VpxDecoder,
        IID_PPV_ARGS(&VP9Decoder));

    assert(SUCCEEDED(hr));

    //...

}

__pragma(warning(push))
__pragma(warning(disable: 4191))

//@See: https://chromium.googlesource.com/chromium/src/+/master/media/gpu/windows/dxva_video_decode_accelerator_win.cc
HRESULT CreateCOMObjectFromDll(HMODULE dll,
    const CLSID& clsid,
    const IID& iid,
    void** object) {

    if (!dll || !object)
        return E_INVALIDARG;

    using GetClassObject =
        HRESULT(WINAPI*)(const CLSID& clsid, const IID& iid, void** object);

    GetClassObject get_class_object = reinterpret_cast<GetClassObject>(
        GetProcAddress(dll, "DllGetClassObject"));

    assert(get_class_object);

    TComPtr<IClassFactory> factory;
    HRESULT hr = get_class_object(clsid, IID_PPV_ARGS(&factory));

    assert(SUCCEEDED(hr));

    hr = factory->CreateInstance(NULL, iid, object);
    return hr;
}

__pragma(warning(pop))

谢谢!

const GUID CLSID_VpxDecoder = { 0xE3AAF548, 0xC9A4, 0x4C6E,  {0x23, 0x4D, 0x5A, 0xDA, 0x37, 0x4B, 0x00, 0x00 } };
IMFTransform* VP9Decoder;

MULTI_QI qi[1];
memset(qi, 0, sizeof(qi));

qi[0].pIID = &IID_PPV_ARGS(&VP9Decoder);

HRESULT hr = CoCreateInstanceFromApp(CLSID_VpxDecoder, NULL, CLSCTX_INPROC_SERVER, NULL, _countof(qi), qi);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM