MF_SA_D3D_ALLOCATE_DISPLAYABLE_RESOURCES 属性
指定 MFT 的示例分配器 (SA) 是否应使用 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 标志分配基础 Direct3D 纹理。
数据类型
UINT32
备注
此属性Windows 10版本 20348 提供。
注意
D3D11_RESOURCE_MISC_FLAG枚举的 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 成员字段将在 SDK 的未来版本中提供。
媒体基础平台层在呈现视频时设置 MF_SA_D3D11_ALLOCATE_DISPLAYABLE_RESOURCES 属性。 如果应用想要实现自己的视频呈现器并使用 D3D11 可显示资源,则也可以选择设置此属性。
示例
下面的代码示例演示 了 MF_SA_D3D11_ALLOCATE_DISPLAYABLE_RESOURCES 属性的用法。
class DecoderMFT : public IMFAttributes, public IMFTransform
{
//
... Other implementation details omitted
//
public:
// Implementation of IMFAttributes::GetAttributes which is invoked by the MF Topology Loader
STDMETHODIMP GetAttribtues(IMFAttributes** attributes)
{
m_attributes.copyTo(attributes);
return S_OK;
}
private:
// Private method to be called before DecoderMFT initializes its sample pool.
// A good place for this to happen is in the method which processes the
// 'MFT_MESSAGE_NOTIFY_BEGIN_STREAMING' event.
// At a minimum, this processing would be in DecoderMFT's implementation of IMFTransform::ProcessMessage.
HRESULT ConfigureTextureFlags()
{
UINT32 allocateDisplayables = MFGetAttributeUINT32(m_attributes.get(),
MF_SA_D3D11_ALLOCATE_DISPLAYABLE_RESOURCES, 0);
// If no MF_SA_* attributes which correspond to D3D misc flags are set then it is valid for
// miscFlags to be set to 0.
m_textureDesc.miscFlags = 0;
UINT32 sharedResources = 0;
if (allocateDisplayables != 0)
{
m_textureDesc.miscFlags |= D3D11_RESOURCE_MISC_DISPLAYABLE;
// The following flag is required for the decoders output to
// use D3D11_RESOURCE_MISC_DISPLAYABLE.
m_textureDesc.miscFlags |= D3D11_RESOURCE_MISC_EXCLUSIVE_WRITER;
// The following flags are required for the presentation API
// to consume and present these resources (also known as direct presentation).
m_textureDesc.miscFlags |= D3D11_RESOURCE_MISC_SHARED;
m_textureDesc.miscFlags |= D3D11_RESOURCE_MISC_SHARED_NTHANDLE;
sharedResources = 1;
}
else
{
// This handles the case when MF_SA_D3D11_ALLOCATE_DISPLAYABLE_RESOURCES was 0 or missing.
sharedResources = MFGetAttributeUINT32(m_attributes.get(), MF_SA_D3D11_SHARED_WITHOUT_MUTEX, 0);
if (sharedResources != 0)
{
m_textureDesc.miscFlags |= D3D11_RESOURCE_MISC_SHARED;
}
else
{
UINT32 sharedKeyMutex = MFGetAttributeUINT32(m_attributes.get(), MF_SA_D3D11_SHARED, 0);
if (sharedKeyMutex != 0)
{
m_textureDesc.micsFlags |= D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;
}
}
}
// Processing for other MF_SA_* attributes which imply D3D11_RESOURCE_MISC flag
// omitted from this sample.
return S_OK;
}
// Private method showing how DecoderMFT can create a texture with the flags required
// to satisfy "MF_SA_D3D11_ALLOCATE_DISPLAYBLE_RESOURCES".
// Because this is a private function we know the passed in pointer is always valid.
// This would be invoked by another private DecoderMFT function when allocating an MFSample
// for its sample pool.
HRESULT AllocateTextureForSample(ID3D11Texture2D** texture2D)
{
return m_d3dDevice->CreateTexture2D(&m_textureDesc, nullptr, texture2D);
}
// ... other members omitted
wil::com_ptr_nothrow<IMFAttributes> m_attributes;
wil::com_ptr_nothrow<ID3D11Device> m_d3dDevice;
// This a texture description for D3D11 resources.
D3D11_TEXTURE_2D_DESC m_textureDesc = {};
};
要求
要求 | 值 |
---|---|
最低受支持的客户端 |
Windows 10内部版本 20348 |
标头 |
|
另请参阅