Delen via


QueryAccept (downstream)

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

Met dit mechanisme kan een uitvoerpin een nieuwe indeling voorstellen voor de downstreampeering. De nieuwe indeling mag geen grotere buffergrootte vereisen. De uitvoerpin doet het volgende:

  1. Roept IPin::QueryAccept of IPinConnection::D ynamicQueryAccept op de downstreampincode aan om te controleren of de andere pin het nieuwe mediatype kan accepteren (zie afbeelding, stap A).

  2. Als de retourwaarde uit stap 1 S_OK is, wordt het mediatype door de pin gekoppeld aan het volgende voorbeeld. Hiervoor wordt eerst IMemAllocator::GetBuffer aanroepen om het voorbeeld (B) te verkrijgen. Vervolgens wordt IMediaSample::SetMediaType aan het mediatype gekoppeld aan dat voorbeeld (C). Door het mediatype aan het voorbeeld toe te voegen, geeft het filter aan dat de indeling is gewijzigd, te beginnen met dat voorbeeld.

  3. De pin levert het voorbeeld (D).

  4. Wanneer het downstreamfilter het voorbeeld ontvangt, wordt IMediaSample::GetMediaType- aanroepen om het nieuwe mediatype op te halen.

    queryaccept (downstream)

Alle spelden ondersteunen de methode QueryAccept. Deze methode is echter enigszins dubbelzinnig, omdat een retourwaarde van S_OK niet altijd garandeert dat u de indeling kunt wijzigen terwijl de grafiek actief is. Sommige filters kunnen S_OK retourneren, maar de wijziging negeren als de grafiek actief is. De methode DynamicQueryAccept, die wordt ondersteund door een aantal invoerpinnen, definieert expliciet S_OK om te betekenen dat de pincode opmaak kan wijzigen terwijl deze actief is. Als een invoerpincode de IPinConnection-interface ondersteunt, moet u DynamicQueryAccept- aanroepen in plaats van QueryAccept.

In de meeste gevallen biedt dit mechanisme geen drastische wijzigingen in de indeling, zoals het wijzigen van de bitdiepte. Een situatie waarin het kan worden gebruikt, is wanneer een videodecoder paletten schakelt. De basisdetails van de indeling blijven hetzelfde, zoals de afmetingen van de afbeelding en de bitdiepte, maar het nieuwe mediatype heeft een andere set paletvermeldingen.

implementatienotitie

In de DirectShow-basisklassen roept CBasePin::QueryAccept- de methode CheckMediaType aan, die ook wordt aangeroepen tijdens de eerste pincodeverbinding. In het geval van een transformatiefilter moet de CheckMediaType methode van de invoerpin altijd controleren of de uitvoerpin is verbonden, en zo ja, of het invoermediatype compatibel is met het type uitvoermedia. Daarom is deze implementatie waarschijnlijk geldig voor QueryAccept. Als dat niet het geval is, moet u QueryAccept overschrijven om aanvullende controles uit te voeren die nodig zijn. Houd er ook rekening mee dat de klasse CTransformFilter deze logica inkapselt in de methoden CheckInputType en CheckTransform. De CTransInPlaceFilter klasse roept echter altijd QueryAccept aan op het volgende upstream- of downstreamfilter.

Met de methode CBaseInputPin::Receive wordt gecontroleerd op een mediatype in het binnenkomende voorbeeld. Als er een is, wordt CheckMediaType-aangeroepen. De pincode wordt echter niet bijgewerkt m_mt lid, dat het huidige mediatype bevat. Wanneer het filter het voorbeeld verwerkt, moet u het voorbeeld controleren op een mediatype. Als er een nieuw type is, moet u het waarschijnlijk opslaan door SetMediaType- op uw speld aan te roepen of door de waarde van m_mt rechtstreeks in te stellen. Aan de andere kant slaat de CVideoTransformFilter klasse, die is ontworpen voor filters voor videotransformatie, het mediatype op wanneer het verandert. Zie de broncode voor CVideoTransformFilter::Receive in de DirectShow-basisklassebibliotheek voor meer informatie.

In sommige gevallen kunt u de QueryAccept-aanroep downstream doorgeven en vervolgens het mediatype koppelen aan het uitvoervoorbeeld en het downstreamfilter de indelingswijziging laten afhandelen.