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


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

Узел преобразования представляет преобразование 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 (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;
}

создание топологий

Топологии

МВФТопологияУзел