Creación de nodos de transformación
Un nodo de transformación representa una transformación de Media Foundation (MFT), como un descodificador o codificador. Hay varias maneras diferentes de inicializar un nodo de transformación:
- Desde un puntero al MFT.
- Desde un CLSID para el MFT.
- Desde un puntero a un objeto de activación para el MFT.
Si va a cargar la topología dentro de la ruta de acceso de medios protegidas (PMP), debe usar clSID o un objeto de activación para que se pueda crear el MFT dentro del proceso protegido. El primer enfoque (mediante un puntero al MFT) no funciona con el PMP.
Creación de un nodo de transformación a partir de un MFT
Para crear un nodo de transformación a partir de un MFT, haga lo siguiente:
- Cree una instancia del MFT y obtenga un puntero a la interfaz IMFTransform del MFT.
- Llame a MFCreateTopologyNode con la marca MF_TOPOLOGY_TRANSFORM_NODE para crear el nodo de transformación.
- Llame a IMFTopologyNode::SetObject y pase el puntero IMFTransform .
- Llame a IMFTopology::AddNode para agregar el nodo a la topología.
En el ejemplo siguiente se crea e inicializa un nodo de transformación a partir de un MFT.
HRESULT AddTransformNode(
IMFTopology *pTopology, // Topology.
IMFTransform *pMFT, // MFT.
IMFTopologyNode **ppNode // Receives the node pointer.
)
{
*ppNode = NULL;
IMFTopologyNode *pNode = NULL;
// Create the node.
HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);
// Set the object pointer.
if (SUCCEEDED(hr))
{
hr = pNode->SetObject(pMFT);
}
// Add the node to the topology.
if (SUCCEEDED(hr))
{
hr = pTopology->AddNode(pNode);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppNode = pNode;
(*ppNode)->AddRef();
}
SafeRelease(&pNode);
return hr;
}
Creación de un nodo de transformación a partir de un CLSID
Para crear un nodo de transformación a partir de un CLSID, haga lo siguiente:
- Busque el CLSID del MFT. Puede usar la función MFTEnum para buscar los CLSID de MFT por categoría, como descodificadores o codificadores. También puede conocer el CLSID de un MFT determinado que desea usar (por ejemplo, si ha implementado su propio MFT personalizado).
- Llame a MFCreateTopologyNode con la marca MF_TOPOLOGY_TRANSFORM_NODE para crear el nodo de transformación.
- Establezca el atributo MF_TOPONODE_TRANSFORM_OBJECTID en el nodo. El valor del atributo es clSID.
- Llame a IMFTopology::AddNode para agregar el nodo a la topología.
En el ejemplo siguiente se crea e inicializa un nodo de transformación a partir de un CLSID.
HRESULT AddTransformNode(
IMFTopology *pTopology, // Topology.
const CLSID& clsid, // CLSID of the MFT.
IMFTopologyNode **ppNode // Receives the node pointer.
)
{
*ppNode = NULL;
IMFTopologyNode *pNode = NULL;
// Create the node.
HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);
// Set the CLSID attribute.
if (SUCCEEDED(hr))
{
hr = pNode->SetGUID(MF_TOPONODE_TRANSFORM_OBJECTID, clsid);
}
// Add the node to the topology.
if (SUCCEEDED(hr))
{
hr = pTopology->AddNode(pNode);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppNode = pNode;
(*ppNode)->AddRef();
}
SafeRelease(&pNode);
return hr;
}
Crear un nodo de transformación a partir de un objeto de activación
Algunas MFT proporcionan objetos de activación. Por ejemplo, la función MFCreateWMAEncoderActivate devuelve un objeto de activación para el codificador Windows Media Audio (WMA). La función exacta depende del MFT. No todas las MFT proporcionan un objeto de activación. Para obtener más información, vea Objetos de activación.
También puede obtener un objeto de activación MFT llamando a la función MFTEnumEx .
Para crear un nodo de transformación a partir de un objeto de activación, haga lo siguiente:
- Cree el objeto de activación y obtenga un puntero a la interfaz IMFActivate del objeto de activación.
- Llame a MFCreateTopologyNode con la marca MF_TOPOLOGY_TRANSFORM_NODE para crear el nodo de transformación.
- Llame a IMFTopologyNode::SetObject y pase el puntero IMFActivate .
- Llame a IMFTopology::AddNode para agregar el nodo a la topología.
En el ejemplo siguiente se crea e inicializa un nodo de transformación a partir de un objeto de activación.
HRESULT AddTransformNode(
IMFTopology *pTopology, // Topology.
IMFActivate *pActivate, // MFT activation object.
IMFTopologyNode **ppNode // Receives the node pointer.
)
{
*ppNode = NULL;
IMFTopologyNode *pNode = NULL;
// Create the node.
HRESULT hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pNode);
// Set the object pointer.
if (SUCCEEDED(hr))
{
hr = pNode->SetObject(pActivate);
}
// Add the node to the topology.
if (SUCCEEDED(hr))
{
hr = pTopology->AddNode(pNode);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppNode = pNode;
(*ppNode)->AddRef();
}
SafeRelease(&pNode);
return hr;
}
Temas relacionados