출력 노드 만들기

출력 노드는 미디어 싱크의 스트림 싱크를 나타냅니다. 출력 노드를 초기화하는 방법에는 두 가지가 있습니다.

  • 포인터에서 스트림 싱크로.
  • 미디어 싱크에 대한 활성화 개체에 대한 포인터에서

PMP(보호된 미디어 경로) 내에 토폴로지를 로드하려는 경우 미디어 싱크를 보호된 프로세스 내에 만들 수 있도록 활성화 개체를 사용해야 합니다. 첫 번째 방법(스트림 싱크에 대한 포인터 사용)은 PMP에서 작동하지 않습니다.

스트림 싱크에서 출력 노드 만들기

스트림 싱크에서 출력 노드를 만들려면 다음을 수행합니다.

  1. 미디어 싱크의 instance 만듭니다.
  2. 미디어 싱크의 IMFMediaSink 인터페이스를 사용하여 원하는 스트림 싱크에 대한 포인터를 가져옵니다. IMFMediaSink 인터페이스에는 스트림 싱크에 대한 포인터를 반환하는 여러 메서드가 있습니다.
  3. MF_TOPOLOGY_OUTPUT_NODE 플래그를 사용하여 MFCreateTopologyNode를 호출하여 출력 노드를 만듭니다.
  4. IMFTopologyNode::SetObject를 호출하고 스트림 싱크의 IMFStreamSink 인터페이스에 대한 포인터를 전달합니다.
  5. MF_TOPONODE_NOSHUTDOWN_ON_REMOVE 특성을 FALSE로 설정합니다(선택 사항이지만 권장됨).
  6. IMFTopology::AddNode를 호출하여 토폴로지에 노드를 추가합니다.

다음 예제에서는 스트림 싱크에서 출력 노드를 만들고 초기화합니다.

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

애플리케이션이 미디어 세션을 종료하면 미디어 세션이 미디어 싱크를 자동으로 종료합니다. 따라서 미디어 세션의 다른 instance 미디어 싱크를 다시 사용할 수 없습니다.

Activation 개체에서 출력 노드 만들기

모든 신뢰할 수 있는 미디어 싱크는 미디어 싱크를 보호된 프로세스 내에 만들 수 있도록 활성화 개체를 제공해야 합니다. 자세한 내용은 활성화 개체를 참조하세요. 활성화 개체를 만드는 특정 함수는 미디어 싱크에 따라 달라집니다.

활성화 개체에서 출력 노드를 만들려면 다음을 수행합니다.

  1. 활성화 개체를 만들고 활성화 개체의 IMFActivate 인터페이스에 대한 포인터를 가져옵니다.
  2. MF_TOPOLOGY_OUTPUT_NODE 플래그를 사용하여 MFCreateTopologyNode를 호출하여 출력 노드를 만듭니다.
  3. 필요에 따라 노드에서 MF_TOPONODE_STREAMID 특성을 설정하여 스트림 싱크의 스트림 식별자를 지정합니다. 이 특성을 생략하면 노드는 기본적으로 스트림 싱크 0을 사용합니다.
  4. MF_TOPONODE_NOSHUTDOWN_ON_REMOVE 특성을 TRUE로 설정합니다(선택 사항이지만 권장됨).
  5. IMFTopologyNode::SetObject를 호출하고 IMFActivate 포인터를 전달합니다.
  6. IMFTopology::AddNode를 호출하여 토폴로지에 노드를 추가합니다.

다음 예제에서는 활성화 개체에서 출력 노드를 만들고 초기화합니다.

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

토폴로지 만들기

미디어 싱크

토폴로지