Dela via


Filterkedjor

[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

En filterkedja är en sekvens med filter som uppfyller följande villkor:

  • Varje filter i kedjan har högst en ansluten indatastift och en ansluten utdatastift.
  • Det går att bläddra igenom varje filter i kedjan utan att gå igenom filter utanför kedjan.

I följande diagram är till exempel filter A–B, C–D och F–G–H filterkedjor. Varje underkedja i F–G–H (F–G och G–H) är också en filterkedja. En filterkedja kan bestå av ett enda filter, så filter A, B, C, D, F, G och H är också distinkta filterkedjor. Filter E har två indataanslutningar, så alla filtersekvenser som innehåller filter E är inte en filterkedja.

filterkedja (exempel 1)

Gränssnittet IFilterChain innehåller följande metoder för att styra filterkedjor:

Etikett Värde
IFilterChain::StartChain Startar en kedja.
IFilterChain::StopChain Stoppar en kedja.
IFilterChain::P auseChain Pausar en kedja.
IFilterChain::RemoveChain Tar bort en kedja från diagrammet.

 

Det finns ingen specifik metod för att lägga till en kedja. Om du vill lägga till en kedja infogar du de nya filtren med hjälp av metoden IFilterGraph::AddFilter. Anslut sedan filtren genom att anropa IGraphBuilder::Connect, IGraphBuilder::Renderaeller liknande metoder.

När diagrammet körs kan en filterkedja växla mellan körning och stoppad. När grafen har pausats kan den växla mellan pausad och stoppad. Det här är de enda tillståndsövergångar som är möjliga med filterkedjor.

Riktlinjer för filterkedja

När du använder IFilterChain- metoder är det viktigt att se till att filtren i diagrammet kan stödja filterlänkningsåtgärder. Annars kan du orsaka dödlägen eller graffel. Filter som är anslutna till kedjan måste fungera korrekt när kedjan ändras.

Det bästa sättet att använda IFilterChain är med en uppsättning filter som du har utformat specifikt för länkning. Använd följande riktlinjer för att säkerställa att dina filter är säkra för filterkedjeåtgärder. Dessa punkter refererar till följande diagram.

filterkedja (exempel 2)

  • Innan filterkedjans tillstånd ändras måste alla databearbetningsanrop vid filterkedjans gräns slutföras. Den här regeln gäller för metoderna IMemInputPin::Receive, IPin::NewSegmentoch IPin::EndOfStream. Filter i kedjan måste returneras från anrop till dessa metoder som görs av filter utanför kedjan. och filter utanför kedjan måste returneras från anrop som görs av filter i kedjan.

I föregående diagram måste till exempel filtret B slutföra alla databehandlingsanrop från filter A och filtrera E måste slutföra alla anrop från filtret D. Om stiften visar IPinFlowControl-- och IPinConnection--gränssnitt kan du skicka data via diagrammet genom att anropa IPinFlowControl::Blockera och IGraphConfig::P ushThroughData metoder, enligt beskrivningen i Dynamisk återanslutning. Filter kan också ha stöd för privata metoder för att push-överföra data.

  • Överordnade filter måste förvänta sig att kedjans tillstånd ändras. Anta till exempel i föregående diagram att kedjan har stoppats men filtreraR A-anrop IMemInputPin::Ta emot. Anropet misslyckas och svaret för filter A är att stoppa direktuppspelningen. När programmet startar om kedjan har det ingen effekt eftersom filter A inte längre strömmar data.
  • Underordnade filter måste också förvänta sig att kedjans tillstånd ändras. Annars kan nedströmsfiltret blockeras medan det väntar på exempel som aldrig tas emot. Till exempel kräver multiplexerfilter (MUX) ofta data från alla sina indatastift. Om dataflödet stoppas från en pin-kod för indata kan de andra strömmarna blockeras från bearbetning. Detta kan leda till att grafen blir låst.
  • Varje pin-anslutning från ett filter utanför kedjan till ett filter i kedjan ska ha en egen allokerare, som inte delas av andra anslutningar. När kedjan ändrar tillstånd eller tas bort från diagrammet kan allokeraren tas bort. Om andra anslutningar använde samma allokerare kan de inte längre bearbeta exempel.
  • Ta inte bort en kedja om inte filtren som är anslutna till kedjan stöder dynamisk frånkoppling. Vanligtvis stöder de anslutna filtren IPinConnection- eller IPinFlowControl--gränssnittet, men kan i stället ha stöd för privata gränssnitt.

Dynamic Graph Building