Udostępnij przez


QueryAccept (podrzędny)

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Ten mechanizm umożliwia wyprowadzenie wyprowadzenia danych wyjściowych do zaproponowania nowego formatu jego podrzędnej komunikacji równorzędnej. Nowy format nie może wymagać większego rozmiaru buforu. Wyprowadzenia wyjściowego wykonuje następujące czynności:

  1. Wywołuje IPin::QueryAccept lub IPinConnection::D ynamicQueryAccept na numer pinie podrzędnym, aby sprawdzić, czy inny numer PIN może zaakceptować nowy typ nośnika (zobacz ilustrację, krok A).

  2. Jeśli wartość zwracana z kroku 1 jest S_OK, numer PIN dołącza typ nośnika do następnego przykładu. W tym celu najpierw wywołuje IMemAllocator::GetBuffer w celu uzyskania przykładu (B). Następnie wywołuje IMediaSample::SetMediaType, aby dołączyć typ nośnika do tego przykładu (C). Dołączając typ nośnika do przykładu, filtr wskazuje, że format został zmieniony, zaczynając od tego przykładu.

  3. Numer PIN dostarcza próbkę (D).

  4. Gdy filtr podrzędny odbierze przykład, wywołuje IMediaSample::GetMediaType w celu pobrania nowego typu nośnika.

    queryaccept (podrzędny)

Wszystkie pinezki obsługują metodę QueryAccept. Jednak ta metoda jest nieco niejednoznaczna, ponieważ wartość zwracana S_OK nie zawsze gwarantuje, że można zmienić format, gdy wykres jest aktywny. Niektóre filtry mogą zwracać S_OK, ale odrzucają zmianę, jeśli wykres jest aktywny. Metoda DynamicQueryAccept obsługiwana przez niektóre wyprowadzenia wejściowe jawnie definiuje S_OK oznacza, że numer PIN może zmieniać formaty, gdy jest aktywny. Jeśli numer PIN danych wejściowych obsługuje interfejs IPinConnection, należy wywołać DynamicQueryAccept, a nie QueryAccept.

W większości przypadków ten mechanizm nie umożliwia drastycznych zmian w formacie, takich jak zmiana głębokości bitu. Jedną z sytuacji, w której można go użyć, jest to, że dekoder wideo przełącza palety. Podstawowe szczegóły formatu pozostają takie same, jak wymiary obrazu i głębokość bitu, ale nowy typ nośnika ma inny zestaw wpisów palety.

implementacji

W klasach bazowych DirectShow CBasePin::QueryAccept wywołuje metodę CheckMediaType, która jest również wywoływana podczas początkowego połączenia pin. W przypadku filtru przekształcania kod pin wejściowy CheckMediaType metody powinien zawsze sprawdzać, czy wyprowadzenia wyjściowego jest podłączony, a jeśli tak, czy typ nośnika wejściowego jest zgodny z typem nośnika wyjściowego. W związku z tym ta implementacja prawdopodobnie będzie prawidłowa dla QueryAccept. Jeśli nie, należy przesłonić QueryAccept, aby wykonać dodatkowe kontrole, które są potrzebne. Należy również pamiętać, że klasa CTransformFilter hermetyzuje tę logikę w CheckInputType i Metody CheckTransform. Z drugiej strony klasa CTransInPlaceFilter zawsze wywołuje QueryAccept w następnym filtrze nadrzędnym lub podrzędnym.

Metoda CBaseInputPin::Receive sprawdza typ nośnika w przykładzie przychodzącym, a jeśli tak jest, wywołuje metodę CheckMediaType. Nie aktualizuje jednak elementu członkowskiego m_mt numeru PIN, który przechowuje bieżący typ nośnika. Gdy filtr przetwarza przykład, należy sprawdzić przykład dla typu nośnika. Jeśli istnieje nowy typ, prawdopodobnie trzeba będzie go przechowywać, wywołując SetMediaType przy numerze PIN lub przez ustawienie wartości m_mt bezpośrednio. Z drugiej strony, CVideoTransformFilter klasy, która jest przeznaczona dla filtrów przekształcania wideo, przechowuje typ nośnika po zmianie. Aby uzyskać szczegółowe informacje, zobacz kod źródłowy CVideoTransformFilter::Receive w bibliotece klas bazowych DirectShow.

W niektórych przypadkach można po prostu przekazać wywołanie QueryAccept podrzędne, a następnie dołączyć typ nośnika do przykładu wyjściowego i pozwolić filtrowi podrzędnego obsłużyć zmianę formatu.