Skapa utdatanoder
En utdatanod representerar en strömmottagare på en mediemottagare. Det finns två sätt att initiera en utdatanod:
- Från en pekare till strömmottagaren.
- Från en pekare till ett aktiveringsobjekt för mediemottagaren.
Om du ska läsa in topologin i den skyddade mediesökvägen (PMP) måste du använda ett aktiveringsobjekt så att mediemottagaren kan skapas i den skyddade processen. Den första metoden (med hjälp av en pekare till strömmottagaren) fungerar inte med PMP.
Skapa en utdatanod från en strömsänka
Gör följande för att skapa en utdatanod från ett strömavlopp:
- Skapa en instans av media-sink.
- Använd mediemottagarens IMFMediaSink gränssnitt för att få en pekare till önskad strömmottagare. Det IMFMediaSink--gränssnittet har flera metoder som returnerar pekare till en strömslutsenhet.
- Anropa MFCreateTopologyNode med flaggan MF_TOPOLOGY_OUTPUT_NODE för att skapa utdatanoden.
- Anropa IMFTopologyNode::SetObject och skicka in en pekare till strömmottagarens IMFStreamSink- gränssnitt.
- Ange attributet MF_TOPONODE_NOSHUTDOWN_ON_REMOVE till FALSE (valfritt men rekommenderas).
- Anropa IMFTopology::AddNode för att lägga till noden i topologin.
I följande exempel skapas och initieras en utdatanod från en strömmottagare.
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;
}
När programmet stänger av mediesessionen stänger mediesessionen automatiskt av mediesänkan. Därför kan du inte återanvända mediabufferten med en annan instans av mediasessionen.
Skapa en utdatanod från ett aktiveringsobjekt
Alla betrodda mediemottagare måste tillhandahålla ett aktiveringsobjekt så att mediemottagaren kan skapas i den skyddade processen. Mer information finns i Aktiveringsobjekt. Den specifika funktion som skapar aktiveringsobjektet beror på mediemottagaren.
Gör följande för att skapa en utdatanod från ett aktiveringsobjekt:
- Skapa aktiveringsobjektet och få en pekare till aktiveringsobjektets IMFActivate-gränssnitt.
- Anropa MFCreateTopologyNode med flaggan MF_TOPOLOGY_OUTPUT_NODE för att skapa utdatanoden.
- Du kan också ange attributet MF_TOPONODE_STREAMID på noden för att ange strömidentifieraren för strömmottagaren. Om du utelämnar det här attributet använder noden som standard strömavlopp 0.
- Ange attributet MF_TOPONODE_NOSHUTDOWN_ON_REMOVE till TRUE (valfritt men rekommenderas).
- Anropa IMFTopologyNode::SetObject och skicka in IMFActivate pekare.
- Anropa IMFTopology::AddNode för att lägga till noden i topologin.
I följande exempel skapas och initieras en utdatanod från ett aktiveringsobjekt.
// 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;
}
Relaterade ämnen