Sdílet prostřednictvím


Vyjednávání alokátorů

[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é.]

Když se dva špendlíky připojí, potřebují mechanismus výměny dat médií. Tento mechanismus se nazývá transportní. Obecně platí, že architektura DirectShow je o přenosech neutrální. Dva filtry můžou souhlasit s připojením pomocí jakéhokoli přenosu, který obě podporují.

Nejběžnější přenos je místní paměť přenos, ve kterém jsou data médií umístěna v hlavní paměti. Existují dvě příchutě přenosu místní paměti, model push a modelu vyžádání. Zdrojový filtr v modelu nabízení odešle data do podřízeného filtru pomocí rozhraní IMemInputPin vstupního pinu podřízeného filtru. V modelu vyžádání obsahu podřízený filtr požaduje data ze zdrojového filtru pomocí rozhraní IAsyncReader na výstupním pin kódu zdrojového filtru. Další informace o těchto dvou modelech toku dat najdete v tématu Tok dat v grafu filtru.

V místním přenosu paměti se objekt zodpovědný za přidělování vyrovnávací paměti nazývá alokátor. Alokátor podporuje IMemAllocator rozhraní. Oba špendlíky sdílejí jeden alokátor. Oba špendlíky můžou poskytnout alokátor, ale výstupní špendlík vybere, který alokátor se má použít.

Výstupní kolík také nastaví vlastnosti alokátoru, které určují, kolik vyrovnávacích pamětí vytváří alokátor, velikost každé vyrovnávací paměti a zarovnání paměti. Výstupní kolík může odložit vstupní kolík pro požadavky vyrovnávací paměti.

V připojení IMemInputPin funguje vyjednávání alokátoru následujícím způsobem:

  1. Volitelně můžete výstupní pin volání IMemInputPin::GetAllocatorRequirements. Tato metoda načte požadavky na vyrovnávací paměť vstupního pinu, například zarovnání paměti. Obecně platí, že výstupní špendlík by měl respektovat požadavek vstupního špendlíku, pokud neexistuje dobrý důvod, proč ne.
  2. Volitelně můžete výstupní pin volání IMemInputPin::GetAllocator. Tato metoda požaduje alokátor ze vstupního špendlíku. Vstupní špendlík poskytuje jeden nebo vrací kód chyby.
  3. Výstupní kolík vybere alokátor. Může použít ten, který poskytuje vstupní špendlík, nebo si vytvořit vlastní.
  4. Výstupní pin volá IMemAllocator::SetProperties nastavit vlastnosti alokátoru. Alokátor však nemusí respektovat požadované vlastnosti. (K tomu může dojít například v případě, že vstupní špendlík poskytuje alokátor.) Alokátor vrátí skutečné vlastnosti jako výstupní parametr v SetProperties metoda.
  5. Outpin volá IMemInputPin::NotifyAllocator informovat vstupní pin o výběru.
  6. Vstupní pin kód by měl volat IMemAllocator::GetProperties ověřit, zda jsou vlastnosti alokátoru přijatelné.
  7. Výstupní pin je zodpovědný za potvrzení a zrušení přidělení. K tomu dochází při spuštění a zastavení streamování.

V IAsyncReader připojení funguje vyjednávání alokátoru takto:

  1. Vstupní pin volá IAsyncReader::RequestAllocator na výstupním kolíku. Vstupní kolík určuje požadavky na vyrovnávací paměť a volitelně poskytuje alokátor.
  2. Výstupní kolík vybere alokátor. Může použít ten, který poskytuje vstupní pin, pokud existuje, nebo vytvořit vlastní.
  3. Výstupní pin vrátí alokátor jako výstupní parametr v metodě RequestAllocator. Vstupní špendlík by měl zkontrolovat vlastnosti alokátoru.
  4. Vstupní pin je zodpovědný za potvrzení a potvrzení a potvrzení alokátoru.
  5. Kdykoli během procesu vyjednávání alokátoru může připojení selhat.
  6. Pokud výstupní kolík používá alokátor vstupního kolíku, může tento alokátor použít pouze k doručování vzorků do tohoto vstupního kolíku. Vlastnící filtr nesmí používat alokátor k doručování vzorků do jiných kolíků.

poskytnutí vlastního alokátoru