Çıkış Düğümleri Oluşturma

Çıkış düğümü, medya havuzundaki bir akış havuzunu temsil eder. Çıkış düğümünü başlatmanın iki yolu vardır:

  • Bir işaretçiden akış havuzuna.
  • Medya havuzu için bir işaretçiden etkinleştirme nesnesine.

Topolojiyi korumalı medya yolunun (PMP) içine yükleyecekseniz, medya havuzu korumalı işlemin içinde oluşturulabilmesi için bir etkinleştirme nesnesi kullanmanız gerekir. İlk yaklaşım (akış havuzuna bir işaretçi kullanarak) PMP ile çalışmaz.

Akış Havuzu'ndan Çıkış Düğümü Oluşturma

Akış havuzundan çıkış düğümü oluşturmak için aşağıdakileri yapın:

  1. Medya havuzu örneğini oluşturun.
  2. İstenen akış havuzuna bir işaretçi almak için medya havuzu IMFMediaSink arabirimini kullanın. (IMFMediaSink arabirimi, bir akış havuzuna işaretçi döndüren çeşitli yöntemlere sahiptir.)
  3. Çıkış düğümünü oluşturmak için MF_TOPOLOGY_OUTPUT_NODE bayrağıyla MFCreateTopologyNode çağırın.
  4. IMFTopologyNode::SetObject çağrısı yapıp bir işaretçiyi akış çıkışının IMFStreamSink arabirimine geçirin.
  5. MF_TOPONODE_NOSHUTDOWN_ON_REMOVE özniteliğini FALSE olarak ayarlayın (isteğe bağlı ancak önerilir).
  6. Düğümü topolojiye eklemek için IMFTopology::AddNode'ı çağırın.

Aşağıdaki örnek, akış havuzundaki bir çıkış düğümünü oluşturur ve başlatır.

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

Uygulama Medya Oturumunu kapattığında, Medya Oturumu medya alıcısını otomatik olarak kapatır. Bu nedenle, başka bir Medya Oturumu örneğiyle medya alıcısını yeniden kullanamazsınız.

Etkinleştirme Nesnesinden Çıkış Düğümü Oluşturma

Medya alıcısının koruma altındaki süreçlerin içinde oluşturulabilmesi için herhangi bir güvenilen medya alıcısının bir etkinleştirme nesnesi sağlaması gerekir. Daha fazla bilgi için bkz. etkinleştirme nesneleri . Etkinleştirme nesnesini oluşturan belirli işlev, medya havuzuna bağlıdır.

Bir etkinleştirme nesnesinden çıkış düğümü oluşturmak için aşağıdakileri yapın:

  1. Etkinleştirme nesnesini oluşturun ve etkinleştirme nesnesinin IMFActivate arabirimine bir işaretçi alın.
  2. Çıkış düğümünü oluşturmak için MF_TOPOLOGY_OUTPUT_NODE bayrağıyla MFCreateTopologyNode çağırın.
  3. İsteğe bağlı olarak, akış havuzunun akış tanımlayıcısını belirtmek için düğümdeki MF_TOPONODE_STREAMID özniteliğini ayarlayın. Bu özniteliği atlarsanız, düğüm varsayılan olarak akış havuzu 0'ı kullanır.
  4. MF_TOPONODE_NOSHUTDOWN_ON_REMOVE özniteliğini TRUE olarak ayarlayın (isteğe bağlı ancak önerilir).
  5. IMFTopologyNode::SetObject çağrısı yapın ve IMFActivate işaretçisini geçirin.
  6. Düğümü topolojiye eklemek için IMFTopology::AddNode'ı çağırın.

Aşağıdaki örnek, bir etkinleştirme nesnesinden çıkış düğümü oluşturur ve başlatır.

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

Topolojiler Oluşturma

Medya Lavaboları

Topolojileri