変換ノードの作成
変換ノードは、デコーダーやエンコーダーなどの Media Foundation 変換 (MFT) を表します。 変換ノードを初期化するには、いくつかの異なる方法があります。
- MFT へのポインターから。
- MFT の CLSID から。
- MFT のアクティブ化オブジェクトへのポインターから。
保護されたメディア パス (PMP) 内にトポロジを読み込む場合は、保護されたプロセス内で MFT を作成できるように、CLSID またはアクティブ化オブジェクトを使用する必要があります。 最初のアプローチ (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 の CLSID を検索できます。 また、使用する特定の 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;
}
アクティブ化オブジェクトからの変換ノードの作成
一部の MFT では、アクティブ化オブジェクトが提供されます。 たとえば、 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;
}
関連トピック