Création de nœuds de sortie

Un nœud de sortie représente un récepteur de flux sur un récepteur multimédia. Il existe deux façons d’initialiser un nœud de sortie :

  • À partir d’un pointeur vers le récepteur de flux.
  • D’un pointeur vers un objet d’activation pour le récepteur multimédia.

Si vous allez charger la topologie à l’intérieur du chemin d’accès multimédia protégé (PMP), vous devez utiliser un objet d’activation afin que le récepteur multimédia puisse être créé à l’intérieur du processus protégé. La première approche (à l’aide d’un pointeur vers le récepteur de flux) ne fonctionne pas avec le PMP.

Création d’un nœud de sortie à partir d’un récepteur Stream

Pour créer un nœud de sortie à partir d’un récepteur de flux, procédez comme suit :

  1. Créez une instance du récepteur multimédia.
  2. Utilisez l’interface IMFMediaSink du récepteur multimédia pour obtenir un pointeur vers le récepteur de flux souhaité. (L’interface IMFMediaSink a plusieurs méthodes qui retournent des pointeurs vers un récepteur de flux.)
  3. Appelez MFCreateTopologyNode avec l’indicateur MF_TOPOLOGY_OUTPUT_NODE pour créer le nœud de sortie.
  4. Appelez IMFTopologyNode::SetObject et passez un pointeur vers l’interface IMFStreamSink du récepteur de flux.
  5. Définissez l’attribut MF_TOPONODE_NOSHUTDOWN_ON_REMOVE sur FALSE (facultatif mais recommandé).
  6. Appelez IMFTopology::AddNode pour ajouter le nœud à la topologie.

L’exemple suivant crée et initialise un nœud de sortie à partir d’un récepteur de flux.

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

Lorsque l’application arrête la session multimédia, la session multimédia arrête automatiquement le récepteur multimédia. Par conséquent, vous ne pouvez pas réutiliser le récepteur multimédia avec une autre instance de la session multimédia.

Création d’un nœud de sortie à partir d’un objet d’activation

Tout récepteur multimédia approuvé doit fournir un objet d’activation afin que le récepteur multimédia puisse être créé à l’intérieur du processus protégé. Pour plus d’informations, consultez Objets d’activation. La fonction particulière qui crée l’objet d’activation dépend du récepteur multimédia.

Pour créer un nœud de sortie à partir d’un objet d’activation, procédez comme suit :

  1. Créez l’objet d’activation et obtenez un pointeur vers l’interface IMFActivate de l’objet d’activation.
  2. Appelez MFCreateTopologyNode avec l’indicateur MF_TOPOLOGY_OUTPUT_NODE pour créer le nœud de sortie.
  3. Si vous le souhaitez, définissez l’attribut MF_TOPONODE_STREAMID sur le nœud pour spécifier l’identificateur de flux du récepteur de flux. Si vous omettez cet attribut, le nœud utilise par défaut le récepteur de flux 0.
  4. Définissez l’attribut MF_TOPONODE_NOSHUTDOWN_ON_REMOVE sur TRUE (facultatif mais recommandé).
  5. Appelez IMFTopologyNode::SetObject et passez le pointeur IMFActivate .
  6. Appelez IMFTopology::AddNode pour ajouter le nœud à la topologie.

L’exemple suivant crée et initialise un nœud de sortie à partir d’un objet d’activation.

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

Création de topologies

Récepteurs multimédias

Topologies