Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
[Funkce přidružená k této stránce DirectShow je starší funkce. Byla nahrazena MediaPlayer, IMFMediaEnginea Audio/Video Capture v rámci Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]
Zatímco je graf filtru spuštěný, může se v grafu pohybovat libovolný objem dat. Některé z nich můžou být ve frontách a čekají na doručení. Někdy je potřeba graf filtru co nejrychleji odebrat nevyřízená data a nahradit je novými daty. Po příkazu hledání například zdrojový filtr vygeneruje vzorky z nové pozice ve zdroji. Aby se minimalizovala latence, měly by podřízené filtry zahodit všechny vzorky vytvořené před příkazem hledání. Proces, při kterém se vyhazují vzorky, se nazývá proplachování. Umožňuje, aby graf byl responzivní, když události mění normální tok dat.
Vyprázdnění se zpracovává trochu jinak modelem vyžádání než model push. Tento článek začíná popisem tlačného modelu; pak popisuje rozdíly ve vtažném modelu.
Vyprázdnění probíhá ve dvou fázích.
- Nejprve volá zdrojový filtr IPin::BeginFlush vstupního pinu podřízeného filtru. Filtr z nižší úrovně začne odmítat vzorky z nadřazeného procesu. Zahodí také všechny vzorky, které drží, a odešle volání BeginFlush dolů k dalšímu filtru.
- Když je zdrojový filtr připravený k odesílání nových dat, volá IPin::EndFlush na vstupní pin. To signalizuje podřízený filtr, že může přijímat nové vzorky. Podřízený filtr odešle EndFlush volání na další filtr.
Ve metodě BeginFlush vstupní pin provede následující:
- Zavolá BeginFlush na vstupních pinech směrem dolů.
- Odmítá jakákoli další volání, která streamují data, včetně Receive a EndOfStream.
- Odblokuje všechny filtry ve vstupní části, které jsou blokovány čekáním na vzorek od přidělovatele filtru. Některé filtry pro tento účel dekódují své alokátory.
- Ukončí všechna čekání, která blokují streamování. Například filtry rendereru blokují při pozastavení. Blokují také, když čekají na vykreslení ukázky ve správný čas datového proudu. Filtr se musí odblokovat, aby bylo možné doručit a odmítnout vzorky, které čekají ve frontě směrem vpřed. Tento krok zajistí, že se všechny vrchní filtry nakonec odblokují.
V metodě EndFlush vstupní pin provede následující:
- Čeká, až budou z fronty odstraněny všechny zařazené vzorky.
- Uvolní všechna data uložená do vyrovnávací paměti. Tento krok lze někdy provést v metodě BeginFlush. BeginFlush se ale nesynchronuje s vláknem streamování. Filtr nesmí zpracovávat ani ukládat další data mezi voláním BeginFlush a voláním EndFlush.
- Vymaže všechna nevyřízená oznámení EC_COMPLETE.
- Volá EndFlush dále.
V tomto okamžiku může filtr znovu přijímat ukázky. U všech vzorků je zaručeno, že jsou novější než proplach.
V nátahovém modelu inicializuje proplachování filtr analyzátoru, nikoli zdrojový filtr. Kromě toho volá IPin::BeginFlush a IPin::EndFlush pro podřízený filtr, volá také IAsyncReader::BeginFlush a IAsyncReader::EndFlush na výstupu pin kódu zdrojového filtru. Pokud zdrojový filtr obsahuje čekající žádosti o čtení, zahodí je.
Související témata