Vytváření výstupních uzlů
Výstupní uzel představuje jímku datového proudu v jímce médií. Výstupní uzel můžete inicializovat dvěma způsoby:
- Z ukazatele na jímku datového proudu.
- Z ukazatele na aktivační objekt pro mediální přijímač.
Pokud chcete načíst topologii uvnitř chráněné cesty média (PMP), musíte použít aktivační objekt, aby bylo možné jímku médií vytvořit uvnitř chráněného procesu. První přístup (pomocí ukazatele na jímku datového proudu) nefunguje s pmP.
Vytvoření výstupního uzlu z jímky streamu
Pokud chcete vytvořit výstupní uzel z jímky datového proudu, postupujte takto:
- Vytvořte instanci jímky médií.
- Pomocí rozhraní IMFMediaSink mediálního přijímače získáte ukazatel na požadovanou streamovou jímku. Rozhraní IMFMediaSink má několik metod, které vracejí ukazatele na streamový dřez.
- Zavolejte MFCreateTopologyNode s příznakem MF_TOPOLOGY_OUTPUT_NODE k vytvoření výstupního uzlu.
- Volejte IMFTopologyNode::SetObject a předejte ukazatel na rozhraní IMFStreamSink.
- Nastavte atribut MF_TOPONODE_NOSHUTDOWN_ON_REMOVE na hodnotu FALSE (volitelné, ale doporučeno).
- Volání IMFTopology::AddNode pro přidání uzlu do topologie.
Následující příklad vytvoří a inicializuje výstupní uzel z výstupního proudového uzlu.
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;
}
Když aplikace vypne relaci médií, relace médií automaticky vypne mediální výstup. Proto nemůžete znovu použít přijímač médií s jinou instancí mediální relace.
Vytvoření výstupního uzlu z aktivačního objektu
Každá důvěryhodná jímka médií musí poskytovat aktivační objekt, aby bylo možné jímku médií vytvořit v rámci chráněného procesu. Další informace naleznete v tématu Aktivační Objekty. Konkrétní funkce, která vytvoří aktivační objekt, bude záviset na mediálním přijímači.
Pokud chcete vytvořit výstupní uzel z aktivačního objektu, postupujte takto:
- Vytvořte aktivační objekt a získejte ukazatel na rozhraní aktivačního objektu IMFActivate.
- Proveďte volání MFCreateTopologyNode s příznakem MF_TOPOLOGY_OUTPUT_NODE pro vytvoření výstupního uzlu.
- Volitelně můžete na uzlu nastavit atribut MF_TOPONODE_STREAMID, abyste určili identifikátor výstupu datového proudu. Pokud tento atribut vynecháte, uzel ve výchozím nastavení použije jímku datového proudu 0.
- Nastavte atribut MF_TOPONODE_NOSHUTDOWN_ON_REMOVE na TRUE (volitelné, ale doporučeno).
- Volejte IMFTopologyNode::SetObject a předejte ukazatel IMFActivate.
- Volání IMFTopology::AddNode přidat uzel do topologie.
Následující příklad vytvoří a inicializuje výstupní uzel z aktivačního objektu.
// 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;
}
Související témata