导读
本文主要讲解IDirect3DSurface9格式转ID3D11Texture2D格式。
背景
解码方式:FFmpeg DXVA(IDirect3DSurface9 );
渲染方式:DX11(ID3D11Texture2D)。
正文
1.ID3D11Texture2D关联IDirect3DSurface9
ComPtr<ID3D11Texture2D> m_pD3DTexture;
ComPtr<IDirect3DSurface9> m_pD3D9Surf;
//DX11纹理描述符
D3D11_TEXTURE2D_DESC texDesc;
ZeroMemory(&texDesc, sizeof(texDesc));
texDesc.Width = m_width;
texDesc.Height = m_height;
texDesc.MipLevels = 1;
texDesc.ArraySize = 1;
texDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
texDesc.SampleDesc.Count = 1;
texDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
texDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; //共享纹理
//创建纹理
HRESULT hr = m_d3dDevice->CreateTexture2D(&texDesc, NULL, m_pD3DTexture.GetAddressOf());
assert(S_OK == hr);
ComPtr<IDXGIResource> pDXGIResource;
m_pD3DTexture->QueryInterface(__uuidof(pDXGIResource),(void**)pDXGIResource.GetAddressOf());
HANDLE hSharedHandle; //共享句柄
hr = pDXGIResource->GetSharedHandle(&hSharedHandle);
assert(S_OK == hr);
//根据纹理共享句柄创建DX9纹理
ComPtr<IDirect3DTexture9> pTexture9;
hr = m_pDecoder->GetDirect3DDevice9()->CreateTexture(texDesc.Width, texDesc.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT, pTexture9.GetAddressOf(), &hSharedHandle);
assert(S_OK == hr);
//获取DX9纹理表面
hr = pTexture9->GetSurfaceLevel(0, m_pD3D9Surf.GetAddressOf());
assert(S_OK == hr);
2.将Frame里的数据拷贝到关联DX9表面
m_pDX9Device->StretchRect((IDirect3DSurface9*)pFrame->data[3], nullptr, m_pD3D9Surf.Get(), nullptr, D3DTEXF_NONE);