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 penerima 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 media sink untuk mendapatkan penunjuk ke stream sink yang diinginkan. (Antarmuka IMFMediaSink memiliki beberapa metode yang mengembalikan pointer ke sink aliran.)
  3. Panggil MFCreateTopologyNode dengan bendera MF_TOPOLOGY_OUTPUT_NODE untuk membuat simpul output.
  4. Panggil IMFTopologyNode::SetObject dan operasikan pointer ke antarmuka sink aliran IMFStreamSink .
  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 menghentikan Sesi Media, Sesi Media secara otomatis menghentikan penampung media. Oleh karena itu, Anda tidak dapat menggunakan kembali wadah media dengan instans lainnya dari Sesi Media.

Membuat Node Keluaran dari Objek Aktivasi

Setiap sink media tepercaya harus menyediakan obyek aktivasi, sehingga sink media dapat dibuat di dalam proses yang terlindungi. Untuk informasi selengkapnya, lihat objek aktivasi . Fungsi khusus yang membuat objek aktivasi akan bergantung pada penampung media.

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

  1. Buat objek aktivasi dan dapatkan penunjuk ke antarmuka IMFActivate dari 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 serahkan IMFActivate pointer.
  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

Media Sink

Topologi