Özel Topoloji Yükleyicileri
Bir uygulama Medya Oturumu'nda kısmi bir topolojiyi kuyruğa alırsa, Medya Oturumu topolojiyi çözümlemek için bir topoloji yükleyicisi kullanır. Media Oturumu varsayılan olarak topoloji yükleyicisinin standart Media Foundation uygulamasını kullanır, ancak özel bir uygulama da sağlayabilirsiniz. Bu size son topoloji üzerinde daha fazla denetim sağlar. Özel topoloji yükleyicisi, IMFTopoLoader arabirimini uygulamalıdır.
Medya Oturumu'nda özel bir topoloji yükleyicisi ayarlamak için aşağıdakileri yapın:
- MFCreateAttributesçağırarak boş bir öznitelik deposu oluşturun.
- Öznitelik deposunda MF_SESSION_TOPOLOADER özniteliğini ayarlayın. özniteliğinin değeri, özel yükleyicinizin CLSID değeridir.
- Korumasız içerik için Medya Oturumu oluşturmak için MFCreateMediaSessionçağırın veya korumalı medya yolunun (PMP) içinde Medya Oturumu oluşturmak üzere MFCreatePMPMediaSession.
Not
PMP içinde özel topoloji yükleyicisi kullanmak için topoloji yükleyicisi güvenilir bir bileşen olmalıdır. Daha fazla bilgi için bkz. korumalı medya yolu .
Aşağıdaki kod, Medya Oturumu'nda özel topoloji yükleyicisinin nasıl ayarlandığını gösterir.
HRESULT CreateSession_CustomTopoLoader(REFCLSID clsid, IMFMediaSession **ppSession)
{
*ppSession = NULL;
IMFMediaSession *pSession = NULL;
IMFAttributes *pConfig = NULL;
// Create an attribute store to configure the media session.
HRESULT hr = MFCreateAttributes(&pConfig, 1);
// Set the CLSID of the custom topology loader.
if (SUCCEEDED(hr))
{
hr = pConfig->SetGUID(MF_SESSION_TOPOLOADER, clsid);
}
// Create the media session.
if (SUCCEEDED(hr))
{
hr = MFCreateMediaSession(pConfig, &pSession);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppSession = pSession;
(*ppSession)->AddRef();
}
SafeRelease(&pSession);
SafeRelease(&pConfig);
return hr;
}
Topoloji yükleme algoritmanızın tamamını topoloji yükleyicinize uygulamak gerekli değildir. Alternatif olarak, standart Media Foundation topoloji yükleyicisini sarmalayabilirsiniz. IMFTopoLoader::Load yöntemini uygulamanızda topolojiyi gerektiği gibi değiştirin ve değiştirilen topolojiyi standart topoloji yükleyicisine geçirin. Ardından standart topoloji yükleyicisi topolojiyi tamamlar. Tamamlanmış topolojiyi Medya Oturumu'na geri geçirmeden önce de değiştirebilirsiniz.
Aşağıdaki kodda bu yaklaşımın genel ana hattı gösterilmektedir. Bunlar uygulamanızın belirli gereksinimlerine bağlı olacağı için Load yönteminin ayrıntılarını göstermez.
class CTopoLoader : public IMFTopoLoader
{
public:
static HRESULT CreateInstance(REFIID iid, void **ppv)
{
HRESULT hr = S_OK;
CTopoLoader *pTopoLoader = new (std::nothrow) CTopoLoader(&hr);
if (pTopoLoader == NULL)
{
return E_OUTOFMEMORY;
}
if (SUCCEEDED(hr))
{
hr = pTopoLoader->QueryInterface(iid, ppv);
}
SafeRelease(&pTopoLoader);
return hr;
}
// IUnknown methods.
STDMETHODIMP QueryInterface(REFIID riid, void** ppv)
{
static const QITAB qit[] =
{
QITABENT(CTopoLoader, IMFTopoLoader),
{ 0 },
};
return QISearch(this, qit, riid, ppv);
}
STDMETHODIMP_(ULONG) AddRef()
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG) Release()
{
long cRef = InterlockedDecrement(&m_cRef);
if (cRef == 0)
{
delete this;
}
return cRef;
}
// IMTopoLoader methods.
STDMETHODIMP Load(
IMFTopology *pInput,
IMFTopology **ppOutput,
IMFTopology *pCurrent
)
{
HRESULT hr = S_OK;
// TODO: Add custom topology-building code here.
// Modify pInput as needed.
if (SUCCEEDED(hr))
{
hr = m_pTopoLoader->Load(pInput, ppOutput, pCurrent);
}
// TODO: Add custom topology-building code here.
// Modify ppOutput as needed.
return hr;
}
private:
CTopoLoader(HRESULT *phr) : m_cRef(1), m_pTopoLoader(NULL)
{
*phr = MFCreateTopoLoader(&m_pTopoLoader);
}
virtual ~CTopoLoader()
{
SafeRelease(&m_pTopoLoader);
}
private:
long m_cRef; // Reference count.
IMFTopoLoader *m_pTopoLoader; // Standard topoloader.
};
İlgili konular