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


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

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

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

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

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

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

  1. Создайте экземпляр приемника мультимедиа.
  2. Используйте интерфейс приемника мультимедиа МВФMediaSink, чтобы получить указатель на нужный приемник потока. Интерфейс 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. Создайте объект активации и получите указатель на интерфейс объекта активации.
  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;
}

МВФTopologyNode

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

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

топологии