Поделиться через


Создание узлов преобразования

Узел преобразования представляет собой преобразование Media Foundation (MFT), например декодер или кодировщик. Существует несколько различных способов инициализации узла преобразования.

  • Из указателя на MFT.
  • Из CLSID для MFT.
  • Из указателя на объект активации для MFT.

Если вы собираетесь загрузить топологию в путь защищенного носителя (PMP), необходимо использовать идентификатор CLSID или объект активации, чтобы можно было создать MFT внутри защищенного процесса. Первый подход (с использованием указателя на MFT) не работает с PMP.

Создание узла преобразования из MFT

Чтобы создать узел преобразования из MFT, выполните следующие действия.

  1. Создайте экземпляр MFT и получите указатель на интерфейс IMFTransform MFT.
  2. Вызовите MFCreateTopologyNode с флагом MF_TOPOLOGY_TRANSFORM_NODE , чтобы создать узел преобразования.
  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. Найдите ИДЕНТИФИКАТОР CLSID MFT. Функцию MFTEnum можно использовать для поиска идентификаторов CLSID MFT по категориям, например декодеров или кодировщиков. Вы также можете знать CLSID конкретного MFT, который вы хотите использовать (например, если вы реализовали собственный пользовательский MFT).
  2. Вызовите MFCreateTopologyNode с флагом MF_TOPOLOGY_TRANSFORM_NODE , чтобы создать узел преобразования.
  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 предоставляет объект активации. Дополнительные сведения см. в разделе Объекты активации.

Вы также можете получить объект активации MFT, вызвав функцию MFTEnumEx .

Чтобы создать узел преобразования из объекта активации, выполните следующие действия.

  1. Создайте объект активации и получите указатель на интерфейс IMFActivate объекта активации.
  2. Вызовите MFCreateTopologyNode с флагом MF_TOPOLOGY_TRANSFORM_NODE , чтобы создать узел преобразования.
  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