首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ID3D11Texture2D上将IMFSample内容复制到win7上?

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

Stack Overflow用户
提问于 2020-10-27 14:40:26
回答 1查看 143关注 0票数 0

在win8和更高版本中,我可以直接使用MFCreateDXGISurfaceBufferWrapper,但是在Win7系统上不支持这个接口,所以我只能在CPU上复制它("_capture_texture_2D“是在Win7上用D3D11_USAGE_STAGING创建的),但是最后显示的图像是倾斜的。我觉得转换结果的长度或宽度是不正确的:

  • _capture_texture2d是为d2D与DXGI_FORMAT_B8G8R8A8_UNORM的互操作性而创建的,但是MFVideoFormat_XXX没有看到相应的格式

  • 也许“锁”需要投球支持,但我找不到介绍

HRESULT = E_NOTIMPL;CComPtr media_buffer;if (IsWindows8OrGreater()) { hr =IsWindows8OrGreater _capture_texture2d,0,FALSE,&media_buffer);CComPtr twod_buffer;hr = media_buffer->QueryInterface(&twod_buffer);RETURN_ON_FAIL( hr );DWORD长度= 0;hr = twod_buffer->GetContiguousLength(& length );RETURN_ON_FAIL(hr);hr =media_buffer->SetCurrentLength(长度);RETURN_ON_FAIL( hr );{ D3D11_TEXTURE2D_DESC desc;_D3D11_TEXTURE2D_DESC_texture2d->GetDesc(&desc);UINT32 img_size = 0;hr= MFCalculateImageSize(MFVideoFormat_RGB32,desc.Width,desc.Height,&img_size);RETURN_ON_FAIL(hr);D3D11_MAPPED_SUBRESOURCE资源;UINT子资源= D3D11CalcSubresource(0,0,0);hr =_capture_texture2d_context->Map( D3D11_MAP_READ,子资源,D3D11_MAP_READ,0,&resource);RETURN_ON_FAIL( hr );hr = MFCreateMemoryBuffer(img_size,&media_buffer);if (成功(Hr)){字节*dst = NULL;hr= media_buffer->Lock(&dst,NULL,NULL);如果(size_t i= 0;i< desc.Height;i++) { memcpy( dst,src,desc.Width * 4);src += resource.RowPitch;dst += desc.Width * 4;}_capture_texture2d_buffer->SetCurrentLength(Img_size);} RETURN_ON_FAIL( hr );CComPtr样本;hr =MFCreateSample(样本);RETURN_ON_FAIL( hr );hr= sample->AddBuffer(media_buffer);RETURN_ON_FAIL(hr);

EN

回答 1

Stack Overflow用户

发布于 2020-10-28 06:36:40

使用函数MFGetStrideForBitmapInfoHeader和MFCopyImage解决方案:

代码语言:javascript
复制
    D3D11_TEXTURE2D_DESC desc;
    _capture_texture2d->GetDesc(&desc);

    UINT32 img_size = 0;
    GUID dst_format = MFVideoFormat_RGB32;
    hr = MFCalculateImageSize(dst_format, desc.Width, desc.Height, &img_size);
    RETURN_ON_FAIL(hr);

    LONG dst_stride = 0;
    hr = MFGetStrideForBitmapInfoHeader(dst_format.Data1, desc.Width, &dst_stride);
    RETURN_ON_FAIL(hr);

    D3D11_MAPPED_SUBRESOURCE resource;
    UINT subresource = D3D11CalcSubresource(0, 0, 0);
    hr = immediate_context->Map(_capture_texture2d, subresource, D3D11_MAP_READ, 0, &resource);
    RETURN_ON_FAIL(hr);

    hr = MFCreateMemoryBuffer(img_size, &media_buffer);
    if (SUCCEEDED(hr))
    {
        BYTE *dst_data = NULL;
        hr = media_buffer->Lock(&dst_data, NULL, NULL);
        if (SUCCEEDED(hr))
        {
            if (dst_stride >= 0)
            {
                hr = MFCopyImage(dst_data, dst_stride, (BYTE*)resource.pData, resource.RowPitch, desc.Width * 4, desc.Height);
            }
            else
            {
                BYTE *src_ptr = (BYTE*)resource.pData;
                BYTE *dst_ptr = dst_data - dst_stride * (desc.Height - 1);
                size_t copy_bytes = min(resource.RowPitch, (UINT)-dst_stride);
                for (size_t i = 0; i < desc.Height; i++)
                {
                    memcpy(dst_ptr, src_ptr, copy_bytes);

                    src_ptr += resource.RowPitch;
                    dst_ptr += dst_stride; 
                }
            }

            media_buffer->SetCurrentLength(img_size);

            media_buffer->Unlock();
        }
    }

    immediate_context->Unmap(_capture_texture2d, subresource);

    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64556784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档