Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
[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.]
Den här mekanismen gör det möjligt för en utdatastift att föreslå ett nytt format till dess underordnade peer. Det nya formatet får inte kräva en större buffertstorlek. Utdatastiftet gör följande:
Anropar IPin::QueryAccept eller IPinConnection::D ynamicQueryAccept på den underordnade pin-koden för att kontrollera om den andra pin-koden kan acceptera den nya medietypen (se bild, steg A).
Om returvärdet från steg 1 är S_OK bifogar stiftet medietypen till nästa exempel. Det gör du genom att först anropa IMemAllocator::GetBuffer för att hämta exemplet (B). Sedan anropas IMediaSample::SetMediaType för att koppla medietypen till exemplet (C). Genom att koppla medietypen till exemplet anger filtret att formatet har ändrats, med början i exemplet.
Pin-koden levererar exemplet (D).
När det underordnade filtret tar emot exemplet anropas IMediaSample::GetMediaType för att hämta den nya medietypen.
Alla stift stöder metoden QueryAccept. Den här metoden är dock något tvetydig eftersom ett returvärde på S_OK inte alltid garanterar att du kan ändra formatet medan grafen är aktiv. Vissa filter kan returnera S_OK men avvisa ändringen om diagrammet är aktivt. Metoden DynamicQueryAccept, som stöds av vissa indatastift, definierar uttryckligen S_OK som innebär att pin-koden kan ändra format när den är aktiv. Om en pin-kod för indata stöder gränssnittet IPinConnection bör du anropa DynamicQueryAccept i stället för QueryAccept.
I de flesta fall tillåter den här mekanismen inte drastiska ändringar i formatet, till exempel att ändra bitdjupet. En situation där den kan användas är när en videodekodare växlar paletter. Den grundläggande informationen i formatet förblir densamma, till exempel bilddimensioner och bitdjup, men den nya medietypen har en annan uppsättning palettposter.
Implementeringsanteckning
I DirectShow-basklasserna anropar CBasePin::QueryAccept metoden CheckMediaType, som också anropas under den första pin-anslutningen. När det gäller ett transformeringsfilter bör indatastiftets CheckMediaType--metod alltid kontrollera om utdatastiftet är anslutet och i så fall om indatamedietypen är kompatibel med utdatamedietypen. Därför kommer den här implementeringen sannolikt att vara giltig för QueryAccept. Annars bör du åsidosätta QueryAccept för att utföra eventuella ytterligare kontroller som behövs. Observera också att klassen CTransformFilter kapslar in den här logiken i metoderna CheckInputType och CheckTransform. Klassen CTransInPlaceFilter, å andra sidan, anropar alltid QueryAccept på nästa överordnade eller nedströmsfilter.
Metoden CBaseInputPin::Receive söker efter en medietyp i det inkommande exemplet, och om det finns en anropas CheckMediaType. Den uppdaterar dock inte pin-kodens m_mt medlem, som innehåller den aktuella medietypen. När filtret bearbetar exemplet bör du kontrollera exemplet efter en medietyp. Om det finns en ny typ måste du förmodligen lagra den, antingen genom att anropa SetMediaType på pin-koden eller genom att ange värdet för m_mt direkt. Å andra sidan lagrar CVideoTransformFilter-klassen, som är utformad för videotransformeringsfilter, medietypen när den ändras. Mer information finns i källkoden för CVideoTransformFilter::Ta emot i DirectShow-basklassbiblioteket.
I vissa fall kan du bara skicka QueryAccept-anropet nedströms och sedan koppla medietypen till utdataexemplet och låta det underordnade filtret hantera formatändringen.