none
IMFMediaEngineでビデオの表示位置がずれる RRS feed

  • 質問

  • お世話になります。

    DirectX11でIMFMediaEngineを使用して動画を再生するプログラムを作成しています。
    このプログラムはIMFMediaEngine::TransferVideoFrameを使用してテクスチャ(ID3D11Texture2D)を取得し、取得したテクスチャを画面に表示します。
    1つ問題があり、このビデオ再生プログラムは、GeForceのGPUを使用すると正常に再生されますが、Radeonの
    一部のGPUを使用するとビデオの表示位置がずれてしまいます(添付画像を参照、Radeon RX 5700 XTを使用)
    ドライバを最新化、WindowsUpdateを行っても解決しませんでした。
    正常に動作する場合との違いはGPUの種類だけです。

    AMDのGPUに何かくせのようなものがあるのかと思ったのですが、解決方法をご存じの方がいればご教示頂きたいです。
    以上です。よろしくお願いします。

    ■開発環境
    Visual Studio 2017 pro ver 15.9.16
    C++
    DirectX11.1
    Windows Kits 10.0.17763.0
    Windows 10 pro 21H1 64bit
    NVIDIA GeForce GTX 1050

    ■正常


    ■異常

    ■描画部分コード抜粋

    ID3D11Texture2D* pTexture2D = NULL;
    ID3D11Texture2D* pBackBufferTexture2D = NULL;
    
    EnterCriticalSection(&m_critSec);
    
    do {
    	//MFVideoNormalizedRect psrc = { 0, 0, 1, 1 };
    	RECT pdst = { 0, 0, m_srcTexW, m_srcTexH };
    	hr = m_spMediaEngine->TransferVideoFrame(m_pRenderTex, nullptr, &pdst, &m_bkgColor);
    
    	if (SUCCEEDED(hr)) {
    		if (FAILED(hr = m_swapChain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&pBackBufferTexture2D))) {
    			break;
    		}
    		D3D11_TEXTURE2D_DESC desc = {0};
    		pBackBufferTexture2D->GetDesc(&desc);
    		if((UINT)m_srcTexW > desc.Width || (UINT)m_srcTexH > desc.Height){
    			D3D11_BOX box = {0, 0, 0,(UINT)desc.Width, (UINT)desc.Height, 1};
    			m_context->CopySubresourceRegion(pBackBufferTexture2D, 0, 0, 0, 0, m_pRenderTex, NULL, &box);
    		}
    		else
    		{
    			m_context->CopySubresourceRegion(pBackBufferTexture2D, 0, 0, 0, 0, m_pRenderTex, NULL, 0);
    		}
    		hr = m_swapChain->Present(1, 0);
    	}
    } while (false);
    
    LeaveCriticalSection(&m_critSec);
    
    SafeRelease(pBackBufferTexture2D);
    SafeRelease(pTexture2D);

    2021年7月30日 7:44

すべての返信

  • gama55さん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    このサンプルを実行してみてはいかがでしょうか。
    あるいは、flushメソッドを追加して、解決に至るかどうかを試してみてください。

    D3D11_BOX box; box.back = 1, box.front = 0, box.left = 0, box.right = descT.Width, box.top = 0, box.bottom = descT.Height;
    ctx1->lock(ctx1->lock_ctx);
    dctx->CopySubresourceRegion(frame->m_d3DTextureFfmpeg, 0, 0, 0, 0, (ID3D11Texture2D*)m_frame->data[0], currentFrameIndex,&box); //may be we can use the buffer in the frame directly
    dctx->Flush(); //clean command buffer //https://docs.microsoft.com/en-us/windows/desktop/api/d3d11/nf-d3d11-id3d11devicecontext-flush
    ctx1->unlock(ctx1->lock_ctx);


    どうぞよろしくお願いいたします。 


    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年8月4日 7:44
    モデレータ
  • Kumo 様

    ご助言感謝します。
    現在再現環境を用意できていないので、準備出来次第試してみたいと思います。
    ありがとうございます。
    2021年8月6日 3:41