创建转换节点
转换节点表示媒体基础转换 (MFT) ,例如解码器或编码器。 有几种不同的方法来初始化转换节点:
- 从指向 MFT 的指针。
- 从 MFT 的 CLSID。
- 从指向 MFT 的激活对象的指针。
如果要在 PMP) 的受保护媒体路径 (加载拓扑,则必须使用 CLSID 或激活对象,以便可以在受保护的进程中创建 MFT。 第一种方法 (使用指向 MFT) 的指针不适用于 PMP。
从 MFT 创建转换节点
若要从 MFT 创建转换节点,请执行以下操作:
- 创建 MFT 的实例,并获取指向 MFT 的 IMFTransform 接口的指针。
- 使用 MF_TOPOLOGY_TRANSFORM_NODE 标志调用 MFCreateTopologyNode 以创建转换节点。
- 调用 IMFTopologyNode::SetObject 并传入 IMFTransform 指针。
- 调用 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 创建转换节点,请执行以下操作:
- 查找 MFT 的 CLSID。 可以使用 MFTEnum 函数按类别(如解码器或编码器)查找 MFT 的 CLSD。 你可能还知道想要使用的特定 MFT 的 CLSID (例如,如果你实现了自己的自定义 MFT) 。
- 使用 MF_TOPOLOGY_TRANSFORM_NODE 标志调用 MFCreateTopologyNode 以创建转换节点。
- 在节点上设置 MF_TOPONODE_TRANSFORM_OBJECTID 属性。 属性值为 CLSID。
- 调用 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 激活对象。
若要从激活对象创建转换节点,请执行以下操作:
- 创建激活对象并获取指向激活对象的 IMFActivate 接口的指针。
- 使用 MF_TOPOLOGY_TRANSFORM_NODE 标志调用 MFCreateTopologyNode 以创建转换节点。
- 调用 IMFTopologyNode::SetObject 并传入 IMFActivate 指针。
- 调用 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;
}
相关主题