Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jeśli filtr używa przetwarzania skoncentrowanego na filtrze, domyślnie AVStream wywołuje procedurę wywołania zwrotnego dostarczonej przez minikierowcę avStrMiniFilterProcess, gdy istnieją ramki danych dostępne dla każdego wystąpienia pinu. Minidriverzy mogą modyfikować to domyślne zachowanie, ustawiając pole Flags struktury KSPIN_DESCRIPTOR_EX.
Aby zaimplementować przetwarzanie skoncentrowane na filtrach, należy podać wskaźnik do minidriver dostarczonej procedury wywołania zwrotnego AVStrMiniFilterProcess w elemencie procesu struktury KSFILTER_DISPATCH . Ustaw element członkowski procesuKSPIN_DISPATCH na wartość NULL.
Funkcja AVStream wywołuje metodę AVStrMiniFilterProcess tylko wtedy, gdy spełnione są wszystkie następujące warunki:
Ramki są dostępne na wyprowadzeniach, które wymagają ramek, aby przetwarzanie mogło się odbyć. Minidrivers mogą modyfikować zachowanie przetwarzania, ustawiając flagi w elemencie FlagsKSPIN_DESCRIPTOR_EX. Zwróć szczególną uwagę na kombinacje wzajemnie wykluczających się flag KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING i KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. Minidriver może również zmodyfikować zestaw pinów, które wymagają ramek za pomocą procedur KsPinAttachAndGate lub KsPinAttachOrGate .
Liczba instancji pinów jest równa lub większa niż człon InstancesNecessary struktury KSPIN_DESCRIPTOR_EX. Członek ClientState struktury KSPIN określa konkretny wylicznik KSSTATE, na którym pin jest obecnie ustawiony. Po spełnieniu parametru InstancesNecessary, dodatkowe piny ustawione w stanie KSSTATE_STOP nie będą zapobiegać przetwarzaniu filtru.
Wymagana liczba instancji pinów jest spełniona (określona przez członka InstancesNecessary struktury KSPIN_DESCRIPTOR_EX).
Minidriver nie zamknął bramy sterowania procesu filtru przy użyciu funkcji KSGATEXxx .
W procedurze wywołania zwrotnego AVStrMiniFilterProcess minidriver otrzymuje wskaźnik do tablicy struktur KSPROCESSPIN_INDEXENTRY. AvStream porządkuje tablicę struktur KSPROCESSPIN_INDEXENTRY według identyfikatora pinu.
W poniższych przykładach kodu pokazano, jak używać struktur pinów procesów. Kod jest pobierany z przykładu AVStream Filter-Centric Simulated Capture Driver (Avssamp), który pokazuje, jak napisać sterownik przechwytywania skoncentrowany na filtrze. Kod źródłowy i opis tego przykładu znajdują się w pobranych przykładach zestawu sterowników systemu Windows.
Minidriver odbiera tablicę struktur KSPROCESSPIN_INDEXENTRY podczas wywołania procesu filtru. W tym przykładzie minidriver wyodrębnia pierwszą strukturę KSPROCESSPIN ze struktury KSPROCESSPIN_INDEXENTRY indeksu VIDEO_PIN_ID:
NTSTATUS
CCaptureFilter::
Process (
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
)
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}
Minidriver nie powinien odwoływać się do ProcessPinsIndex [n]. Piny [0] przed sprawdzeniem, czy członek CountProcessPinsIndex [n] wynosi co najmniej jeden lub że członek InstancesNecessary struktury KSPIN_DESCRIPTOR_EX zawartej w Pinach [0] wynosi co najmniej jeden. (Jeśli ta ostatnia wartość jest prawdziwa, numer PIN ma gwarancję istnienia).
Następnie, aby określić pin, na którym mają być przechwytywane ramki, procedura wywołania zwrotnego AVStrMiniFilterProcess przekazuje wskaźnik do struktury KSPROCESSPIN do CaptureFrame, rutyny przechwytywania dostarczonej przez dostawcę.
VidCapPin -> CaptureFrame (VideoPin, m_Tick);
Następnie procedura przechwytywania może skopiować dane do elementu członkowskiego Dane struktury KSPROCESSPIN lub z niego. Może również zaktualizować członków BytesUsed i Terminate tej struktury, jak w poniższym przykładzie:
RtlCopyMemory ( ProcessPin -> Data,
m_SynthesisBuffer,
m_VideoInfoHeader -> bmiHeader.biSizeImage
);
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;
Minidriver może również uzyskać dostęp do struktury nagłówka strumienia odpowiadającej bieżącemu wskaźnikowi strumienia i pinu.
PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;
Większość minidriverów korzystających z przetwarzania skoncentrowanego na filtrach używa wskaźnika strumienia tylko w celu uzyskania dostępu do nagłówka strumienia. W modelu skoncentrowanym na filtrze AVStream wewnętrznie manipuluje wskaźnikiem strumienia. W rezultacie minidrivery powinny zachować ostrożność, jeśli manipulują wskaźnikiem strumienia w sterowniku skoncentrowanym na filtrze.