Udostępnij przez


Kodowanie wideo D3D12

Ten artykuł zawiera ogólne informacje dla deweloperów sterowników dotyczących funkcji kodowania wideo Direct3D12. Aby uzyskać więcej informacji, w tym specyficznych dla aplikacji, zobacz Specyfikację kodowania wideo D3D.

Informacje o kodowaniu wideo Direct3D 12

Przed windows 11 (WDDM 3.0), DirectX 12 zapewniał interfejsy aplikacji i sterowników (API i DDI) do obsługi przyspieszania procesora GPU dla kilku aplikacji wideo, w tym dekodowania wideo, przetwarzania wideo i szacowania ruchu.

Począwszy od systemu Windows 11, D3D12 dodaje funkcję kodowania wideo do istniejącej rodziny interfejsów API wideo/DDI. Ta funkcja zapewnia spójny zestaw interfejsów API/DDI kodowania, które są zgodne z istniejącą strukturą D3D12, i umożliwia deweloperom wykonywanie kodowania wideo przy użyciu przyspieszanych przez GPU silników wideo.

Platforma kodowania wideo zapewnia dostęp do możliwości przyspieszania sprzętowego kodera wideo. Można go używać w różnych scenariuszach, takich jak Internet rzeczy (IoT), chmura, interfejsy API multimediów, uczenie maszynowe (ML) i przesyłanie strumieniowe gier.

Obsługa kodowania AV1 jest dodawana w systemie Windows 11 w wersji 24H2 (WDDM 3.2). Aby uzyskać więcej informacji, zobacz Kodowanie wideo D3D12 AV1.

Obsługiwane koderki

Począwszy od systemu Windows 11, obsługiwane kodery są H.264 i HEVC, chociaż struktura kodowania wideo D3D12 zapewnia otwartą rozszerzalność nowszych koderów koderów, takich jak AV1.

Specyficzne dla kodeka aspekty interfejsu platformy są delegowane do struktur specyficznych dla kodeka i ich dostępu do typów związków. Na przykład struktura D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 zawiera unię z wskaźnikami do struktur specyficznych dla kodeka: D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_0082_0 oraz D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_0082_0, które zawierają informacje o konfiguracji specyficznej dla kodeka.

Aby zachować zgodność interfejsu binarnego z rozszerzalnością, typy związkowe zawsze zawierają wskaźniki do struktur specyficznych dla kodeka. Typy unii mają stały rozmiar zależny od rozmiaru wskaźnika w architekturze hosta. Ta decyzja uniemożliwia również strukturom zawierającym elementy lub anonimowe typy unii zmianę ich rozmiarów podczas rozszerzania interfejsu. Niektóre unie zawierają tylko wskaźniki do typów wyliczeniowych; aby były spójne, te typy wyliczeniowe są również przywoływane jako wskaźniki w przypadku, gdy nowy kodek wymaga bardziej złożonego typu niż wyliczenie, aby reprezentować te pojęcia.

Raportowanie obsługi i możliwości kodowania wideo

Istniejąca struktura związana z wideo została rozszerzona, aby umożliwić sterownikom raportowanie obsługi i możliwości kodowania wideo.

  • D3D12DDI_FEATURE_VERSION_VIDEO_0083_0 to numer wersji, który definiuje pierwszą pełną implementację wszystkich kamieni milowych kodu wideo D3D12, które zostały wprowadzone w systemie Windows 11.

  • Wyliczenie D3D12DDICAPS_TYPE_VIDEO_0020 zostało rozszerzone w celu uwzględnienia następujących wartości obsługi kodowania wideo:

    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC = 31,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_PROFILE_LEVEL = 32,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_OUTPUT_RESOLUTION_RATIOS_COUNT = 33,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_OUTPUT_RESOLUTION = 34,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_INPUT_FORMAT = 35,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_RATE_CONTROL_MODE = 36,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_INTRA_REFRESH_MODE = 37,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_FRAME_SUBREGION_LAYOUT_MODE = 38,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_HEAP_SIZE = 39,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC_CONFIGURATION_SUPPORT = 40,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_SUPPORT = 41,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT = 42,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_RESOURCE_REQUIREMENTS = 43

    Środowisko uruchomieniowe D3D wywołuje wywołanie zwrotne sterownika PFND3D12DDI_VIDEO_GETCAPS, aby sprawdzić obsługę kodowania wideo.

  • Sterownik obsługujący kodowanie wideo zapewnia środowisko uruchomieniowe D3D ze wskaźnikami do funkcji wywołania zwrotnego kodowania wideo w strukturze D3D12DDI_DEVICE_FUNCS_VIDEO_0082_0 .

Funkcje wywołania zwrotnego kodowania wideo D3D12

