Vytváření uzlů pro transformaci

Transformační uzel představuje transformaci Media Foundation (MFT), jako je dekodér nebo kodér. Existuje několik různých způsobů, jak inicializovat transformační uzel:

  • Od ukazatele na MFT.
  • Z CLSID pro MFT.
  • Z ukazatele na aktivační objekt MFT.

Pokud chcete načíst topologii uvnitř chráněné cesty média (PMP), musíte použít buď CLSID, nebo aktivační objekt, aby bylo možné MFT vytvořit uvnitř chráněného procesu. První přístup (pomocí ukazatele na MFT) nefunguje s PMP.

Vytvoření transformačního uzlu z MFT

Pokud chcete vytvořit transformační uzel z MFT, postupujte takto:

  1. Vytvořte instanci MFT a získejte ukazatel na IMFTransform rozhraní MFT.
  2. Proveďte volání MFCreateTopologyNode s příznakem MF_TOPOLOGY_TRANSFORM_NODE pro vytvoření uzlu transformace.
  3. Volejte IMFTopologyNode::SetObject a předejte ukazatel IMFTransform.
  4. Volání IMFTopology::AddNode přidat uzel do topologie.

Následující příklad vytvoří a inicializuje transformační uzel z 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;
}

Vytvoření uzlu transformace z CLSID

Pokud chcete vytvořit transformační uzel z CLSID, postupujte takto:

  1. Vyhledejte CLSID MFT. Pomocí funkce MFTEnum můžete vyhledat identifikátory CLSID MFT podle kategorií, jako jsou dekodéry nebo kodéry. Můžete také znát CLSID konkrétního MFT, který chcete použít (například pokud jste implementovali vlastní MFT).
  2. Volání MFCreateTopologyNode s příznakem MF_TOPOLOGY_TRANSFORM_NODE pro vytvoření uzlu transformace.
  3. Nastavte atribut MF_TOPONODE_TRANSFORM_OBJECTID na uzlu. Hodnota atributu je CLSID.
  4. Volání IMFTopology::AddNode k přidání uzlu do topologie.

Následující příklad vytvoří a inicializuje transformační uzel z 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;
}

Vytvoření uzlu transformace z aktivačního objektu

Některé MFT poskytují aktivační objekty. Například funkce MFCreateWMAEncoderActivate vrátí aktivační objekt kodéru WMA (Windows Media Audio). Přesná funkce závisí na MFT. Ne každý MFT poskytuje aktivační objekt. Další informace naleznete v tématu Aktivační objekty.

Aktivační objekt MFT můžete získat také voláním funkce MFTEnumEx.

Pokud chcete vytvořit transformační uzel z aktivačního objektu, postupujte takto:

  1. Vytvořte aktivační objekt a získejte ukazatel na MMFActivate rozhraní aktivačního objektu.
  2. Pro zavolání MFCreateTopologyNode použijte příznak MF_TOPOLOGY_TRANSFORM_NODE k vytvoření uzlu transformace.
  3. Volejte IMFTopologyNode::SetObject a předejte ukazatel IMFActivate.
  4. Volání IMFTopology::AddNode k přidání uzlu do topologie.

Následující příklad vytvoří a inicializuje transformační uzel z aktivačního objektu.

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

vytváření topologií

topologie

IMFTopologyNode