attribut MF_SA_D3D_ALLOCATE_DISPLAYABLE_RESOURCES
Spécifie si l’exemple d’allocateur (SA) de MFT doit allouer la texture Direct3D sous-jacente à l’aide de l’indicateur D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE .
Type de données
UINT32
Notes
Cet attribut est disponible avec Windows 10 build 20348.
Notes
Le champ membre D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE de l’énumération D3D11_RESOURCE_MISC_FLAG sera disponible dans une prochaine version du KIT de développement logiciel (SDK).
La couche de plateforme Media Foundation définit l’attribut MF_SA_D3D11_ALLOCATE_DISPLAYABLE_RESOURCES lors du rendu vidéo. Une application peut également choisir de définir cet attribut si elle souhaite implémenter son propre convertisseur vidéo et utiliser des ressources d’affichage D3D11.
Exemple
L’exemple de code suivant illustre l’utilisation de l’attribut 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 = {};
};
Spécifications
Condition requise | Valeur |
---|---|
Client minimal pris en charge |
Windows 10 build 20348 |
En-tête |
|
Voir aussi