Share via


変換ノードの作成

変換ノードは、デコーダーやエンコーダーなどの Media Foundation 変換 (MFT) を表します。 変換ノードを初期化するには、いくつかの異なる方法があります。

  • MFT へのポインターから。
  • MFT の CLSID から。
  • MFT のアクティブ化オブジェクトへのポインターから。

保護されたメディア パス (PMP) 内にトポロジを読み込む場合は、保護されたプロセス内で MFT を作成できるように、CLSID またはアクティブ化オブジェクトを使用する必要があります。 最初のアプローチ (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 の CLSID を検索できます。 また、使用する特定の 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;
}

アクティブ化オブジェクトからの変換ノードの作成

一部の MFT では、アクティブ化オブジェクトが提供されます。 たとえば、 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