원본 노드 만들기

원본 노드는 미디어 원본에서 하나의 스트림을 나타냅니다. 원본 노드에는 미디어 원본, 프레젠테이션 설명자 및 스트림 설명자에 대한 포인터가 포함되어야 합니다.

토폴로지에 원본 노드를 추가하려면 다음을 수행합니다.

  1. MF_TOPOLOGY_SOURCESTREAM_NODE 플래그를 사용하여 MFCreateTopologyNode를 호출하여 원본 노드를 만듭니다.
  2. 미디어 원본에 대한 포인터를 사용하여 노드에서 MF_TOPONODE_SOURCE 특성을 설정합니다.
  3. 미디어 원본의 프레젠테이션 설명자에 대한 포인터를 사용하여 노드에서 MF_TOPONODE_PRESENTATION_DESCRIPTOR 특성을 설정합니다.
  4. 스트림의 스트림 설명자에 대한 포인터를 사용하여 노드에서 MF_TOPONODE_STREAM_DESCRIPTOR 특성을 설정합니다.
  5. IMFTopology::AddNode를 호출하여 토폴로지에 노드를 추가합니다.

다음 예제에서는 원본 노드를 만들고 초기화합니다.

// Add a source node to a topology.
HRESULT AddSourceNode(
    IMFTopology *pTopology,           // Topology.
    IMFMediaSource *pSource,          // Media source.
    IMFPresentationDescriptor *pPD,   // Presentation descriptor.
    IMFStreamDescriptor *pSD,         // Stream descriptor.
    IMFTopologyNode **ppNode)         // Receives the node pointer.
{
    IMFTopologyNode *pNode = NULL;

    // Create the node.
    HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_SOURCESTREAM_NODE, &pNode);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the attributes.
    hr = pNode->SetUnknown(MF_TOPONODE_SOURCE, pSource);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pNode->SetUnknown(MF_TOPONODE_PRESENTATION_DESCRIPTOR, pPD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pNode->SetUnknown(MF_TOPONODE_STREAM_DESCRIPTOR, pSD);
    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