Egyéni allokátor biztosítása
[A laphoz társított funkció, DirectShowegy régi funkció. Ezt felváltotta a MediaPlayer, a IMFMediaEngineés a Media Foundation Audio/Video Capture. Ezek a funkciók Windows 10-hez és Windows 11-hez lettek optimalizálva. A Microsoft határozottan javasolja, hogy az új kód MediaPlayer, IMFMediaEngine és a Media Foundation Audio/Video rögzítést használja a DirectShowhelyett, ha lehetséges. A Microsoft javasolja, hogy az örökölt API-kat használó meglévő kódot át kell írni az új API-k használatára, ha lehetséges.]
Ez a szakasz azt ismerteti, hogyan adhat meg egyéni memória allokátort egy szűrőhöz. Csak IMemInputPin kapcsolatokat ismertetjük, de az IAsyncReader kapcsolat lépései hasonlóak.
Először határozzon meg egy C++ osztályt az elosztó számára. A kiosztó származhat az egyik standard kiosztóosztályból, CBaseAllocator vagy CMemAllocator, vagy létrehozhat egy teljesen új allokátorosztályt. Ha új osztályt hoz létre, az IMemAllocator felületet kell elérhetővé tennie.
A fennmaradó lépések attól függenek, hogy az elosztó egy bemeneti vagy egy kimeneti tűhöz tartozik-e a szűrőn. A bemeneti csapok más szerepet játszanak, mint a kimeneti csapok a kiosztási egyeztetési fázisban, mivel a kimeneti pin végül kiválasztja az elosztót.
Egyéni allokátor megadása bemeneti tűhöz
Ha kiosztót szeretne adni egy bemeneti pinhez, írja felül a bemeneti pin CBaseInputPin::GetAllocator metódust. Ebben a metódusban ellenőrizze a m_pAllocator tagváltozót. Ha ez a változó nemNULL, az azt jelenti, hogy a kiosztó már ki van jelölve ehhez a kapcsolathoz, ezért a GetAllocator metódusnak vissza kell adnia egy mutatót az adott kiosztóhoz. Ha m_pAllocatorNULL, az azt jelenti, hogy a kiosztó nincs kiválasztva, ezért a GetAllocator metódusnak a bemeneti csatlakozó előnyben részesített kiosztójára mutatót kell visszaadnia. Ebben az esetben hozzon létre egy példányt az egyéni kiosztóból, és adja vissza a IMemAllocator mutatót. Az alábbi kód bemutatja, hogyan implementálhatja a GetAllocator metódust:
STDMETHODIMP CMyInputPin::GetAllocator(IMemAllocator **ppAllocator)
{
CheckPointer(ppAllocator, E_POINTER);
if (m_pAllocator)
{
// We already have an allocator, so return that one.
*ppAllocator = m_pAllocator;
(*ppAllocator)->AddRef();
return S_OK;
}
// No allocator yet, so propose our custom allocator. The exact code
// here will depend on your custom allocator class definition.
HRESULT hr = S_OK;
CMyAllocator *pAlloc = new CMyAllocator(&hr);
if (!pAlloc)
{
return E_OUTOFMEMORY;
}
if (FAILED(hr))
{
delete pAlloc;
return hr;
}
// Return the IMemAllocator interface to the caller.
return pAlloc->QueryInterface(IID_IMemAllocator, (void**)ppAllocator);
}
Amikor a felfelé irányuló szűrő kiválaszt egy allokátort, meghívja a bemeneti tű IMemInputPin::NotifyAllocator metódust. Bírálja felül a CBaseInputPin::NotifyAllocator metódust az elosztó tulajdonságainak ellenőrzéséhez. Bizonyos esetekben előfordulhat, hogy a bemeneti pin elutasítja az allokátort, ha nem a saját allokátora, bár ez a teljes kapcsolat meghiúsulását okozhatja.
Egyéni kiosztó biztosítása egy kimeneti csaphoz
Ha elosztót szeretne biztosítani egy kimeneti pinhez, írja felül a CBaseOutputPin::InitAllocator metódust, hogy létrehozza az elosztó példányát.
HRESULT MyOutputPin::InitAllocator(IMemAllocator **ppAllocator)
{
HRESULT hr = S_OK;
CMyAllocator *pAlloc = new CMyAllocator(&hr);
if (!pAlloc)
{
return E_OUTOFMEMORY;
}
if (FAILED(hr))
{
delete pAlloc;
return hr;
}
// Return the IMemAllocator interface.
return pAlloc->QueryInterface(IID_IMemAllocator, (void**)ppAllocator);
}
Alapértelmezés szerint a CBaseOutputPin osztály először egy kiosztót kér a bemeneti pintől. Ha ez a kiosztó nem megfelelő, a kimeneti pin létrehozza a saját kiosztóját. Ha az egyéni allokátor használatára szeretné kényszeríteni a kapcsolatot, írja felül a CBaseOutputPin::DecideAllocator metódust. Azonban vegye figyelembe, hogy ez megakadályozhatja, hogy a kimeneti pin bizonyos szűrőkhöz csatlakozzon, mert a másik szűrőhöz saját egyéni kiosztó is szükséges lehet. A harmadik lehetőség a sorrend váltása: Először próbálja ki az egyéni kiosztót, majd térjen vissza a másik szűrő kiosztójára.
Kapcsolódó témakörök