Bagikan melalui


Membuat Simpul Output

Simpul output mewakili sink aliran pada sink media. Ada dua cara untuk menginisialisasi simpul output:

  • Dari penunjuk ke sink aliran.
  • Dari penunjuk ke objek aktivasi untuk sink media.

Jika Anda akan memuat topologi di dalam jalur media yang dilindungi (PMP), Anda harus menggunakan objek aktivasi, sehingga sink media dapat dibuat di dalam proses yang dilindungi. Pendekatan pertama (menggunakan penunjuk ke sink aliran) tidak berfungsi dengan PMP.

Membuat Simpul Output dari Stream Sink

Untuk membuat simpul output dari sink aliran, lakukan hal berikut:

  1. Buat instans sink media.
  2. Gunakan antarmuka IMFMediaSink sink media untuk mendapatkan penunjuk ke sink aliran yang diinginkan. (Antarmuka IMFMediaSink memiliki beberapa metode yang mengembalikan penunjuk ke sink aliran.)
  3. Panggil MFCreateTopologyNode dengan bendera MF_TOPOLOGY_OUTPUT_NODE untuk membuat simpul output.
  4. Panggil IMFTopologyNode::SetObject dan teruskan penunjuk ke antarmuka IMFStreamSink stream sink .
  5. Atur atribut MF_TOPONODE_NOSHUTDOWN_ON_REMOVE ke FALSE (opsional tetapi direkomendasikan).
  6. Panggil IMFTopology::AddNode untuk menambahkan simpul ke topologi.

Contoh berikut membuat dan menginisialisasi simpul output dari sink aliran.

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

Ketika aplikasi mematikan Sesi Media, Sesi Media secara otomatis mematikan sink media. Oleh karena itu, Anda tidak dapat menggunakan kembali sink media dengan instans lain dari Sesi Media.

Membuat Simpul Output dari Objek Aktivasi

Setiap sink media tepercaya harus menyediakan objek aktivasi, sehingga sink media dapat dibuat di dalam proses yang dilindungi. Untuk informasi selengkapnya, lihat Objek Aktivasi. Fungsi tertentu yang membuat objek aktivasi akan bergantung pada sink media.

Untuk membuat simpul output dari objek aktivasi, lakukan hal berikut:

  1. Buat objek aktivasi dan dapatkan penunjuk ke antarmuka IMFActivate objek aktivasi.
  2. Panggil MFCreateTopologyNode dengan bendera MF_TOPOLOGY_OUTPUT_NODE untuk membuat simpul output.
  3. Secara opsional, atur atribut MF_TOPONODE_STREAMID pada simpul untuk menentukan pengidentifikasi aliran sink. Jika Anda menghilangkan atribut ini, simpul default menggunakan stream sink 0.
  4. Atur atribut MF_TOPONODE_NOSHUTDOWN_ON_REMOVE ke TRUE (opsional tetapi direkomendasikan).
  5. Panggil IMFTopologyNode::SetObject dan berikan penunjuk IMFActivate .
  6. Panggil IMFTopology::AddNode untuk menambahkan simpul ke topologi.

Contoh berikut membuat dan menginisialisasi simpul output dari objek aktivasi.

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

Membuat Topologi

Sink Media

Topologi