출력 노드 만들기
출력 노드는 미디어 싱크의 스트림 싱크를 나타냅니다. 출력 노드를 초기화하는 방법에는 두 가지가 있습니다.
- 포인터에서 스트림 싱크로.
- 미디어 싱크에 대한 활성화 개체에 대한 포인터에서
PMP(보호된 미디어 경로) 내에 토폴로지를 로드하려는 경우 미디어 싱크를 보호된 프로세스 내에 만들 수 있도록 활성화 개체를 사용해야 합니다. 첫 번째 방법(스트림 싱크에 대한 포인터 사용)은 PMP에서 작동하지 않습니다.
스트림 싱크에서 출력 노드 만들기
스트림 싱크에서 출력 노드를 만들려면 다음을 수행합니다.
- 미디어 싱크의 instance 만듭니다.
- 미디어 싱크의 IMFMediaSink 인터페이스를 사용하여 원하는 스트림 싱크에 대한 포인터를 가져옵니다. IMFMediaSink 인터페이스에는 스트림 싱크에 대한 포인터를 반환하는 여러 메서드가 있습니다.
- MF_TOPOLOGY_OUTPUT_NODE 플래그를 사용하여 MFCreateTopologyNode를 호출하여 출력 노드를 만듭니다.
- IMFTopologyNode::SetObject를 호출하고 스트림 싱크의 IMFStreamSink 인터페이스에 대한 포인터를 전달합니다.
- MF_TOPONODE_NOSHUTDOWN_ON_REMOVE 특성을 FALSE로 설정합니다(선택 사항이지만 권장됨).
- 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;
}
애플리케이션이 미디어 세션을 종료하면 미디어 세션이 미디어 싱크를 자동으로 종료합니다. 따라서 미디어 세션의 다른 instance 미디어 싱크를 다시 사용할 수 없습니다.
Activation 개체에서 출력 노드 만들기
모든 신뢰할 수 있는 미디어 싱크는 미디어 싱크를 보호된 프로세스 내에 만들 수 있도록 활성화 개체를 제공해야 합니다. 자세한 내용은 활성화 개체를 참조하세요. 활성화 개체를 만드는 특정 함수는 미디어 싱크에 따라 달라집니다.
활성화 개체에서 출력 노드를 만들려면 다음을 수행합니다.
- 활성화 개체를 만들고 활성화 개체의 IMFActivate 인터페이스에 대한 포인터를 가져옵니다.
- MF_TOPOLOGY_OUTPUT_NODE 플래그를 사용하여 MFCreateTopologyNode를 호출하여 출력 노드를 만듭니다.
- 필요에 따라 노드에서 MF_TOPONODE_STREAMID 특성을 설정하여 스트림 싱크의 스트림 식별자를 지정합니다. 이 특성을 생략하면 노드는 기본적으로 스트림 싱크 0을 사용합니다.
- MF_TOPONODE_NOSHUTDOWN_ON_REMOVE 특성을 TRUE로 설정합니다(선택 사항이지만 권장됨).
- IMFTopologyNode::SetObject를 호출하고 IMFActivate 포인터를 전달합니다.
- 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;
}
관련 항목