私はDirectXを初めて使用しています。ビデオを読み込んでクワッドに表示する簡単なアプリケーションを作成しようとしています。IMFSample *をID3D11ShaderResourceViewに変換する*
Windows Media Foundation(IMFSourceReader)を使用してビデオを読み、サンプルがデコードされたときにコールバックを送信します(IMFSample)。
このIMFSample *をID3D11ShaderResourceView *に変換して、それをテクスチャとして使用して四角形を描画したい場合は、変換に失敗します。ここで
私は(私は無関連のエラーチェックを削除)何をすべきかです:
HRESULT SourceReaderCB::OnReadSample(HRESULT hrStatus, DWORD dwStreamIndex, DWORD dwStreamFlags, LONGLONG llTimestamp, IMFSample *pSample)
{
...
DWORD NumBuffers = 0;
hr = pSample->GetBufferCount(&NumBuffers);
if (FAILED(hr) || NumBuffers < 1)
{
...
}
IMFMediaBuffer* SourceMediaPtr = nullptr;
hr = pSample->GetBufferByIndex(0, &SourceMediaPtr);
if (FAILED(hr))
{
...
}
ComPtr<IMFMediaBuffer> _pInputBuffer = SourceMediaPtr;
ComPtr<IMF2DBuffer2> _pInputBuffer2D2;
bool isVideoFrame = (_pInputBuffer.As(&_pInputBuffer2D2) == S_OK);
if (isVideoFrame)
{
IMFDXGIBuffer* pDXGIBuffer = NULL;
ID3D11Texture2D* pSurface = NULL;
hr = _pInputBuffer->QueryInterface(__uuidof(IMFDXGIBuffer), (LPVOID*)&pDXGIBuffer);
if (FAILED(hr))
{
SafeRelease(&SourceMediaPtr);
goto done;
}
hr = pDXGIBuffer->GetResource(__uuidof(ID3D11Texture2D), (LPVOID*)&pSurface);
if (FAILED(hr))
{
...
}
ID3D11ShaderResourceView* resourceView;
if (pSurface)
{
D3D11_TEXTURE2D_DESC textureDesc;
pSurface->GetDesc(&textureDesc);
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
shaderResourceViewDesc.Format = DXGI_FORMAT_R8_UNORM;
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
shaderResourceViewDesc.Texture2D.MipLevels = 1;
ID3D11ShaderResourceView* resourceView;
hr = d3d11device->CreateShaderResourceView(pSurface, &shaderResourceViewDesc, &resourceView);
if (FAILED(hr))
{
... // CODE FAILS HERE
}
...
}
}
}
私の最初の問題は、(私が持っているだろう、私はおそらく私だけ赤いイメージを与えるであろうDXGI_FORMAT_R8_UNORMとしてshaderResourceViewDesc.Formatを設定することですこれを後で調べる)。
ID3D11ShaderResourceViewへID3D11Texture2Dの変換は、次のエラーメッセージで失敗し、私はIUSに直面しています秒と、ブロッキングの問題:
ID3D11Device::CreateShaderResourceView: A ShaderResourceView cannot be created of a Resource that did not specify the D3D11_BIND_SHADER_RESOURCE BindFlag. [ STATE_CREATION ERROR #129: CREATESHADERRESOURCEVIEW_INVALIDRESOURCE]
私は私を防ぎ、テクスチャの作成時に欠落しているフラグがあることを理解して私がしたいことをするためには、WMFによってデータバッファが作成されるので、私はこの問題を解決するために何をすべきかはわかりません。
はこれを試み、それが働きました。ありがとう。 –