如何在Win7上将ID3D11Texture2D内容复制到IMFSample?

问题描述

在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 (将#修改为@)