다음을 통해 공유


출력 노드 만들기

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

  • 스트림 싱크를 가리키는 포인터에서
  • 미디어 싱크의 활성화 개체를 가리키는 포인터에서

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

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

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

  1. 미디어 싱크의 인스턴스를 만듭니다.
  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;
}

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

활성화 개체에서 출력 노드 만들기

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

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

  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

토폴로지 만들기

미디어 수신 장치

토폴로지