변환 노드 만들기

변환 노드는 디코더 또는 인코더와 같은 MFT(Media Foundation 변환)를 나타냅니다. 변환 노드를 초기화하는 방법에는 여러 가지가 있습니다.

  • MFT에 대한 포인터에서
  • MFT에 대한 CLSID에서
  • MFT에 대한 활성화 개체에 대한 포인터에서

PMP(보호된 미디어 경로) 내에 토폴로지를 로드하려는 경우 보호된 프로세스 내에서 MFT를 만들 수 있도록 CLSID 또는 활성화 개체를 사용해야 합니다. 첫 번째 방법(MFT에 대한 포인터 사용)은 PMP에서 작동하지 않습니다.

MFT에서 변환 노드 만들기

MFT에서 변환 노드를 만들려면 다음을 수행합니다.

  1. MFT의 instance 만들고 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;
}

Activation 개체에서 변환 노드 만들기

일부 MFT는 활성화 개체를 제공합니다. 예를 들어 MFCreateWMAEncoderActivate 함수는 WMA(Windows Media Audio) 인코더에 대한 활성화 개체를 반환합니다. 정확한 함수는 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