Állapotok szűrése
[A laphoz társított funkció, DirectShowegy régi funkció. MediaPlayer, IMFMediaEngineés Audio/Video Capture a Media Foundation. 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 Audio/Video Capture eszközt használja a Media FoundationDirectShowhelyett, 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.]
A szűrőknek három lehetséges állapotuk van: leállítva, szüneteltetve és futva. A szüneteltetett állapot célja, hogy adatokat jelöljön ki a gráfban, hogy a futtatási parancs azonnal válaszoljon. A Filter Graph Manager az összes állapotáttűnést vezérli. Amikor egy alkalmazás meghívja IMediaControl::Run, IMediaControl::P ausevagy IMediaControl::Stop, a Filter Graph Manager meghívja a megfelelő IMediaFilter metódust az összes szűrőn. A leállított és a futtatás közötti áttűnések mindig a szüneteltetett állapoton mennek keresztül, így ha az alkalmazás meghívja a futtatása leállított gráfon, a Filter Graph Manager a futtatás előtt szünetelteti a gráfot.
A legtöbb szűrő esetében a futó és a szüneteltetett állapot azonos. Fontolja meg a következő szűrőgráfot:
Forrás > Átalakító > Renderer
Tegyük fel, hogy a forrásszűrő egyelőre nem élő rögzítési forrás. Amikor a forrásszűrő szünetel, létrehoz egy szálat, amely új adatokat hoz létre, és a lehető leggyorsabban médiamintákba írja őket. A szál az IMemInputPin::Receive meghívásával "leküldi" a mintákat az átalakítási szűrő bemeneti tűjén. Az átalakító szűrő fogadja a mintákat a forrásszűrő szálán. Előfordulhat, hogy egy feldolgozó szál használatával kézbesíti a mintákat a renderelőnek, de általában ugyanazon a szálon kézbesíti őket. Amíg a renderelő szüneteltetve van, megvárja a minta fogadását. Miután megkapta az egyiket, korlátlan ideig blokkolja és tárolja a mintát. Ha ez egy videó renderelő, akkor plakátképként jeleníti meg a mintát, és szükség szerint újrafesti a képet.
Ezen a ponton a stream teljesen ki van jelölve, és készen áll a renderelésre. Ha a gráf szüneteltetve marad, a minták az első minta mögötti gráfban "halmozódnak fel", amíg minden szűrő le nem tiltódik Fogadás vagy IMemAllocator::GetBuffer. Azonban nincs adatvesztés. A forrásszál blokkolásának feloldása után egyszerűen folytatódik attól a ponttól kezdve, ahol letiltotta.
A forrásszűrő és az átalakító szűrő figyelmen kívül hagyja a szüneteltetettről a futtatásra való áttérést – egyszerűen csak a lehető leggyorsabban dolgozzák fel az adatokat. A renderelő futtatásakor azonban megkezdi a minták renderelését. Először megjeleníti a szüneteltetés alatt tárolt mintát. Ezután minden alkalommal, amikor új mintát kap, kiszámítja a minta bemutatóidejét. (További információ: Time and Clocks in DirectShow.) A renderelő az egyes mintákat a bemutató időpontjáig tárolja, és ekkor jeleníti meg a mintát. Amíg megvárja a bemutató időpontját, a fogadása metódust blokkolja, vagy új mintákat fogad egy üzenetsort tartalmazó feldolgozó szálon. A renderelőtől felfelé irányuló szűrők nem vesznek részt az ütemezésben.
Az általános architektúra alól kivételt képeznek az élő források, például a rögzítési eszközök. Élő forrás esetén nem célszerű előre adatokat kiválogatni. Előfordulhat, hogy az alkalmazás szünetelteti a gráfot, majd hosszú ideig várakozik a futtatás előtt. A gráf nem jeleníthet meg "elavult" mintákat. Ezért az élő forrás nem hoz létre mintákat szüneteltetés közben, csak futás közben. Ha ezt a tényt a Filter Graph Managernek szeretné jelezni, a forrásszűrő IMediaFilter::GetState metódus VFW_S_CANT_CUE ad vissza. Ez a visszatérési kód azt jelzi, hogy a szűrő a szüneteltetett állapotra váltott, annak ellenére, hogy a renderelő nem kapott adatokat.
Ha egy szűrő leáll, a rendszer elutasítja a hozzá kézbesített további mintákat. A forrásszűrők leállítják a streamelési szálakat, más szűrők pedig leállítják az esetlegesen létrehozott munkaszálakat. A kitűzők decommitálják a kiosztóikat.
Állapotváltások
A Filter Graph Manager az összes állapotáttűnést upstream sorrendben hajtja végre, kezdve a renderelőtől kezdve a forrásszűrőig. Ez a rendezés azért szükséges, hogy megakadályozza a minták elvetését és a gráf holtpontra helyezését. A legfontosabb állapotváltások a szüneteltetett és a leállított állapot között vannak:
- Leállt a szüneteltetésre: Amikor minden szűrő szünetel, készen áll arra, hogy mintákat fogadjon a következő szűrőből. A forrásszűrő az utolsó, amelyet szüneteltetni kell. Létrehozza a streamelési szálat, és megkezdi a minták kézbesítését. Mivel az összes alsóbb rétegbeli szűrő szüneteltetve van, egyetlen szűrő sem utasítja el a mintákat. A Filter Graph Manager nem hajtja végre az átmenetet, amíg a gráf összes renderelője nem kapott mintát (az élő források kivételével, a korábban leírtak szerint).
- Szüneteltetve a leállásra: Amikor egy szűrő leáll, felszabadítja a benne lévő mintákat, ami feloldja a GetBuffervárakozó felsőbb rétegbeli szűrők blokkolását. Ha a szűrő egy erőforrásra vár a Fogadás metóduson belül, leáll a várakozás, és visszatér Fogadás, amely feloldja a hívásszűrő letiltását. Ezért amikor a Filter Graph Manager leállítja a következő felsőbb rétegbeli szűrőt, a szűrő nem lesz blokkolva GetBuffer vagy Fogadási, és válaszolhat a stop parancsra. A felsőbb rétegbeli szűrő néhány további mintát is kézbesíthet, mielőtt lekérné a stop parancsot, de az alsóbb rétegbeli szűrő egyszerűen elutasítja őket, mert már leállt.
Kapcsolódó témakörök