创建源节点

源节点表示来自媒体源的一个流。 源节点必须包含指向媒体源、演示文稿描述符和流描述符的指针。

若要将源节点添加到拓扑,请执行以下操作:

  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