Creazione di nodi di trasformazione

Un nodo di trasformazione rappresenta una trasformazione Media Foundation (MFT), ad esempio un decodificatore o un codificatore. Esistono diversi modi per inizializzare un nodo di trasformazione:

  • Da un puntatore al MFT.
  • Da un CLSID per MFT.
  • Da un puntatore a un oggetto di attivazione per MFT.

Se si intende caricare la topologia all'interno del percorso multimediale protetto , è necessario usare CLSID o un oggetto attivazione, in modo che il MFT possa essere creato all'interno del processo protetto. Il primo approccio (usando un puntatore a 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:

  1. Creare un'istanza di MFT e ottenere un puntatore all'interfaccia IMFTransform dell'MFT.
  2. Chiamare MFCreateTopologyNode con il flag MF_TOPOLOGY_TRANSFORM_NODE per creare il nodo di trasformazione.
  3. Chiamare IMFTopologyNode::SetObject e passare il puntatore IMFTransform .
  4. Chiamare IMFTopology::AddNode per aggiungere il nodo alla topologia.

Nell'esempio seguente viene creato e inizializzato un nodo di trasformazione da un oggetto 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:

  1. Trovare il CLSID del 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.
  2. Chiamare MFCreateTopologyNode con il flag MF_TOPOLOGY_TRANSFORM_NODE per creare il nodo di trasformazione.
  3. Impostare l'attributo MF_TOPONODE_TRANSFORM_OBJECTID nel nodo. Il valore dell'attributo è CLSID.
  4. 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 attivazione

Alcuni 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 dall'MFT. Non tutti gli MFT forniscono un oggetto di attivazione. Per altre informazioni, vedere Oggetti attivazione.

È anche possibile ottenere un oggetto attivazione MFT chiamando la funzione MFTEnumEx .

Per creare un nodo di trasformazione da un oggetto di attivazione, eseguire le operazioni seguenti:

  1. Creare l'oggetto attivazione e ottenere un puntatore all'interfaccia IMFActivate dell'oggetto attivazione.
  2. Chiamare MFCreateTopologyNode con il flag MF_TOPOLOGY_TRANSFORM_NODE per creare il nodo di trasformazione.
  3. Chiamare IMFTopologyNode::SetObject e passare il puntatore IMFActivate .
  4. Chiamare IMFTopology::AddNode per aggiungere il nodo alla topologia.

Nell'esempio seguente viene creato e inizializzato un nodo di trasformazione da un oggetto 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;
}

Creazione di topologie

Topologie

IMFTopologyNode