Dela via


Förhandla allokerare

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

När två stift ansluter behöver de en mekanism för att utbyta mediedata. Den här mekanismen kallas transport. I allmänhet är DirectShow-arkitekturen neutral när det gäller transporter. Två filter kan godkänna att ansluta med hjälp av alla transporter som båda stöder.

Den vanligaste transporten är lokala minnet transport, där mediedata finns i huvudminnet. Det finns två varianter av lokal minnestransport, den push-modellen och pull-modellen. I push-modellen skickar källfiltret data till det underordnade filtret med hjälp av IMemInputPin--gränssnittet på det underordnade filtrets indatastift. I pull-modellen begär det underordnade filtret data från källfiltret med hjälp av IAsyncReader--gränssnittet på källfiltrets utdatastift. Mer information om dessa två dataflödesmodeller finns i Data Flow i Filter Graph.

I lokal minnestransport kallas objektet som ansvarar för att allokera minnesbuffertar allokeringsverktyget. En allokerare stöder gränssnittet IMemAllocator. Båda stiften delar en enda allokerare. Båda pin-kodarna kan tillhandahålla en allokerare, men utdatastiftet väljer vilken allokerare som ska användas.

Utdatastiftet anger också allokeringsegenskaperna, som avgör hur många buffertar som skapas av allokeraren, storleken på varje buffert och minnesjusteringen. Utdatastiftet kan skjuta upp till indatastiftet för buffertkraven.

I en IMemInputPin--anslutning fungerar allokeringsförhandlingen på följande sätt:

  1. Alternativt anropar utdatastiftet IMemInputPin::GetAllocatorRequirements. Den här metoden hämtar indatastiftets buffertkrav, till exempel minnesjustering. I allmänhet bör utdatastiftet uppfylla indatastiftets begäran, såvida det inte finns en bra anledning att inte göra det.
  2. Du kan också anropa utdatastiftet IMemInputPin::GetAllocator. Den här metoden begär en allokerare från pin-koden för indata. Pin-koden för indata innehåller en eller returnerar en felkod.
  3. Utdatastiftet väljer en allokerare. Den kan använda en som tillhandahålls av pin-koden för indata eller skapa en egen.
  4. Utdatastiftet anropar IMemAllocator::SetProperties för att ange allokeringsegenskaperna. Allokeraren kanske inte följer de begärda egenskaperna. (Detta kan till exempel inträffa om pin-koden för indata tillhandahåller allokeraren.) Allokeraren returnerar de faktiska egenskaperna som en utdataparameter i metoden SetProperties.
  5. Outpin anropar IMemInputPin::NotifyAllocator för att informera indatastiftet för markeringen.
  6. Pin-koden för indata bör anropa IMemAllocator::GetProperties för att kontrollera om allokeringsegenskaperna är acceptabla.
  7. Pin-koden för utdata ansvarar för att checka in och ta bort allokeringsappen. Detta inträffar när direktuppspelningen startar och stoppas.

I en IAsyncReader--anslutning fungerar allokeringsförhandlingen på följande sätt:

  1. Indatastiftet anropar IAsyncReader::RequestAllocator på utdatastiftet. Pin-koden för indata anger dess buffertkrav och tillhandahåller eventuellt en allokerare.
  2. Utdatastiftet väljer en allokerare. Den kan använda den som tillhandahålls av pin-koden för indata, om någon, eller skapa en egen.
  3. Utdatastiftet returnerar allokeraren som en utgående parameter i metoden RequestAllocator. Pin-koden för indata bör kontrollera allokeringsegenskaperna.
  4. Pin-koden för indata ansvarar för att checka in och ta bort allokeringsappen.
  5. När som helst under allokeringsprocessen kan endera pin-koden misslyckas med anslutningen.
  6. Om utdatastiftet använder indatastiftets allokerare kan den endast använda allokeraren för att leverera exempel till den indatastiftet. Ägandefiltret får inte använda allokeraren för att leverera exempel till andra stift.

Att tillhandahålla en anpassad allokerings