0

Windows Media Player の中央をセカンダリ モニターにドラッグ (または開始) すると、DXVA2 デコーダーが「空白」になります。プライマリに戻すと、ビデオが再表示されます。D3DPRESENTFLAG_DEVICECLIP が設定されていないことに注意してください。

処理を必要とせずにこれが機能する方法を見つけたいと思っていますが、IDirect3DDeviceManager9::TestDevice( ) が DXVA2_E_NEW_VIDEO_DEVICE を返すことによって、この問題の通知を受け取ります。

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で同じ問題を抱えています。

ヘルプ/ポインタをいただければ幸いです。

4

1 に答える 1

0

セカンダリ ディスプレイのビデオを復元するハンドラーが動作しています (約 1 秒後)。もちろん、誰かがそれを手伝ってくれるなら、シームレスにしたいと思います。

とにかく、解決策は、すべてを完全に解放してから復元することにより、独自のリセットを作成することでした。解決策は遅いですが、今のところうまくいきます..

于 2017-01-06T13:08:11.057 に答える