Création de nœuds de transformation
Un nœud de transformation représente une Media Foundation transformation (MFT), telle qu’un décodeur ou un encodeur. Il existe plusieurs façons d’initialiser un nœud transformer :
- À partir d’un pointeur vers la table MFT.
- À partir d’un CLSID pour la table MFT.
- À partir d’un pointeur vers un objet d’activation pour la table MFT.
Si vous envisagez de charger la topologie à l’intérieur du chemin d’accès de média protégé (PMP), vous devez utiliser le CLSID ou un objet d’activation, afin que la table MFT puisse être créée à l’intérieur du processus protégé. La première approche (à l’aide d’un pointeur vers la table MFT) ne fonctionne pas avec l’PMP.
Création d’un nœud de transformation à partir d’une table MFT
Pour créer un nœud de transformation à partir d’une table MFT, procédez comme suit :
- Créer une instance de la table MFT et obtenir un pointeur vers l’interface IMFTransform de la table MFT.
- Appelez MFCreateTopologyNode avec l’indicateur de _ nœud de _ transformation _ de topologie MF pour créer le nœud de transformation.
- Appelez IMFTopologyNode :: setObject et transmettez le pointeur IMFTransform .
- Appelez IMFTopology :: AddNode pour ajouter le nœud à la topologie.
L’exemple suivant crée et initialise un nœud de transformation à partir d’une table MFT.
HRESULT AddTransformNode(
IMFTopology *pTopology, // Topology.
IMFTransform *pMFT, // MFT.
IMFTopologyNode **ppNode // Receives the node pointer.
)
{
*ppNode = NULL;
IMFTopologyNode *pNode = NULL;
// Create the node.
HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);
// Set the object pointer.
if (SUCCEEDED(hr))
{
hr = pNode->SetObject(pMFT);
}
// Add the node to the topology.
if (SUCCEEDED(hr))
{
hr = pTopology->AddNode(pNode);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppNode = pNode;
(*ppNode)->AddRef();
}
SafeRelease(&pNode);
return hr;
}
Création d’un nœud de transformation à partir d’un CLSID
Pour créer un nœud de transformation à partir d’un CLSID, procédez comme suit :
- Recherche le CLSID de la table MFT. Vous pouvez utiliser la fonction MFTEnum pour rechercher les CLSID de MFTS par catégorie, tels que les décodeurs ou les encodeurs. Vous pouvez également connaître le CLSID d’une table MFT particulière que vous souhaitez utiliser (par exemple, si vous avez implémenté votre propre MFT personnalisé).
- Appelez MFCreateTopologyNode avec l’indicateur de _ nœud de _ transformation _ de topologie MF pour créer le nœud de transformation.
- Définissez l’attribut d' _ _ _ ObjectID de transformation TOPONODE MF sur le nœud. La valeur de l’attribut est le CLSID.
- Appelez IMFTopology :: AddNode pour ajouter le nœud à la topologie.
L’exemple suivant crée et initialise un nœud Transform à partir d’un CLSID.
HRESULT AddTransformNode(
IMFTopology *pTopology, // Topology.
const CLSID& clsid, // CLSID of the MFT.
IMFTopologyNode **ppNode // Receives the node pointer.
)
{
*ppNode = NULL;
IMFTopologyNode *pNode = NULL;
// Create the node.
HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);
// Set the CLSID attribute.
if (SUCCEEDED(hr))
{
hr = pNode->SetGUID(MF_TOPONODE_TRANSFORM_OBJECTID, clsid);
}
// Add the node to the topology.
if (SUCCEEDED(hr))
{
hr = pTopology->AddNode(pNode);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppNode = pNode;
(*ppNode)->AddRef();
}
SafeRelease(&pNode);
return hr;
}
Création d’un nœud de transformation à partir d’un objet d’activation
Certains MFTs fournissent des objets d’activation. Par exemple, la fonction MFCreateWMAEncoderActivate retourne un objet d’activation pour l’encodeur Windows Media audio (WMA). La fonction exact dépend de la table MFT. Toutes les MFT fournissent un objet d’activation. Pour plus d’informations, consultez objets d’activation.
Vous pouvez également récupérer un objet d’activation MFT en appelant la fonction MFTEnumEx .
Pour créer un nœud de transformation à partir d’un objet d’activation, procédez comme suit :
- Créez l’objet d’activation et récupérez un pointeur vers l’interface IMFActivate de l’objet d’activation.
- Appelez MFCreateTopologyNode avec l’indicateur de _ nœud de _ transformation _ de topologie MF pour créer le nœud de transformation.
- Appelez IMFTopologyNode :: setObject et transmettez le pointeur IMFActivate .
- Appelez IMFTopology :: AddNode pour ajouter le nœud à la topologie.
L’exemple suivant crée et initialise un nœud Transform à partir d’un objet d’activation.
HRESULT AddTransformNode(
IMFTopology *pTopology, // Topology.
IMFActivate *pActivate, // MFT activation object.
IMFTopologyNode **ppNode // Receives the node pointer.
)
{
*ppNode = NULL;
IMFTopologyNode *pNode = NULL;
// Create the node.
HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);
// Set the object pointer.
if (SUCCEEDED(hr))
{
hr = pNode->SetObject(pActivate);
}
// Add the node to the topology.
if (SUCCEEDED(hr))
{
hr = pTopology->AddNode(pNode);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppNode = pNode;
(*ppNode)->AddRef();
}
SafeRelease(&pNode);
return hr;
}