Korzystanie z szablonu klasy DMO
[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.]
DirectShow zawiera szablon klasy, IMediaObjectImpl, do implementowania DMO. Szablon obsługuje wiele zadań "księgowania", takich jak weryfikowanie parametrów wejściowych. Korzystając z szablonu, możesz skoncentrować się na funkcjach specyficznych dla funkcji DMO. Ponadto szablon pomaga zapewnić, że tworzysz niezawodną implementację. Szablon jest zdefiniowany w pliku nagłówkowym Dmoimpl.h znajdującym się w katalogu Include zestawu SDK.
Szablon IMediaObjectImpl dziedziczy interfejs IMediaObject. Aby utworzyć obiekt DMO przy użyciu szablonu, zdefiniuj nową klasę pochodzącą z IMediaObjectImpl. Szablon implementuje wszystkie metody IMediaObject. W większości przypadków szablon wywołuje odpowiadającą metodę prywatną w klasie pochodnej. Szablon zawiera następujące funkcje:
- Podstawowe sprawdzanie parametrów. Metody szablonu sprawdzają, czy wymagane parametry nie są wartości null, że indeksy strumienia znajdują się w zakresie i że flagi są prawidłowe.
- Blokowanie. Metody szablonu wywołują dwie metody wewnętrzne, Lock i Unlock, w celu serializacji operacji na DMO. Dzięki tej funkcji DMO jest bezpieczny wątkowo.
- Typy multimediów. Szablon przechowuje typy multimediów ustawione przez klienta i udostępnia metody dostępu dla typów multimediów.
- Przesyłanie strumieniowe. Szablon uniemożliwia przesyłanie strumieniowe, dopóki klient nie ustawi typów multimediów dla wszystkich strumieni innych niż opcjonalne. Gwarantuje również, że metoda IMediaObject::AllocateStreamingResources jest wywoływana przed rozpoczęciem przesyłania strumieniowego, co gwarantuje przydzielanie zasobów.
Klasa pochodna musi implementować interfejs IUnknown; szablon nie udostępnia tego interfejsu. Możesz użyć biblioteki active template library (ATL), aby zaimplementować IUnknownlub udostępnić inną implementację. Szablon nie implementuje również mechanizmu blokowania. Klasa pochodna musi implementować metody lock i unlock. Jeśli tworzysz klasę przy użyciu atl, możesz użyć domyślnych implementacji ATL.
Deklarowanie klasy pochodnej
Szablon klasy IMediaObjectImpl jest zadeklarowany w następujący sposób:
template <class _DERIVED_, int NUMBEROFINPUTS, int NUMBEROFOUTPUTS>
class IMediaObjectImpl : public ImediaObject
Trzy parametry szablonu to _DERIVED_, NUMBEROFINPUTS i NUMBEROFOUTPUTS. Ustaw zmienną _DERIVED_ równą nazwie swojej klasy. Dwa pozostałe parametry definiują liczbę strumieni wejściowych i strumieni wyjściowych w dmo. Aby na przykład utworzyć klasę DMO o nazwie CMyDmo, która obsługuje jeden strumień wejściowy i dwa strumienie wyjściowe, użyj następującej deklaracji:
class CMyDmo : public IMediaObjectImpl<CMyDmo, 1, 2>
W pozostałej części tej sekcji opisano, jak szablon implementuje różne metody w IMediaObject.
metody ustawiania typów multimediów
Następujące metody ustawiają lub pobierają typy multimediów w DMO:
- GetInputType GetOutputType. Te metody zwracają preferowane typy multimediów według numeru strumienia i indeksu typu. Szablon wywołuje InternalGetInputType lub InternalGetOutputType w klasie pochodnej.
- SetInputType, SetOutputType. Te metody ustawiają typ nośnika w strumieniu, testują typ nośnika lub czyszczą typ nośnika. Aby zweryfikować typ nośnika, szablon wywołuje InternalCheckInputType lub InternalCheckOutputType w klasie pochodnej. Klasa pochodna zwraca S_OK, aby zaakceptować typ, lub zwraca DMO_E_INVALIDTYPE, aby odrzucić typ. Szablon obsługuje ustawienie lub czyszczenie typu nośnika.
- GetInputCurrentType, GetOutputCurrentType. Te metody zwracają bieżący typ nośnika dla strumienia lub DMO_E_TYPE_NOT_SET, jeśli nie ustawiono żadnego typu. Szablon całkowicie implementuje te metody.
metody informacyjne
Poniższe metody dostarczają informacje o DMO.
- OdczytajMaksymalneOpóźnienieWejściowe, UstawMaksymalneOpóźnienieWejściowe. Te metody pobierają lub ustawiają maksymalne opóźnienie. Szablon wywołuje InternalGetInputMaxLatency lub InternalSetInputMaxLatency w klasie pochodnej.
- GetInputSizeInfo, GetOutputSizeInfo. Te metody zwracają wymagania buforowe DMO dla określonego strumienia. Jeśli w tym strumieniu nie ustawiono żadnego typu nośnika, szablon zwraca DMO_E_TYPE_NOT_SET. W przeciwnym razie metoda wywołuje InternalGetInputSizeInfo lub InternalGetOutputSizeInfo w klasie pochodnej.
- GetInputStreamInfo, GetOutputStreamInfo. Te metody zwracają różne flagi wskazujące sposób formatowania danych przez klienta. Szablon wywołuje InternalGetInputStreamInfo lub InternalGetOutputStreamInfo w klasie pochodnej.
- GetStreamCount. Ta metoda zwraca liczbę strumieni wejściowych i wyjściowych. Szablon implementuje tę metodę przy użyciu parametrów szablonu.
metody alokacji zasobów
- Metoda AllocateStreamingResources przydziela wszelkie zasoby, których potrzebuje DMO przed rozpoczęciem przesyłania strumieniowego. Metoda FreeStreamingResources zwalnia te same zasoby. Szablon wywołuje InternalAllocateStreamingResources i InternalFreeStreamingResources, odpowiednio.
Nie jest wymagane, aby klient DMO wywoływał te metody, ponieważ szablon automatycznie wywołuje AllocateStreamingResources przed rozpoczęciem przesyłania strumieniowego. W związku z tym DMO może zakładać, że zasoby zostały przydzielone poprawnie w momencie, gdy wywoływany jest ProcessInput. DMO powinno wywołać FreeStreamingResources w swoim destruktorze.
Ponadto, gdy szablon wywołuje InternalAllocateStreamingResources, ustawia flagę wewnętrzną, aby nie wywoływać tej metody ponownie, dopóki nie wywoła InternalFreeStreamingResources. Dzięki temu zasoby nie zostaną przypadkowo przydzielone, co może spowodować przecieki pamięci.
metody przesyłania strumieniowego
Do przesyłania strumieniowego danych są używane następujące metody:
- GetInputStatus. Ta metoda wskazuje, czy w tej chwili moduł DMO może akceptować dane wejściowe. Szablon wywołuje InternalAcceptingInput w klasie pochodnej. Jeśli dmo może zaakceptować dane wejściowe, klasa pochodna zwraca S_OK, a szablon ustawia bit DMO_INPUT_STATUSF_ACCEPT_DATA w parametrze dwFlags. W przeciwnym razie klasa pochodna zwraca S_FALSE, a szablon ustawia dwFlags do zera.
- ProcessInput. Ta metoda przetwarza bufor wejściowy. Szablon, opisany wcześniej, wywołuje AllocateStreamingResources. Następnie wywołuje metodę InternalAcceptingInput w klasie pochodnej. Jeśli DMO może przyjmować nowe dane wejściowe, szablon wywołuje InternalProcessInput.
- ProcessOutput. Ta metoda przetwarza zestaw buforów wyjściowych, jeden bufor dla każdego strumienia wyjściowego. Szablon wywołuje AllocateStreamingResources, a następnie InternalProcessOutput.
- nieciągłość. Ta metoda sygnalizuje przerwanie w strumieniu wejściowym. Szablon wywołuje InternalAcceptingInput w klasie pochodnej. Jeśli ta metoda zwróci S_OK, szablon wywoła metodę InternalDiscontinuity w klasie pochodnej.
- Opróżnij. Ta metoda usuwa zawartość DMO. Szablon wywołuje InternalFlush w klasie pochodnej. DMO powinno odrzucić wszelkie bufory danych wejściowych, które nadal są przechowywane do przetworzenia.
Szablon nie zapewnia żadnej bezpośredniej obsługi interfejsu IMediaObjectInPlace.
Metody blokowania
Blokowanie służy do ochrony stanu DMO w środowisku wielowątkowym. W projekcie ATL metoda IMediaObject::Lock powoduje konflikt nazw z metodą Lock ATL. Aby rozwiązać konflikt, szablon zmienia nazwę metody IMediaObject na DMOLock. Podczas kompilowania klasy pochodnej zdefiniuj FIX_LOCK_NAME przed dołączeniem pliku nagłówka Dmo.h:
#define FIX_LOCK_NAME
#include <dmo.h>
Ta dyrektywa powoduje, że preprocesor zastępuje Lock na DMOLock w deklaracji interfejsu IMediaObject. Aplikacje nadal mogą wywoływać metodę przy użyciu nazwy Lock, ponieważ kolejność tabel wirtualnych nie zmienia się. Metoda DMOLock wywołuje Lock lub Unlock w klasie pochodnej. Jeśli używasz atl do implementowania klasy pochodnej, te metody są już zdefiniowane przez ATL, więc żaden dodatkowy kod nie jest konieczny. Jeśli nie używasz atl, musisz podać metody Lock i Unlock w klasie pochodnej.
Szablon automatycznie blokuje obiekt DMO w każdej z metod IMediaObject. Klasa pochodna może wymagać zablokowania DMO wewnątrz innych publicznych metod, które implementuje (na przykład, jeśli obsługuje IMediaObjectInPlace). Szablon klasy udostępnia również wewnętrzną klasę pomocnika, IMediaObjectImpl::LockIt, która jest przydatna do blokowania i odblokowywania dmo.
Podsumowanie
W przypadku następujących metod IMediaObject, szablon wywołuje odpowiednią metodę o tym samym podpisie w klasie pochodnej. Klasa pochodna musi zaimplementować każdą z metod pokazanych w drugiej kolumnie.
IMediaObject metoda | Metoda klasy pochodnej |
---|---|
If it is determined that the technical term should remain in English, then the translation remains the same: pl-PL: AllocateStreamingResources | InternalAllocateStreamingResources |
nieciągłość | RozbieżnośćWewnętrzna |
Spłukiwanie | InternalFlush |
FreeStreamingResources | InternalFreeStreamingResources |
GetInputMaxLatency | InternalGetInputMaxLatency |
GetInputSizeInfo | InternalGetInputSizeInfo |
GetInputStreamInfo | InternalGetInputStreamInfo |
GetInputType | InternalGetInputType |
GetOutputSizeInfo | InternalGetOutputSizeInfo |
GetOutputStreamInfo | InternalGetOutputStreamInfo |
GetOutputType | InternalGetOutputType |
ProcessInput | WprowadzanieProcesuWewnętrznego |
ProcessOutput | InternalProcessOutput |
SetInputMaxLatency | InternalSetInputMaxLatency |
W przypadku pozostałych metod IMediaObject nie istnieje korelacja "jeden do jednego" między metodami szablonu a metodami klasy pochodnej. W poniższej tabeli przedstawiono podsumowanie metod, które są w pełni implementowane przez szablon, oraz metody wywołujące inne metody w klasie pochodnej.
Metoda IMediaObject | Metoda klasy pochodnej |
---|---|
GetInputCurrentType | W pełni zaimplementowane |
PobierzTypPrąduWyjściowego | W pełni zaimplementowane |
GetStreamCount | W pełni zaimplementowane |
PobierzStatusWejścia | InternalAcceptingInput |
Lock (zaimplementowane jako DMOLock) | blokowanie, odblokowywanie |
SetInputType | InternalCheckInputType |
SetOutputType | InternalCheckOutputType |
Tematy pokrewne
-
szablon klasy IMediaObjectImpl