Sterownik implementuje następujące funkcje wywołania zwrotnego w celu obsługi kodowania wideo D3D12.

Testowanie

Poniższe testy są uwzględniane w ramach zestawu Windows Hardware Lab Kit (WHLK). Aby uzyskać szczegóły, zobacz WHLK.

Nazwa testu Opis
CreateVideoEncoder Weryfikuje tworzenie VideoEncoder/VideoEncoderHeap na podstawie zgłoszonych powiązanych przypadków CheckFeatureSupport.
SingleEncodeH264/HEVC Testy oparte na kodzie QR na potrzeby kontroli podstawowych obrazów strukturalnych. Sekwencja obrazów wejściowych jest oznaczana wstępnie zdefiniowaną zawartością QR, a następnie kodowana i dekodowana. Na koniec wartości wyjściowe (i w pewnym stopniu jakość) są sprawdzane, aby upewnić się, że są one oczekiwane.
EncodeProfileLevelSuggestionsH264/HEVC Sprawdza, czy wartości D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT.SuggestedProfile/Level są zgodne z oczekiwaniami na podstawie specyfikacji H.264/HEVC i konfiguracji podanych do D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT.
EncodeHeapSizeCap Sprawdza poprawność zwiększania zużycia pamięci przy użyciu różnych argumentów wejściowych.
SimpleGOPEncodeH264/HEVC (10 bitów) Transkoduje wejściowe wideo przy użyciu różnych rozdzielczości, wzorców GOP, trybów wycinków i innych konfiguracji kodeków i sprawdza, czy różnica między zakodowanym wideo wyjściowym a strumieniem wideo wejściowym jest akceptowalna. To porównanie odbywa się przy użyciu współczynnika sygnału szczytowego do szumu (PSNR).
EncodeSubregions/RekonfiguracjaRozdzielczości Weryfikuje rekonfiguracje na bieżąco.
KodowanieH264LongTermReferences Weryfikuje użycie długoterminowych odwołań do obrazów.
EncodeIntraRefresh Weryfikuje prosty scenariusz wewnątrz odświeżania przy użyciu otwartego protokołu IPP... P... P... GOP.
Funkcje listy poleceń kodowania wideo (VideoEncodeCommandListFeatures) Weryfikuje predykację i znaczniki dla list poleceń kodowania wideo.
VideoEncodeTimestamps Weryfikuje znaczniki czasu dla list poleceń kodowania wideo.

Scenariusze kodowania wideo

OneCore

Obsługa kodowania wideo D3D12 umożliwia przenośne kodowanie wideo przyspieszane sprzętowo na platformach, na których jest dostępna tylko D3D12. Te platformy obejmują różne jednostki SKU z rdzeniami jednordzeniowymi używane przez platformy obliczeniowe w chmurze i IoT. Przyspieszanie kodowania wideo jest dostępne w tych scenariuszach bez konieczności korzystania z rozwiązań specyficznych dla platformy.

Interfejsy multimedialnych API

Funkcje kodowania wideo w sposób niskopoziomowy i przenośny są dostępne dla wszystkich producentów sprzętu. Ta dostępność umożliwia interfejsom API multimediów wyższego poziomu (takim jak Media Foundation) tworzenie warstw multimediów na podstawie tego interfejsu API, który zajmuje się abstrakcją różnych platform sprzętowych. Biorąc pod uwagę niski poziom projektowania interfejsu API, te warstwy multimediów wyższego poziomu mogą być zoptymalizowane pod kątem ich scenariuszy dzięki precyzyjnej kontroli nad synchronizacją i alokacją pamięci/aspektami rezydencji sesji kodowania wideo, takimi jak pełna kontrola zarządzania obrazami referencyjnymi i obowiązków pisania nagłówków transmisji bitów. Przeniesienie obowiązków do warstwy znajdującej się nad tym API umożliwia również dostawcom sprzętu spójny zestaw zasad kodowania (na przykład heurystyki DPB, takie jak adaptacyjny GOP) w warstwie multimediów, który może być ponownie wykorzystywany na różnych platformach sprzętowych.

Współdziałanie z grafiką D3D, obliczeniami i uczeniem maszynowym

Interfejs API kodowania wideo D3D12 umożliwia wydajną współdziałanie między kodowaniem wideo D3D12 i grafiką D3D12, obliczeniami i scenariuszami uczenia maszynowego. To współdziałanie jest interesujące w scenariuszach, takich jak inferencja uczenia maszynowego za pośrednictwem strumienia z kamery.

Scenariusze przesyłania strumieniowego gier

Interfejs kodowania wideo D3D12 umożliwia scenariusze przesyłania strumieniowego gier, które wymagają wysoce wydajnego API na niskim poziomie.