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


Создание выходных узлов

Выходной узел представляет приемник потока в приемнике мультимедиа. Существует два способа инициализации выходного узла.

  • Из указателя на приемник потока.
  • Из указателя на объект активации для приемника мультимедиа.

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

Создание выходного узла из приемника потока

Чтобы создать выходной узел из приемника потока, сделайте следующее:

  1. Создайте экземпляр приемника мультимедиа.
  2. Используйте интерфейс IMFMediaSink приемника мультимедиа, чтобы получить указатель на нужный приемник потока. (Интерфейс IMFMediaSink имеет несколько методов, возвращающих указатели на приемник потока.)
  3. Вызовите MFCreateTopologyNode с флагом MF_TOPOLOGY_OUTPUT_NODE , чтобы создать выходной узел.
  4. Вызовите IMFTopologyNode::SetObject и передайте указатель на интерфейс IMFStreamSink приемника потока.
  5. Задайте для атрибута MF_TOPONODE_NOSHUTDOWN_ON_REMOVEзначение FALSE (необязательно, но рекомендуется).
  6. Вызовите IMFTopology::AddNode , чтобы добавить узел в топологию.

В следующем примере создается и инициализируется выходной узел из приемника потока.

HRESULT AddOutputNode(
    IMFTopology *pTopology,     // Topology.
    IMFStreamSink *pStreamSink, // Stream sink.
    IMFTopologyNode **ppNode    // Receives the node pointer.
    )
{
    IMFTopologyNode *pNode = NULL;
    HRESULT hr = S_OK;
    
    // Create the node.
    hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pNode);

    // Set the object pointer.
    if (SUCCEEDED(hr))
    {
        hr = pNode->SetObject(pStreamSink);
    }

    // Add the node to the topology.
    if (SUCCEEDED(hr))
    {
        hr = pTopology->AddNode(pNode);
    }

    if (SUCCEEDED(hr))
    {
        hr = pNode->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, TRUE);
    }

    // Return the pointer to the caller.
    if (SUCCEEDED(hr))
    {
        *ppNode = pNode;
        (*ppNode)->AddRef();
    }

    if (pNode)
    {
        pNode->Release();
    }
    return hr;
}

Когда приложение завершает сеанс мультимедиа, сеанс мультимедиа автоматически завершает работу приемника мультимедиа. Поэтому приемник мультимедиа нельзя повторно использовать с другим экземпляром сеанса мультимедиа.

Создание выходного узла из объекта активации

Любой доверенный приемник мультимедиа должен предоставлять объект активации, чтобы приемник мультимедиа можно было создать внутри защищенного процесса. Дополнительные сведения см. в разделе Объекты активации. Конкретная функция, создающая объект активации, будет зависеть от приемника мультимедиа.

Чтобы создать выходной узел из объекта активации, сделайте следующее:

  1. Создайте объект активации и получите указатель на интерфейс IMFActivate объекта активации.
  2. Вызовите MFCreateTopologyNode с флагом MF_TOPOLOGY_OUTPUT_NODE , чтобы создать выходной узел.
  3. При необходимости задайте атрибут MF_TOPONODE_STREAMID на узле, чтобы указать идентификатор потока приемника потока. Если этот атрибут опущен, узел по умолчанию использует приемник потока 0.
  4. Задайте для атрибута MF_TOPONODE_NOSHUTDOWN_ON_REMOVE значение TRUE (необязательно, но рекомендуется).
  5. Вызовите МЕТОД IMFTopologyNode::SetObject и передайте указатель IMFActivate .
  6. Вызовите IMFTopology::AddNode , чтобы добавить узел в топологию.

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

// Add an output node to a topology.
HRESULT AddOutputNode(
    IMFTopology *pTopology,     // Topology.
    IMFActivate *pActivate,     // Media sink activation object.
    DWORD dwId,                 // Identifier of the stream sink.
    IMFTopologyNode **ppNode)   // Receives the node pointer.
{
    IMFTopologyNode *pNode = NULL;

    // Create the node.
    HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pNode);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the object pointer.
    hr = pNode->SetObject(pActivate);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the stream sink ID attribute.
    hr = pNode->SetUINT32(MF_TOPONODE_STREAMID, dwId);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pNode->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, FALSE);
    if (FAILED(hr))
    {
        goto done;
    }

    // Add the node to the topology.
    hr = pTopology->AddNode(pNode);
    if (FAILED(hr))
    {
        goto done;
    }

    // Return the pointer to the caller.
    *ppNode = pNode;
    (*ppNode)->AddRef();

done:
    SafeRelease(&pNode);
    return hr;
}

IMFTopologyNode

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

Приемники мультимедиа

Топологии