Partilhar via


Criar nós de saída

Um nó de saída representa um coletor de fluxo em um coletor de mídia. Há duas maneiras de inicializar um nó de saída:

  • De um ponteiro para o receptor de fluxo.
  • De um ponteiro para um objeto de ativação para o coletor de mídia.

Se você for carregar a topologia dentro do caminho de mídia protegido (PMP), deverá usar um objeto de ativação, para que o coletor de mídia possa ser criado dentro do processo protegido. A primeira abordagem (usando um ponteiro para o coletor de fluxo) não funciona com o PMP.

Criando um nó de saída a partir de um coletor de fluxo

Para criar um nó de saída a partir de um coletor de fluxo, faça o seguinte:

  1. Crie uma instância do coletor de mídia.
  2. Use o coletor de mídia interface de IMFMediaSink para obter um ponteiro para o coletor de fluxo desejado. (A interface do IMFMediaSink tem vários métodos que retornam ponteiros para um sumidouro de fluxo.)
  3. Chame MFCreateTopologyNode com o indicador MF_TOPOLOGY_OUTPUT_NODE para criar um nó de saída.
  4. Chame IMFTopologyNode::SetObject e passe um ponteiro para a interface IMFStreamSink do sumidouro de fluxo.
  5. Defina o atributo MF_TOPONODE_NOSHUTDOWN_ON_REMOVE como FALSE (opcional, mas recomendado).
  6. Chame IMFTopology::AddNode para adicionar o nó à topologia.

O exemplo a seguir cria e inicializa um nó de saída de um coletor de fluxo.

HRESULT AddOutputNode(
    IMFTopology *pTopology,     // Topology.
    IMFStreamSink *pStreamSink, // Stream sink.
    IMFTopologyNode **ppNode    // Receives the node pointer.
    )
{
    IMFTopologyNode *pNode = NULL;
    HRESULT hr = S_OK;
    
    // Create the node.
    hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pNode);

    // Set the object pointer.
    if (SUCCEEDED(hr))
    {
        hr = pNode->SetObject(pStreamSink);
    }

    // Add the node to the topology.
    if (SUCCEEDED(hr))
    {
        hr = pTopology->AddNode(pNode);
    }

    if (SUCCEEDED(hr))
    {
        hr = pNode->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, TRUE);
    }

    // Return the pointer to the caller.
    if (SUCCEEDED(hr))
    {
        *ppNode = pNode;
        (*ppNode)->AddRef();
    }

    if (pNode)
    {
        pNode->Release();
    }
    return hr;
}

Quando o aplicativo desliga a Sessão de Mídia, a Sessão de Mídia desliga automaticamente o coletor de mídia. Portanto, você não pode reutilizar o coletor de mídia com outra instância da sessão de mídia.

Criando um nó de saída a partir de um objeto de ativação

Qualquer coletor de mídia confiável deve fornecer um objeto de ativação, para que o coletor de mídia possa ser criado dentro do processo protegido. Para obter mais informações, consulte Objetos de Ativação. A função específica que cria o objeto de ativação dependerá do coletor de mídia.

Para criar um nó de saída a partir 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 indicador MF_TOPOLOGY_OUTPUT_NODE para criar o nó de saída.
  3. Opcionalmente, defina o atributo MF_TOPONODE_STREAMID no nó para especificar o identificador de fluxo do ponto de receção de fluxo. Se você omitir esse atributo, o nó assume como padrão usar o coletor de fluxo 0.
  4. Defina o atributo MF_TOPONODE_NOSHUTDOWN_ON_REMOVE como TRUE (opcional, mas recomendado).
  5. Chame IMFTopologyNode::SetObject e passe o ponteiroIMFActivate.
  6. Execute IMFTopology::AddNode para integrar o nó à topologia.

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

// Add an output node to a topology.
HRESULT AddOutputNode(
    IMFTopology *pTopology,     // Topology.
    IMFActivate *pActivate,     // Media sink activation object.
    DWORD dwId,                 // Identifier of the stream sink.
    IMFTopologyNode **ppNode)   // Receives the node pointer.
{
    IMFTopologyNode *pNode = NULL;

    // Create the node.
    HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pNode);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the object pointer.
    hr = pNode->SetObject(pActivate);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the stream sink ID attribute.
    hr = pNode->SetUINT32(MF_TOPONODE_STREAMID, dwId);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pNode->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, FALSE);
    if (FAILED(hr))
    {
        goto done;
    }

    // Add the node to the topology.
    hr = pTopology->AddNode(pNode);
    if (FAILED(hr))
    {
        goto done;
    }

    // Return the pointer to the caller.
    *ppNode = pNode;
    (*ppNode)->AddRef();

done:
    SafeRelease(&pNode);
    return hr;
}

IMFTopologyNode

Criação de topologias

Sumidouros de Mídia

Topologias