【问题标题】:DXVA2 Decoder MFT in Windows Media Player with multiple monitor displaysWindows Media Player 中的 DXVA2 解码器 MFT 与多显示器显示
【发布时间】:2017-01-05 17:24:57
【问题描述】:

当 Windows Media Player 的中心被拖到(或在其上启动)辅助监视器时,我的 DXVA2 解码器“空白”。移回主要视频时,视频会重新出现。注意我没有设置 D3DPRESENTFLAG_DEVICECLIP。

虽然我更希望找到一种无需处理即可工作的方法,但我确实通过返回 DXVA2_E_NEW_VIDEO_DEVICE 的 IDirect3DDeviceManager9::TestDevice( ) 收到有关此问题的通知。

IDirect3DDeviceManager9::CloseDeviceHandle / OpenDeviceHandle 没有削减它(尽管 MSDN 指出了所有必需的)所以我的重置处理程序类似于:

ReleaseBuffers();   // free surfaces

SAFE_RELEASE(m_decoderService);

hr = m_pDXManager->CloseDeviceHandle(m_hDevice);
hr = m_pDXManager->OpenDeviceHandle(&m_hDevice);
hr = m_pDXManager->LockDevice(m_hDevice, &pDev, true);

hr = pDev->Reset(d3DPP);  // FAILS 0x8876086c !!!!

于是我尝试创建一个新的 dx 设备(使用桌面作为 hwnd)然后

 m_pDXManager->ResetDevice( new_device, token); 

但在 IDirect3DDevice9::Reset() 上仍然没有乐趣。

我也尝试使用 DXVA2CreateDirect3DDeviceManager9 创建新的 IDirect3DDeviceManager9,但无济于事。

顺便说一句,我在初始化时使用 IDirect3DDevice9::Reset() 没有任何问题,稍后使用相同的 D3DPRESENT_PARAMETERS 所以不要认为这些是问题,但它们在这里(调用后)

    d3DPP[n].BackBufferWidth = 1920;
    d3DPP[n].BackBufferHeight = 1080;
    d3DPP[n].BackBufferCount = 1;
    d3DPP[n].BackBufferFormat = D3DFMT_X8R8G8B8;
    d3DPP[n].SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3DPP[n].hDeviceWindow = NULL;
    d3DPP[n].Windowed = true;
    d3DPP[n].Flags = D3DPRESENTFLAG_VIDEO;
    d3DPP[n].FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3DPP[n].PresentationInterval = D3DPRESENT_INTERVAL_ONE;

任何缺失都归零。

win8和win10也有同样的问题。

任何帮助/指针表示赞赏。

【问题讨论】:

    标签: wmp dxva


    【解决方案1】:

    我有一个可以在辅助显示器上恢复视频的工作处理程序(大约一秒钟后)。如果有人可以帮助我,我当然希望它是无缝的。

    无论如何,解决方案是通过绝对释放所有内容然后恢复来创建我自己的重置。解决方案很慢,但目前有效..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2019-04-03
      • 2013-04-21
      • 2011-01-04
      • 2022-07-25
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多