Creazione di nodi di trasformazione
Un nodo di trasformazione rappresenta un Media Foundation Transform (MFT), ad esempio un decoder o un encoder. Esistono diversi modi per inizializzare un nodo di trasformazione:
- Da un puntatore al MFT.
- Da un CLSID per un MFT.
- Da un puntatore a un oggetto di attivazione per MFT.
Se si intende caricare la topologia all'interno del percorso multimediale protetto (PMP), è necessario usare CLSID o un oggetto di attivazione, in modo che il MFT possa essere creato all'interno del processo protetto. Il primo approccio (usando un puntatore all'MFT) non funziona con il PMP.
Creazione di un nodo di trasformazione da un MFT
Per creare un nodo di trasformazione da un MFT, eseguire le operazioni seguenti:
- Creare un'istanza di MFT e ottenere un puntatore all'interfaccia IMFTransform dell'MFT.
- Chiamare MFCreateTopologyNode con il flag MF_TOPOLOGY_TRANSFORM_NODE per creare il nodo di trasformazione.
- Chiamare IMFTopologyNode::SetObject e passare il puntatoreIMFTransform.
- Chiamare IMFTopology::AddNode per aggiungere il nodo alla topologia.
Nell'esempio seguente viene creato e inizializzato un nodo di trasformazione da un 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;
}
Creazione di un nodo di trasformazione da un CLSID
Per creare un nodo di trasformazione da un CLSID, eseguire le operazioni seguenti:
- Trova il CLSID di MFT. È possibile usare la funzione MFTEnum per trovare i CLSID di MFT per categoria, ad esempio decodificatori o codificatori. È anche possibile conoscere il CLSID di un determinato MFT che si vuole usare, ad esempio se è stato implementato un MFT personalizzato.
- Chiamare MFCreateTopologyNode con il flag MF_TOPOLOGY_TRANSFORM_NODE per creare il nodo di trasformazione.
- Impostare l'attributo MF_TOPONODE_TRANSFORM_OBJECTID nel nodo. Il valore dell'attributo è CLSID.
- Chiamare IMFTopology::AddNode per aggiungere il nodo alla topologia.
Nell'esempio seguente viene creato e inizializzato un nodo di trasformazione da 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;
}
Creazione di un nodo di trasformazione da un oggetto di attivazione
Alcune MFP forniscono oggetti di attivazione. Ad esempio, la funzione MFCreateWMAEncoderActivate restituisce un oggetto attivazione per il codificatore Windows Media Audio (WMA). La funzione esatta dipende dalla MFT. Non tutti gli MFT forniscono un oggetto di attivazione. Per altre informazioni, vedere Oggetti di Attivazione.
È anche possibile ottenere un oggetto di attivazione MFT chiamando la funzioneMFTEnumEx.
Per creare un nodo di trasformazione da un oggetto di attivazione, eseguire le operazioni seguenti:
- Creare l'oggetto di attivazione e ottenere un puntatore all'interfaccia IMFActivate dell'oggetto di attivazione.
- Chiamare MFCreateTopologyNode con il flag MF_TOPOLOGY_TRANSFORM_NODE per creare il nodo di trasformazione.
- Chiamare IMFTopologyNode::SetObject e passare il puntatore IMFActivate.
- Chiamare IMFTopology::AddNode per aggiungere il nodo alla topologia.
Nell'esempio seguente viene creato e inizializzato un nodo di trasformazione da un oggetto di attivazione.
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;
}
Argomenti correlati