Erstellen von Transformationsknoten

Ein Transformationsknoten stellt eine Media Foundation-Transformation (MFT) dar, z. B. einen Decoder oder Encoder. Es gibt verschiedene Möglichkeiten, einen Transformationsknoten zu initialisieren:

  • Von einem Zeiger auf den MFT.
  • Aus einer CLSID für den MFT.
  • Von einem Zeiger auf ein Aktivierungsobjekt für den MFT.

Wenn Sie die Topologie innerhalb des Geschützten Medienpfads (PMP) laden möchten, müssen Sie entweder die CLSID oder ein Aktivierungsobjekt verwenden, damit der MFT innerhalb des geschützten Prozesses erstellt werden kann. Der erste Ansatz (mithilfe eines Zeigers auf den MFT) funktioniert nicht mit dem PMP.

Erstellen eines Transformationsknotens aus einem MFT

Gehen Sie wie folgt vor, um einen Transformationsknoten aus einem MFT zu erstellen:

  1. Erstellen Sie eine instance des MFT, und rufen Sie einen Zeiger auf die IMFTransform-Schnittstelle des MFT ab.
  2. Rufen Sie MFCreateTopologyNode mit dem flag MF_TOPOLOGY_TRANSFORM_NODE auf, um den Transformationsknoten zu erstellen.
  3. Rufen Sie IMFTopologyNode::SetObject auf , und übergeben Sie den IMFTransform-Zeiger .
  4. Rufen Sie IMFTopology::AddNode auf, um den Knoten der Topologie hinzuzufügen.

Im folgenden Beispiel wird ein Transformationsknoten aus einem MFT erstellt und initialisiert.

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;
}

Erstellen eines Transformationsknotens aus einer CLSID

Gehen Sie wie folgt vor, um einen Transformationsknoten aus einer CLSID zu erstellen:

  1. Suchen Sie die CLSID des MFT. Sie können die MFTEnum-Funktion verwenden, um die CLSIDs von MFTs nach Kategorie zu suchen, z. B. Decoder oder Encoder. Möglicherweise kennen Sie auch die CLSID eines bestimmten MFT, den Sie verwenden möchten (z. B. wenn Sie Eine eigene benutzerdefinierte MFT implementiert haben).
  2. Rufen Sie MFCreateTopologyNode mit dem flag MF_TOPOLOGY_TRANSFORM_NODE auf, um den Transformationsknoten zu erstellen.
  3. Legen Sie das attribut MF_TOPONODE_TRANSFORM_OBJECTID auf dem Knoten fest. Der Attributwert ist die CLSID.
  4. Rufen Sie IMFTopology::AddNode auf, um den Knoten der Topologie hinzuzufügen.

Im folgenden Beispiel wird ein Transformationsknoten aus einer CLSID erstellt und initialisiert.

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;
}

Erstellen eines Transformationsknotens aus einem Aktivierungsobjekt

Einige MFTs stellen Aktivierungsobjekte bereit. Beispielsweise gibt die MFCreateWMAEncoderActivate-Funktion ein Aktivierungsobjekt für den WMA-Encoder (Windows Media Audio) zurück. Die genaue Funktion hängt vom MFT ab. Nicht jedes MFT stellt ein Aktivierungsobjekt bereit. Weitere Informationen finden Sie unter Aktivierungsobjekte.

Sie können auch ein MFT-Aktivierungsobjekt abrufen, indem Sie die MFTEnumEx-Funktion aufrufen.

Gehen Sie wie folgt vor, um einen Transformationsknoten aus einem Aktivierungsobjekt zu erstellen:

  1. Erstellen Sie das Aktivierungsobjekt, und rufen Sie einen Zeiger auf die IMFActivate-Schnittstelle des Aktivierungsobjekts ab.
  2. Rufen Sie MFCreateTopologyNode mit dem flag MF_TOPOLOGY_TRANSFORM_NODE auf, um den Transformationsknoten zu erstellen.
  3. Rufen Sie IMFTopologyNode::SetObject auf , und übergeben Sie den IMFActivate-Zeiger .
  4. Rufen Sie IMFTopology::AddNode auf, um den Knoten der Topologie hinzuzufügen.

Im folgenden Beispiel wird ein Transformationsknoten aus einem Aktivierungsobjekt erstellt und initialisiert.

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;
}

Erstellen von Topologien

Topologien

IMFTopologyNode