Compartir a través de


Creación de nodos de salida

Un nodo de salida representa un receptor de flujo en un receptor multimedia. Hay dos maneras de inicializar un nodo de salida:

  • Desde un puntero al receptor de la secuencia.
  • Desde un puntero a un objeto de activación para el receptor multimedia.

Si va a cargar la topología dentro de la ruta de acceso de medios protegida (PMP), debe usar un objeto de activación para que el receptor de medios se pueda crear dentro del proceso protegido. El primer enfoque (mediante un puntero al receptor de flujo) no funciona con el PMP.

Creación de un nodo de salida a partir de un receptor de flujo

Para crear un nodo de salida a partir de un receptor de flujo, haga lo siguiente:

  1. Cree una instancia del receptor de medios.
  2. Use la interfaz IMFMediaSink del receptor multimedia para obtener un puntero al receptor de flujo deseado. (La interfaz IMFMediaSink tiene varios métodos que devuelven punteros a un receptor de flujo).
  3. Llame a MFCreateTopologyNode con la marca MF_TOPOLOGY_OUTPUT_NODE para crear el nodo de salida.
  4. Llame a IMFTopologyNode::SetObject y pase un puntero a la interfaz IMFStreamSink del receptor de la secuencia.
  5. Establezca el atributo MF_TOPONODE_NOSHUTDOWN_ON_REMOVEen FALSE (opcional pero recomendado).
  6. Llame a IMFTopology::AddNode para agregar el nodo a la topología.

En el ejemplo siguiente se crea e inicializa un nodo de salida a partir de un receptor de flujo.

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

Cuando la aplicación cierra la sesión multimedia, la sesión multimedia apaga automáticamente el receptor de medios. Por lo tanto, no puede volver a usar el receptor de medios con otra instancia de la sesión de medios.

Creación de un nodo de salida a partir de un objeto de activación

Cualquier receptor de medios de confianza debe proporcionar un objeto de activación para que el receptor de medios se pueda crear dentro del proceso protegido. Para obtener más información, vea Objetos de activación. La función determinada que crea el objeto de activación dependerá del receptor de medios.

Para crear un nodo de salida a partir de un objeto de activación, haga lo siguiente:

  1. Cree el objeto de activación y obtenga un puntero a la interfaz IMFActivate del objeto de activación.
  2. Llame a MFCreateTopologyNode con la marca MF_TOPOLOGY_OUTPUT_NODE para crear el nodo de salida.
  3. Opcionalmente, establezca el atributo MF_TOPONODE_STREAMID en el nodo para especificar el identificador de flujo del receptor de secuencia. Si omite este atributo, el nodo usa el receptor de secuencia 0 de forma predeterminada.
  4. Establezca el atributo MF_TOPONODE_NOSHUTDOWN_ON_REMOVE en TRUE (opcional pero recomendado).
  5. Llame a IMFTopologyNode::SetObject y pase el puntero IMFActivate .
  6. Llame a IMFTopology::AddNode para agregar el nodo a la topología.

En el ejemplo siguiente se crea e inicializa un nodo de salida a partir de un objeto de activación.

// 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

Creación de topologías

Receptores de medios

Topologías