Criando nós de transformação

Um nó de transformação representa uma MFT (transformação do Media Foundation), como um decodificador ou codificador. Há várias maneiras diferentes de inicializar um nó de transformação:

  • De um ponteiro para o MFT.
  • De um CLSID para o MFT.
  • De um ponteiro para um objeto de ativação para o MFT.

Se você pretende carregar a topologia dentro do PMP (caminho de mídia protegido), use o CLSID ou um objeto de ativação para que o MFT possa ser criado dentro do processo protegido. A primeira abordagem (usando um ponteiro para o MFT) não funciona com o PMP.

Criando um nó de transformação de um MFT

Para criar um nó de transformação de um MFT, faça o seguinte:

  1. Crie uma instância do MFT e obtenha um ponteiro para a interface IMFTransform do MFT.
  2. Chame MFCreateTopologyNode com o sinalizador MF_TOPOLOGY_TRANSFORM_NODE para criar o nó de transformação.
  3. Chame IMFTopologyNode::SetObject e passe o ponteiro IMFTransform .
  4. Chame IMFTopology::AddNode para adicionar o nó à topologia.

O exemplo a seguir cria e inicializa um nó de transformação de um 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;
}

Criando um nó de transformação de um CLSID

Para criar um nó de transformação de um CLSID, faça o seguinte:

  1. Localize o CLSID do MFT. Você pode usar a função MFTEnum para localizar os CLSIDs de MFTs por categoria, como decodificadores ou codificadores. Você também pode conhecer o CLSID de um MFT específico que deseja usar (por exemplo, se você implementou seu próprio MFT personalizado).
  2. Chame MFCreateTopologyNode com o sinalizador MF_TOPOLOGY_TRANSFORM_NODE para criar o nó de transformação.
  3. Defina o atributo MF_TOPONODE_TRANSFORM_OBJECTID no nó. O valor do atributo é o CLSID.
  4. Chame IMFTopology::AddNode para adicionar o nó à topologia.

O exemplo a seguir cria e inicializa um nó de transformação de um 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;
}

Criando um nó de transformação de um objeto de ativação

Alguns MFTs fornecem objetos de ativação. Por exemplo, a função MFCreateWMAEncoderActivate retorna um objeto de ativação para o codificador WMA (Windows Media Audio). A função exata depende do MFT. Nem todo MFT fornece um objeto de ativação. Para obter mais informações, consulte Objetos de ativação.

Você também pode obter um objeto de ativação MFT chamando a função MFTEnumEx .

Para criar um nó de transformação de um objeto de ativação, faça o seguinte:

  1. Crie o objeto de ativação e obtenha um ponteiro para a interface IMFActivate do objeto de ativação.
  2. Chame MFCreateTopologyNode com o sinalizador MF_TOPOLOGY_TRANSFORM_NODE para criar o nó de transformação.
  3. Chame IMFTopologyNode::SetObject e passe o ponteiro IMFActivate .
  4. Chame IMFTopology::AddNode para adicionar o nó à topologia.

O exemplo a seguir cria e inicializa um nó de transformação de um objeto de ativação.

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

Criando topologias

Topologias

IMFTopologyNode