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, MMFMediaEnginea Audio/Video Capture v 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é.]
Tento článek popisuje, jak filtr doručí ukázku. Popisuje jak model push, pomocí IMemInputPin metod, tak model pull, pomocí IAsyncReader.
Push Model: Doručení vzorku
Výstupní pin poskytuje vzorek voláním metody IMemInputPin::Receive nebo metody IMemInputPin::ReceiveMultiple, která je ekvivalentní, ale poskytuje pole vzorků. Vstupní pin může být zablokován uvnitř Receive (nebo ReceiveMultiple). Pokud by pin mohl blokovat, metoda IMemInputPin::ReceiveCanBlock by měla vrátit S_OK. Pokud špendlík nikdy nezablokuje, měl by ReceiveCanBlock vrátit hodnotu S_FALSE. Návratová hodnota S_OK neznamená, že Přijmout vždy blokuje, jen že to může.
Ačkoli Receive může blokovat čekání na zpřístupnění prostředku, neměl by blokovat čekání na další data z nadřazeného filtru. To může způsobit zablokování, kdy vstupní filtr čeká, až výstupní filtr uvolní vzorek, což se nikdy nestane, protože výstupní filtr čeká na vstupní filtr. Pokud má filtr více vstupních pinů, ale jeden pin může počkat, až další pin přijme data. Například filtr AVI Mux to dělá, aby mohl prokládat data zvuku a videa.
Kolík může odmítnout vzorek z několika důvodů:
- Špendlík je vyprázdněný (viz Flushing).
- Pin není připojen.
- Filtr se zastaví.
- Došlo k jiné chybě.
Metoda Receive by měla v prvním případě vrátit S_FALSE a kód selhání v ostatních případech. Upstreamový filtr by měl zastavit odesílání ukázek, pokud je návratový kód jiný než S_OK.
První tři případy můžete považovat za "očekávané" selhání v tom smyslu, že filtr byl ve špatném stavu pro příjem vzorků. Neočekávaným selháním by bylo, kdyby kolík odmítl vzorek, i když je v přijímajícím stavu. Pokud dojde k chybě tohoto typu, měl by pin odeslat oznámení o konci streamu a odeslat událost EC_ERRORABORT do Správce grafu filtrů.
V základních třídách DirectShow CBaseInputPin::CheckStreaming metoda kontroluje obecné případy selhání – vyprázdnění, zastaveno atd. Odvozená třída bude muset zkontrolovat selhání, která jsou specifická pro filtr. V případě chyby odešle metoda CBaseInputPin::Receive oznámení o konci datového toku a událost EC_ERRORABORT.
Model Pull: Vyžádání vzorku
V rozhraní IAsyncReader vstupní pin požaduje vzorky z výstupního pinu voláním jedné z následujících metod:
Metoda Request je asynchronní; vstupní pin volá IAsyncReader::WaitForNext, aby čekal na dokončení požadavku. Další dvě metody jsou synchronní.
Kdy doručovat data
Filtr vždy doručí ukázky, když je ve spuštěném stavu. Ve většině případů filtr také předá vzorky, když je pozastavený. To umožňuje grafu volat data tak, aby se přehrávání spustilo okamžitě po zavolání Spustit (viz Filtrování stavů). Pokud filtr během pozastavení nedoručí data, měla by metoda IMediaFilter::GetState vrátit VFW_S_CANT_CUE v pozastaveném stavu. Tento návratový kód signalizuje, že graf filtru nečeká na data z vašeho filtru, než dokončí přechod pozastavení. Jinak metoda Pause bude trvale blokovaná. Příklad kódu, viz CBaseFilter::GetState.
Tady je několik příkladů, kdy může filtr potřebovat vrátit VFW_S_CANT_CUE:
- Živé zdroje, jako jsou filtry zachycení, by neměly během pozastavení odesílat data. Viz Produkování dat ve filtru zachytávání.
- Filtr rozdělovače může nebo nemusí odesílat data během pozastavení v závislosti na implementaci. Pokud filtr používá samostatná vlákna k zařazení dat do fronty na každém výstupním pinu, může odesílat data i během pozastavení. Pokud ale filtr používá pro každý výstupní špendlík jedno vlákno, může první špendlík blokovat vlákno, když volá Receive, což zabrání ostatním špendlíkům v odesílání dat. V takovém případě byste měli vrátit VFW_S_CANT_CUE.
- Filtr může data doručovat sporadicky. Může například analyzovat vlastní datový proud a vyfiltrovat některé pakety při doručování jiných. V takovém případě nemusí být zaručeno, že filtr během pozastavení doručí data.
Zdrojový filtr (používající push model) nebo analyzační filtr (používající push/pull model) vytvoří jedno nebo více streamovacích vláken, které předávají vzorky co nejrychleji. Podřízené filtry, jako jsou dekodéry a transformace, obvykle odesílají data pouze tehdy, když je na jejich vstupních pinech voláno Receive.
Související témata