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.
[Funkcja skojarzona z tą stroną, windows Media Format 11 SDK, jest starszą funkcją. Został zastąpiony przez Source Reader i Sink Writer . Czytnik źródeł i Zapisujący ujście zostały zoptymalizowane dla systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał czytnika źródła i modułu zapisywania ujścia zamiast zestawu SDK Windows Media Format 11, jeśli jest 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.]
W tej sekcji opisano sposób włączania przyspieszania wideo Microsoft® DirectX® podczas odtwarzania przesyłanej strumieniowo zawartości w odtwarzaczu niestandardowym.
Tło
DirectX Video Acceleration (DirectX VA) to specyfikacja interfejsu API do przyspieszania sprzętowego operacji dekodowania 2-D. Umożliwia dekoderom oprogramowania przenoszenie niektórych operacji intensywnie obciążających procesor na kartę graficzną do przetwarzania. Dla użytkowników końcowych to umożliwia odtwarzanie wideo o wysokiej przepływności bitów, takie jak odtwarzanie pełnoekranowych dysków DVD na starszych komputerach wyposażonych w karty graficzne zgodne z DirectX, VA.
Począwszy od zestawu Windows Media Format 9 Series SDK, filtr otoki DMO obsługuje DirectX VA. Oznacza to, że w przypadku odtwarzania lokalnego aplikacje mogą używać filtru WM ASF Reader do odtwarzania zawartości opartej na Windows Media, a przyspieszenie sprzętowe DirectX VA zostanie uruchomione automatycznie, jeśli jest obsługiwane przez kartę graficzną. Jednak filtr czytnika ASF WM nie obsługuje odtwarzania przesyłanej strumieniowo zawartości. W związku z tym, jeśli chcesz obsługiwać funkcję DirectX VA podczas odtwarzania przesyłanej strumieniowo zawartości w niestandardowym odtwarzaczu, musisz użyć alternatywnego mechanizmu, który jest używany przez program Windows Media Player począwszy od usługi Windows Media 9 Series.
Ponieważ program Windows Media Player został zaprojektowany przed opracowaniem filtrów QASF, program Windows Media Player ma własny filtr źródłowy oparty na zestawie WINDOWS Media Format SDK do odtwarzania zawartości opartej na usłudze Windows Media. Filtr źródłowy WMP Windows Media dostarcza dekompresowane dane podrzędne bezpośrednio do modułów renderowania audio i wideo. Natomiast czytnik ASF WM dostarcza skompresowaną zawartość strumieniowo do dekoderów Windows Media DirectX Media Objects (DMO), które są hostowane wewnątrz Wrappera DMO. Na poniższych diagramach przedstawiono różnice między czytnikiem ASF WM a filtrem źródłowym WMP Windows Media.
Aby włączyć funkcję DirectX VA dla zawartości przesyłanej strumieniowo, należy utworzyć niestandardowy filtr źródłowy, taki jak ten na górnym diagramie. Zasadniczo ten filtr użyje zestawu SDK formatu Windows Media, aby stworzyć obiekt WM Reader, zdemontować próbki i przekazać je dalej przez swoje wyprowadzenia wyjściowe. W tej dyskusji założono, że utworzono już filtr źródłowy i teraz można go wdrożyć w trybie DirectX VA.
Aby włączyć funkcję DirectX VA, podstawowym zadaniem filtru źródłowego jest zapewnienie modułowi renderowania wideo i dekoderowi DMO WMV interfejsów potrzebnych do negocjacji połączenia DirectX VA. Filtr źródłowy nie uczestniczy w tych negocjacjach. Po rozpoczęciu przesyłania strumieniowego jedynym zadaniem związanym z DirectX VA, które może wykonać filtr źródłowy, jest zmodyfikowanie sygnatur czasowych na próbkach wideo, zanim dekoder WMV dostarczy je do modułu renderowania wideo. Głównym powodem tego jest zapewnienie możliwości niestandardowego sterowania osią czasu, które wykraczają poza standardowe interfejsy DirectShow®.
Trzy interfejsy są definiowane w celu umożliwienia niezbędnej komunikacji między zestawem SDK formatu Windows Media, filtrem źródłowym odtwarzacza, dekoderem DMO usługi Windows Media Video oraz mikserem nakładki lub modułem renderowania mieszania wideo. Te interfejsy zostały opisane w poniższej tabeli.
| Interfejs | Opis |
|---|---|
| IWMCodecAMVideoAccelerator | Uwidoczniony przez DMO dekodera Windows Media i wywoływany przez filtr źródłowy odtwarzacza multimediów, w celu skonfigurowania różnych połączeń wymaganych do włączenia DirectX VA dla przyspieszenia dekodowania zawartości Windows Media Video. |
| IWMPlayerTimestampHook | Zaimplementowano na filtrze źródłowym odtwarzacza. Umożliwia filtrowi modyfikowanie sygnatur czasowych w próbkach wideo przed przekazaniem ich dalej w łańcuchu przetwarzania. |
| IWMReaderAccelerator | Zaimplementowano w obiekcie WM Reader. Jest wywoływany przez filtr źródłowy odtwarzacza w celu uzyskania interfejsów z dekodera DMO. |
Kolejność operacji w odtwarzaniu z włączoną aktywacją zbiorczą DirectX
W tej sekcji opisano ogólną kolejność operacji podczas działania dla odtwarzacza obsługującego DirectX VA i jego filtru źródłowego. Składniki, o których mowa w tej sekcji, to:
- Odtwarzacz multimedialny innej firmy, nazywany odtwarzaczem.
- Niestandardowy filtr źródłowy, zainicjowany przez odtwarzacz, który używa zestawu Windows Media Format SDK do dekompresowania zawartości opartej na formacie Windows Media.
- Wyjście wideo z filtru źródłowego odtwarzacza, zwane również wyjściem.
- Wykres filtru odtwarzania wideo DirectShow nazywany grafem.
- Renderer mieszania wideo, nazywany VMR.
- Obiekt czytnika asynchronicznego Windows Media Format SDK, nazywany czytnikiem.
- Obiekt multimedialny DirectX Dekodera Windows Media Video, nazywany dekoderem DMO.
Kolejność operacji jest następująca:
- Odtwarzacz inicjuje swój filtr źródłowy i obiekt czytnika. Czytnik tworzy dekoder wideo DMO i ustawia na nim (skompresowany) typ wejściowy. Musi się to zdarzyć, zanim gracz podejmie próbę skonfigurowania grafu odtwarzania wideo, ponieważ zestaw SDK i dekoder DMO muszą być zaangażowane w proces negocjacji z grafem, a dmO musi znać format wejściowy w kroku 9.
- Odtwarzacz wywołuje IGraphBuilder::Render, podając mu pin wyjściowy filtru źródła wideo. W tym momencie menedżer grafu filtrów DirectShow próbuje połączyć VMR z filtrem źródła wideo odtwarzacza.
- Menedżer wykresu filtru wywołuje IPin::Connect na wyprowadzeniu wyjściowym filtru źródła wideo odtwarzacza.
Kroki od 4 do 10 występują w IPin::Connect.
Filtr źródłowy uzyskuje interfejs IWMCodecAMVideoAccelerator z metody czytnika IWMReaderAccelerator::GetCodecInterface. Jeśli koder kodu nie obsługuje funkcji DirectX VA, wywołanie metody GetCodecInterface może zakończyć się niepowodzeniem. W takim przypadku negocjacje przebiegają jak zwykle, bez obsługi DirectX VA.
Filtr źródłowy przekazuje wskaźnik IAMVideoAccelerator z pinu przekazywanego do Connect do dekodera DMO za pośrednictwem IWMCodecAMVideoAccelerator::SetAcceleratorInterface.
Następnie filtr źródłowy deleguje pozostałą część operacji IPin::Connect do metody CBaseOutputPin::Connect. Wyliczanie formatu z zestawem SDK przebiega tak jak obecnie. Jeśli kodek obsługuje funkcję DirectX VA dla łączonej zawartości, kodek DMO prezentuje te podtypy DirectX VA jako pierwsze, przed obsługiwanymi typami YUV i RGB. Jeśli jest dostępna obsługa DirectX VA, kroki od 7 do 11 są wykonywane w kontekście podtypu DirectX VA. Następujący fragment kodu pokazuje, jak zidentyfikować podtyp medialny DirectX VA.
bool IsDXVASubtype( AM_MEDIA_TYPE * pmt ) { // All DXVA types have the same last 3 DWORDs. // guidDXVA is the base GUID for all DXVA subtypes. GUID guidDXVA = { 0x00000000, 0xa0c7, 0x11d3, { 0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5 } }; unsigned long const * plguid; unsigned long const * plguidDXVA; plguid = (unsigned long const *)&pmt->subtype; plguidDXVA = (unsigned long *)&guidDXVA; if( ( plguid[1] == plguidDXVA[1] ) && ( plguid[2] == plguidDXVA[2] ) && ( plguid[3] == plguidDXVA[3] ) ) { return true; } return false; }Implementacja CBaseOutputPin::Connect wywołuje IPin::CompleteConnect w kroku 3. Jeśli rozważany jest podtyp DirectX VA, podejmowana jest próba negocjacji w trybie DirectX VA. Pin wyjściowy wywołuje IWMCodecAMVideoAccelerator::NegotiateConnection, przekazując do niego bieżący typ nośnika wyjściowego.
Dekoder DMO wykonuje wymagane negocjacje z VMR za pośrednictwem interfejsu IAMVideoAccelerator i zwraca identyfikator GUID podtypu wideo, na który oba podmioty się zgodziły. Pin wyjściowy deleguje wszystkie IAMVideoAcceleratorNotify wywołania odebrane podczas tego procesu do dekodera DMO's IAMVideoAcceleratorNotify interfejsu, który można również uzyskać poprzez metodę IWMReaderAccelerator::GetCodecInterface.
Jeśli NegotiateConnection powiedzie się, wyprowadzenie wyjściowe wywołuje IWMCodecAMVideoAccelerator::SetPlayerNotify z interfejsem IWMPlayerTimestampHook. Ten punkt zaczepienia umożliwia filtrowi źródłowemu zaktualizowanie sygnatur czasowych na próbkach przed przekazaniem ich do modułu renderowania.
Filtr źródłowy wywołuje IWMReaderAccelerator::Notify z wynegocjowanym typem nośnika. Dzięki temu czytelnik może zaktualizować zmienne wewnętrzne i zatwierdzić go w trybie DirectX VA. Jest to ostatnie miejsce, w którym kodek lub czytelnik może zawieść. Jeśli którykolwiek z powyższych kroków nie powiedzie się, filtr źródłowy powinien powrócić do kroku 3 i spróbować następnego typu wyliczonego przez czytelnika.
Rozpoczyna się odtwarzanie. Czytnik ignoruje bufory wyjściowe z dekodera DMO, jeśli typ wyjścia połączenia to DirectX VA.
Gdy wystąpi IPin::Disconnect, filtr źródłowy wywołuje IWMCodecAMVideoAccelerator::SetAcceleratorInterface zNULL. Spowoduje to przerwanie połączenia funkcji DirectX VA między koderem a modułem renderowania.
Tematy pokrewne