问题描述
在win8及更高版本中,我可以直接使用MFCreateDXGISurfaceBufferWrapper,但是在Win7系统上不支持此接口,因此只能在CPU上复制它(“ _capture_texture_2D”是在Win7上使用D3D11_USAGE_STAGING创建的),但是显示的最终图像是斜。我觉得转换结果的长度或宽度不正确:
-
_capture_texture2d是为了与DXGI_FORMAT_B8G8R8A8_UNORM进行d2d互操作性而创建的,但MFVideoFormat_XXX没有看到相应的格式
-
也许“锁定”需要音高支持,但我找不到简介
HRESULT hr = E_NOTIMPL; CComPtr<IMFMediaBuffer> media_buffer; if (IsWindows8OrGreater()) { hr = MFCreateDXGISurfaceBufferWrapper(__uuidof(ID3D11Texture2D),_capture_texture2d,FALSE,&media_buffer); CComPtr<IMF2DBuffer> twod_buffer; hr = media_buffer->QueryInterface(&twod_buffer); RETURN_ON_FAIL(hr); DWORD length = 0; hr = twod_buffer->GetContiguousLength(&length); RETURN_ON_FAIL(hr); hr = media_buffer->SetCurrentLength(length); RETURN_ON_FAIL(hr); } else { D3D11_TEXTURE2D_DESC desc; _capture_texture2d->GetDesc(&desc); UINT32 img_size = 0; hr = MFCalculateImageSize(MFVideoFormat_RGB32,desc.Width,desc.Height,&img_size); RETURN_ON_FAIL(hr); D3D11_MAPPED_SUBRESOURCE resource; UINT subresource = D3D11CalcSubresource(0,0); hr = immediate_context->Map(_capture_texture2d,subresource,D3D11_MAP_READ,&resource); RETURN_ON_FAIL(hr); hr = MFCreateMemoryBuffer(img_size,&media_buffer); if (SUCCEEDED(hr)) { BYTE *dst = NULL; hr = media_buffer->Lock(&dst,NULL,NULL); if (SUCCEEDED(hr)) { BYTE* src = (BYTE*)resource.pData; for (size_t i = 0; i < desc.Height; i++) { memcpy(dst,src,desc.Width * 4); src += resource.RowPitch; dst += desc.Width * 4; } media_buffer->Unlock(); } } immediate_context->Unmap(_capture_texture2d,subresource); RETURN_ON_FAIL(hr); hr = media_buffer->SetCurrentLength(img_size); } RETURN_ON_FAIL(hr); CComPtr<IMFSample> sample; hr = MFCreateSample(sample); RETURN_ON_FAIL(hr); hr = sample->AddBuffer(media_buffer); RETURN_ON_FAIL(hr);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)