Delen via


Onderhandelen over allocators

[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

Wanneer twee pinnen verbinding maken, hebben ze een mechanisme nodig voor het uitwisselen van mediagegevens. Dit mechanisme wordt het transportgenoemd. Over het algemeen is de DirectShow-architectuur neutraal over transporten. Twee filters kunnen ermee akkoord gaan om verbinding te maken met elk transport dat beide ondersteunen.

Het meest voorkomende transport is het lokaal geheugen transport, waarin de mediagegevens zich in het hoofdgeheugen bevinden. Er bestaan twee soorten lokaal geheugentransport: het pushmodel en het pull-model. In het pushmodel pusht het bronfilter gegevens naar het downstreamfilter met behulp van de IMemInputPin interface op de invoerpin van het downstreamfilter. In het pull-model vraagt het downstreamfilter gegevens op uit het bronfilter met behulp van de IAsyncReader interface op de uitvoerpin van het bronfilter. Zie Gegevensstroom in de filtergrafiekvoor meer informatie over deze twee gegevensstroommodellen.

In het lokale geheugentransport wordt het object dat verantwoordelijk is voor het toewijzen van geheugenbuffers de allocatorgenoemd. Een allocator ondersteunt de IMemAllocator interface. Beide pinnen delen één allocator. Beide pinnen kunnen een allocator bieden, maar de uitvoerpin selecteert welke allocator moet worden gebruikt.

De uitvoerpin stelt ook de allocatoreigenschappen in, waarmee wordt bepaald hoeveel buffers worden gemaakt door de allocator, de grootte van elke buffer en de uitlijning van het geheugen. De uitvoerpin kan worden uitgesteld tot de invoerpincode voor de buffervereisten.

In een IMemInputPin-verbinding werkt allocator-onderhandeling als volgt:

  1. Optioneel roept de uitvoerpin aan IMemInputPin::GetAllocatorRequirements. Met deze methode worden de buffervereisten van de invoerpin opgehaald, zoals geheugenuitlijning. Over het algemeen moet de uitvoerpin de aanvraag van de invoerpin uitvoeren, tenzij er een goede reden is om dit niet te doen.
  2. Optioneel roept de uitvoerpin aan IMemInputPin::GetAllocator. Met deze methode wordt een allocator van de invoerpin aangevraagd. De invoerpin bevat een pincode of retourneert een foutcode.
  3. De uitvoerpin selecteert een allocator. U kunt er een gebruiken die wordt geleverd door de invoerpin of een eigen pincode maken.
  4. De uitvoerpin roept IMemAllocator::SetProperties- aan om de allocatoreigenschappen in te stellen. De allocator kan echter niet aan de aangevraagde eigenschappen worden gehouden. (Dit kan bijvoorbeeld gebeuren als de invoerpin de allocator levert.) De allocator retourneert de werkelijke eigenschappen als uitvoerparameter in de methode SetProperties.
  5. De outpin roept IMemInputPin::NotifyAllocator aan om de invoerpin van de selectie te informeren.
  6. De invoerpin moet IMemAllocator::GetProperties aanroepen om te controleren of de allocatoreigenschappen acceptabel zijn.
  7. De uitvoerpin is verantwoordelijk voor het doorvoeren en de toewijzing van de allocator. Dit gebeurt wanneer streaming wordt gestart en gestopt.

In een IAsyncReader verbinding werkt allocator-onderhandeling als volgt:

  1. Met de invoerpin wordt IAsyncReader::RequestAllocator op de uitvoerpin. De invoerpin geeft de buffervereisten aan en biedt desgewenst een allocator.
  2. De uitvoerpin selecteert een allocator. Het kan de pincode gebruiken die wordt geleverd door de invoerpin, indien van toepassing, of een eigen speld maken.
  3. De uitvoerpincode retourneert de allocator als een uitgaande parameter in de RequestAllocator-methode. De invoerpin moet de eigenschappen van de allocator controleren.
  4. De invoerpin is verantwoordelijk voor het doorvoeren en de toewijzing van de allocator.
  5. Op elk gewenst moment tijdens het onderhandelingsproces van de allocator kan de verbinding mislukken.
  6. Als voor de uitvoerpin de allocator van de invoerpin wordt gebruikt, kan die allocator alleen worden gebruikt om voorbeelden aan die invoerpincode te leveren. Het filter dat eigenaar is, mag de allocator niet gebruiken om monsters aan andere pinnen te leveren.

een aangepaste allocator-