创建转换节点

转换节点表示媒体基础转换 (MFT) ,例如解码器或编码器。 有几种不同的方法来初始化转换节点:

  • 从指向 MFT 的指针。
  • 从 MFT 的 CLSID。
  • 从指向 MFT 的激活对象的指针。

如果要在 PMP) 的受保护媒体路径 (加载拓扑,则必须使用 CLSID 或激活对象,以便可以在受保护的进程中创建 MFT。 第一种方法 (使用指向 MFT) 的指针不适用于 PMP。

从 MFT 创建转换节点

若要从 MFT 创建转换节点,请执行以下操作:

  1. 创建 MFT 的实例,并获取指向 MFT 的 IMFTransform 接口的指针。
  2. 使用 MF_TOPOLOGY_TRANSFORM_NODE 标志调用 MFCreateTopologyNode 以创建转换节点。
  3. 调用 IMFTopologyNode::SetObject 并传入 IMFTransform 指针。
  4. 调用 IMFTopology::AddNode 将节点添加到拓扑。

以下示例从 MFT 创建并初始化转换节点。

HRESULT AddTransformNode(
    IMFTopology *pTopology,     // Topology.
    IMFTransform *pMFT,         // MFT.
    IMFTopologyNode **ppNode    // Receives the node pointer.
    )
{
    *ppNode = NULL;

    IMFTopologyNode *pNode = NULL;
    
    // Create the node.
    HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);

    // Set the object pointer.
    if (SUCCEEDED(hr))
    {
        hr = pNode->SetObject(pMFT);
    }

    // Add the node to the topology.
    if (SUCCEEDED(hr))
    {
        hr = pTopology->AddNode(pNode);
    }

    // Return the pointer to the caller.
    if (SUCCEEDED(hr))
    {
        *ppNode = pNode;
        (*ppNode)->AddRef();
    }

    SafeRelease(&pNode);
    return hr;
}

从 CLSID 创建转换节点

若要从 CLSID 创建转换节点,请执行以下操作:

  1. 查找 MFT 的 CLSID。 可以使用 MFTEnum 函数按类别(如解码器或编码器)查找 MFT 的 CLSD。 你可能还知道想要使用的特定 MFT 的 CLSID (例如,如果你实现了自己的自定义 MFT) 。
  2. 使用 MF_TOPOLOGY_TRANSFORM_NODE 标志调用 MFCreateTopologyNode 以创建转换节点。
  3. 在节点上设置 MF_TOPONODE_TRANSFORM_OBJECTID 属性。 属性值为 CLSID。
  4. 调用 IMFTopology::AddNode 将节点添加到拓扑。

以下示例从 CLSID 创建并初始化转换节点。

HRESULT AddTransformNode(
    IMFTopology *pTopology,     // Topology.
    const CLSID& clsid,         // CLSID of the MFT.
    IMFTopologyNode **ppNode    // Receives the node pointer.
    )
{
    *ppNode = NULL;

    IMFTopologyNode *pNode = NULL;
    
    // Create the node.
    HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);

    // Set the CLSID attribute.

    if (SUCCEEDED(hr))
    {
        hr = pNode->SetGUID(MF_TOPONODE_TRANSFORM_OBJECTID, clsid);
    }

    // Add the node to the topology.
    if (SUCCEEDED(hr))
    {
        hr = pTopology->AddNode(pNode);
    }

    // Return the pointer to the caller.
    if (SUCCEEDED(hr))
    {
        *ppNode = pNode;
        (*ppNode)->AddRef();
    }

    SafeRelease(&pNode);
    return hr;
}

从激活对象创建转换节点

某些 MRT 提供激活对象。 例如, MFCreateWMAEncoderActivate 函数返回 Windows Media Audio (WMA) 编码器的激活对象。 确切的函数取决于 MFT。 并非每个 MFT 都提供激活对象。 有关详细信息,请参阅 激活对象

还可以通过调用 MFTEnumEx 函数获取 MFT 激活对象。

若要从激活对象创建转换节点,请执行以下操作:

  1. 创建激活对象并获取指向激活对象的 IMFActivate 接口的指针。
  2. 使用 MF_TOPOLOGY_TRANSFORM_NODE 标志调用 MFCreateTopologyNode 以创建转换节点。
  3. 调用 IMFTopologyNode::SetObject 并传入 IMFActivate 指针。
  4. 调用 IMFTopology::AddNode 将节点添加到拓扑。

以下示例从激活对象创建并初始化转换节点。

HRESULT AddTransformNode(
    IMFTopology *pTopology,     // Topology.
    IMFActivate *pActivate,     // MFT activation object.
    IMFTopologyNode **ppNode    // Receives the node pointer.
    )
{
    *ppNode = NULL;

    IMFTopologyNode *pNode = NULL;
    
    // Create the node.
    HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);

    // Set the object pointer.
    if (SUCCEEDED(hr))
    {
        hr = pNode->SetObject(pActivate);
    }

    // Add the node to the topology.
    if (SUCCEEDED(hr))
    {
        hr = pTopology->AddNode(pNode);
    }

    // Return the pointer to the caller.
    if (SUCCEEDED(hr))
    {
        *ppNode = pNode;
        (*ppNode)->AddRef();
    }

    SafeRelease(&pNode);
    return hr;
}

创建拓扑

拓扑

IMFTopologyNode