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.
Przetwarzanie wideo DXVA hermetyzuje funkcje sprzętu graficznego poświęconego przetwarzaniu nieskompresowanych obrazów wideo. Usługi przetwarzania wideo obejmują deinterlacing i mieszanie wideo.
Ten temat zawiera następujące sekcje:
- Przegląd
- Tworzenie urządzenia do przetwarzania wideo
- Blit procesu wideo
-
kompozycja obrazu
- Przykład 1. Skrzynka pocztowa
- Przykład 2. Rozciąganie obrazów podrzędnych
- Przykład 3. Niezgodna wysokość strumienia
- Przykład 4. Docelowy prostokąt mniejszy niż powierzchnia docelowa
- Przykład 5. Prostokąty źródłowe
- Przykład 6. Intersecting Destination Prostokąty
- Przykład 7. Rozciąganie i przycinanie wideo
- Przykładowa kolejność danych wejściowych
- Tematy pokrewne
Przegląd
Sprzęt graficzny może używać jednostki przetwarzania grafiki (GPU) do przetwarzania nieskompresowanych obrazów wideo. Urządzenie do przetwarzania wideo to składnik oprogramowania, który hermetyzuje te funkcje. Aplikacje mogą używać urządzenia do przetwarzania wideo do wykonywania funkcji, takich jak:
- Deinterlacing and inverse telecine
- Mieszanie podstreamów wideo na głównym obrazie wideo
- Korekta kolorów (ProcAmp) i filtrowanie obrazów
- Skalowanie obrazów
- Konwersja przestrzeni kolorów
- Mieszanie alfa
Na poniższym diagramie przedstawiono etapy w potoku przetwarzania wideo. Diagram nie jest przeznaczony do pokazywania rzeczywistej implementacji. Na przykład sterownik graficzny może łączyć kilka etapów w jedną operację. Wszystkie te operacje można wykonać w jednym wywołaniu urządzenia do przetwarzania wideo. Niektóre etapy pokazane tutaj, takie jak filtrowanie szumów i szczegółów, mogą nie być obsługiwane przez sterownik.
Dane wejściowe potoku przetwarzania wideo zawsze zawierają podstawowy strumień wideo, który zawiera główne dane obrazu. Podstawowy strumień wideo określa szybkość klatek dla wyjściowego wideo. Każda ramka wyjściowego wideo jest obliczana względem danych wejściowych z podstawowego strumienia wideo. Piksele w strumieniu podstawowym są zawsze nieprzezroczyste, bez danych alfa na piksel. Podstawowy strumień wideo może być progresywny lub przeplotowy.
Opcjonalnie potok przetwarzania wideo może odbierać maksymalnie 15 podstreamów wideo. Podstream zawiera pomocnicze dane obrazu, takie jak napisy zamknięte lub podtypy DVD. Te obrazy są wyświetlane w podstawowym strumieniu wideo i zazwyczaj nie mają być wyświetlane samodzielnie. Obrazy podrzędne mogą zawierać dane alfa na piksel i są zawsze ramkami progresywnymi. Urządzenie do przetwarzania wideo alfa łączy obrazy podrzędne z bieżącą ramką z odciętą ramką z podstawowego strumienia wideo.
W pozostałej części tego tematu termin obraz jest używany dla danych wejściowych na urządzeniu do przetwarzania wideo. Obraz może składać się z ramki progresywnej, jednego pola lub dwóch przeplatanych pól. Dane wyjściowe są zawsze ramką zdeinterlaced.
Sterownik wideo może zaimplementować więcej niż jedno urządzenie do przetwarzania wideo, aby zapewnić różne zestawy możliwości przetwarzania wideo. Urządzenia są identyfikowane przez identyfikator GUID. Następujące identyfikatory GUID są wstępnie zdefiniowane:
- DXVA2_VideoProcBobDevice. To urządzenie wykonuje deinterlacing bob.
- DXVA2_VideoProcProgressiveDevice. To urządzenie jest używane, jeśli wideo zawiera tylko ramki progresywne, bez ramek przeplotowych. (Niektóre treści wideo zawierają mieszankę progresywnych i przeplatanych ramek. Nie można używać urządzenia progresywnego dla tego rodzaju "mieszanej" zawartości wideo, ponieważ dla ramek z przeplotem wymagany jest krok odgałęzienia).
Każdy sterownik graficzny obsługujący przetwarzanie wideo DXVA musi implementować co najmniej te dwa urządzenia. Sterownik graficzny może również udostępniać inne urządzenia, które są identyfikowane przez identyfikatory GUID specyficzne dla sterownika. Na przykład sterownik może zaimplementować zastrzeżony algorytm deinterlacingu, który generuje lepszą jakość danych wyjściowych niż bob deinterlacing. Niektóre algorytmy deinterlacingu mogą wymagać obrazów odwołania do przodu lub wstecz z podstawowego strumienia. Jeśli tak, obiekt wywołujący musi dostarczyć te obrazy do sterownika w odpowiedniej sekwencji, zgodnie z opisem w dalszej części tej sekcji.
Dostępne jest również urządzenie referencyjne oprogramowania. Urządzenie programowe jest zoptymalizowane pod kątem jakości, a nie szybkości i może nie być odpowiednie do przetwarzania wideo w czasie rzeczywistym. Urządzenie referencyjne oprogramowania używa DXVA2_VideoProcSoftwareDevice wartości identyfikatora GUID.
Tworzenie urządzenia do przetwarzania wideo
Przed rozpoczęciem przetwarzania wideo DXVA aplikacja musi utworzyć urządzenie do przetwarzania wideo. Poniżej przedstawiono krótki opis kroków, które zostały szczegółowo wyjaśnione w pozostałej części tej sekcji:
- Pobierz wskaźnik do interfejsu IDirectXVideoProcessorService .
- Utwórz opis formatu wideo dla podstawowego strumienia wideo. Użyj tego opisu, aby uzyskać listę urządzeń do przetwarzania wideo, które obsługują format wideo. Urządzenia są identyfikowane przez identyfikator GUID.
- W przypadku określonego urządzenia pobierz listę formatów render-target obsługiwanych przez urządzenie. Formaty są zwracane jako lista D3DFORMAT wartości. Jeśli planujesz mieszać podstreamy, pobierz również listę obsługiwanych formatów podstream.
- Wykonywanie zapytań dotyczących możliwości poszczególnych urządzeń.
- Utwórz urządzenie do przetwarzania wideo.
Czasami można pominąć niektóre z tych kroków. Na przykład zamiast pobierania listy formatów render-target można po prostu spróbować utworzyć urządzenie do przetwarzania wideo z preferowanym formatem i sprawdzić, czy to się powiedzie. Typowy format, taki jak D3DFMT_X8R8G8B8, prawdopodobnie zakończy się powodzeniem.
W pozostałej części tej sekcji opisano szczegółowo te kroki.
Pobieranie wskaźnika IDirectXVideoProcessorService
Interfejs IDirectXVideoProcessorService jest uzyskiwany z urządzenia Direct3D. Istnieją dwa sposoby uzyskania wskaźnika do tego interfejsu:
- Z urządzenia Direct3D.
- Z Menedżera urządzeń Direct3D.
Jeśli masz wskaźnik do urządzenia Direct3D, możesz uzyskać wskaźnik IDirectXVideoProcessorService , wywołując funkcję DXVA2CreateVideoService . Przekaż wskaźnik do interfejsu IDirect3DDevice9 urządzenia i określ IID_IDirectXVideoProcessorService dla parametru riid , jak pokazano w poniższym kodzie:
// Create the DXVA-2 Video Processor service.
hr = DXVA2CreateVideoService(g_pD3DD9, IID_PPV_ARGS(&g_pDXVAVPS));
n niektórych przypadków jeden obiekt tworzy urządzenie Direct3D, a następnie udostępnia go innym obiektom za pośrednictwem Menedżera urządzeń Direct3D. W takiej sytuacji można wywołać element IDirect3DDeviceManager9::GetVideoService w menedżerze urządzeń, aby uzyskać wskaźnik IDirectXVideoProcessorService , jak pokazano w poniższym kodzie:
HRESULT GetVideoProcessorService(
IDirect3DDeviceManager9 *pDeviceManager,
IDirectXVideoProcessorService **ppVPService
)
{
*ppVPService = NULL;
HANDLE hDevice;
HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
if (SUCCEEDED(hr))
{
// Get the video processor service
HRESULT hr2 = pDeviceManager->GetVideoService(
hDevice,
IID_PPV_ARGS(ppVPService)
);
// Close the device handle.
hr = pDeviceManager->CloseDeviceHandle(hDevice);
if (FAILED(hr2))
{
hr = hr2;
}
}
if (FAILED(hr))
{
SafeRelease(ppVPService);
}
return hr;
}
Wyliczanie urządzeń do przetwarzania wideo
Aby uzyskać listę urządzeń do przetwarzania wideo, wypełnij strukturę DXVA2_VideoDesc formatem podstawowego strumienia wideo i przekaż tę strukturę do metody IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids . Metoda zwraca tablicę identyfikatorów GUID, jedną dla każdego urządzenia do przetwarzania wideo, które może być używane z tym formatem wideo.
Rozważmy aplikację, która renderuje strumień wideo w formacie YUY2, używając definicji BT.709 koloru YUV z szybkością klatek na sekundę wynoszącą 29,97 ramek. Załóżmy, że zawartość wideo składa się całkowicie z ramek progresywnych. Poniższy fragment kodu przedstawia sposób wypełniania opisu formatu i pobierania identyfikatorów GUID urządzenia:
// Initialize the video descriptor.
g_VideoDesc.SampleWidth = VIDEO_MAIN_WIDTH;
g_VideoDesc.SampleHeight = VIDEO_MAIN_HEIGHT;
g_VideoDesc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2;
g_VideoDesc.SampleFormat.NominalRange = DXVA2_NominalRange_16_235;
g_VideoDesc.SampleFormat.VideoTransferMatrix = EX_COLOR_INFO[g_ExColorInfo][0];
g_VideoDesc.SampleFormat.VideoLighting = DXVA2_VideoLighting_dim;
g_VideoDesc.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_BT709;
g_VideoDesc.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_709;
g_VideoDesc.SampleFormat.SampleFormat = DXVA2_SampleProgressiveFrame;
g_VideoDesc.Format = VIDEO_MAIN_FORMAT;
g_VideoDesc.InputSampleFreq.Numerator = VIDEO_FPS;
g_VideoDesc.InputSampleFreq.Denominator = 1;
g_VideoDesc.OutputFrameFreq.Numerator = VIDEO_FPS;
g_VideoDesc.OutputFrameFreq.Denominator = 1;
// Query the video processor GUID.
UINT count;
GUID* guids = NULL;
hr = g_pDXVAVPS->GetVideoProcessorDeviceGuids(&g_VideoDesc, &count, &guids);
Kod dla tego przykładu jest pobierany z przykładu zestawu SDK DXVA2_VideoProc .
Tablica pGuids w tym przykładzie jest przydzielana przez metodę GetVideoProcessorDeviceGuids , więc aplikacja musi zwolnić tablicę, wywołując coTaskMemFree. Pozostałe kroki można wykonać przy użyciu dowolnego identyfikatora GUID urządzenia zwróconego przez tę metodę.
Wyliczanie formatów Render-Target
Aby uzyskać listę formatów render-target obsługiwanych przez urządzenie, przekaż identyfikator GUID urządzenia i strukturę DXVA2_VideoDesc do IDirectXVideoProcessorService::GetVideoProcessorRenderTargets , jak pokazano w poniższym kodzie:
// Query the supported render-target formats.
UINT i, count;
D3DFORMAT* formats = NULL;
HRESULT hr = g_pDXVAVPS->GetVideoProcessorRenderTargets(
guid, &g_VideoDesc, &count, &formats);
if (FAILED(hr))
{
DBGMSG((L"GetVideoProcessorRenderTargets failed: 0x%x.\n", hr));
return FALSE;
}
for (i = 0; i < count; i++)
{
if (formats[i] == VIDEO_RENDER_TARGET_FORMAT)
{
break;
}
}
CoTaskMemFree(formats);
if (i >= count)
{
DBGMSG((L"The device does not support the render-target format.\n"));
return FALSE;
}
Metoda zwraca tablicę wartości D3DFORMAT . W tym przykładzie, gdzie typem danych wejściowych jest YUY2, typową listą formatów może być D3DFMT_X8R8G8B8 (32-bitowy RGB) i D3DMFT_YUY2 (format wejściowy). Jednak dokładna lista będzie zależeć od sterownika.
Lista dostępnych formatów dla podstreams może się różnić w zależności od formatu render-target i formatu wejściowego. Aby uzyskać listę formatów podstream, przekaż identyfikator GUID urządzenia, strukturę formatu i format render-target do formatu IDirectXVideoProcessorService::GetVideoProcessorFormats , jak pokazano w poniższym kodzie:
// Query the supported substream formats.
formats = NULL;
hr = g_pDXVAVPS->GetVideoProcessorSubStreamFormats(
guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &count, &formats);
if (FAILED(hr))
{
DBGMSG((L"GetVideoProcessorSubStreamFormats failed: 0x%x.\n", hr));
return FALSE;
}
for (i = 0; i < count; i++)
{
if (formats[i] == VIDEO_SUB_FORMAT)
{
break;
}
}
CoTaskMemFree(formats);
if (i >= count)
{
DBGMSG((L"The device does not support the substream format.\n"));
return FALSE;
}
Ta metoda zwraca kolejną tablicę wartości D3DFORMAT . Typowe formaty podstream to AYUV i AI44.
Wykonywanie zapytań dotyczących możliwości urządzenia
Aby uzyskać możliwości określonego urządzenia, przekaż identyfikator GUID urządzenia, strukturę formatu i format elementu docelowego renderowania do metody IDirectXVideoProcessorService::GetVideoProcessorCaps . Metoda wypełnia strukturę DXVA2_VideoProcessorCaps możliwościami urządzenia.
// Query video processor capabilities.
hr = g_pDXVAVPS->GetVideoProcessorCaps(
guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &g_VPCaps);
if (FAILED(hr))
{
DBGMSG((L"GetVideoProcessorCaps failed: 0x%x.\n", hr));
return FALSE;
}
Tworzenie urządzenia
Aby utworzyć urządzenie do przetwarzania wideo, wywołaj metodę IDirectXVideoProcessorService::CreateVideoProcessor. Dane wejściowe tej metody to identyfikator GUID urządzenia, opis formatu, format docelowy renderowania i maksymalna liczba podstreamów, które mają być mieszane. Metoda zwraca wskaźnik do interfejsu IDirectXVideoProcessor , który reprezentuje urządzenie do przetwarzania wideo.
// Finally create a video processor device.
hr = g_pDXVAVPS->CreateVideoProcessor(
guid,
&g_VideoDesc,
VIDEO_RENDER_TARGET_FORMAT,
SUB_STREAM_COUNT,
&g_pDXVAVPD
);
Blit procesu wideo
Główną operacją przetwarzania wideo jest blit przetwarzania wideo. ( Blit to dowolna operacja, która łączy co najmniej dwie mapy bitowe w jedną mapę bitową. Blit przetwarzania wideo łączy obrazy wejściowe w celu utworzenia ramki wyjściowej. Aby wykonać błąd przetwarzania wideo, wywołaj metodę IDirectXVideoProcessor::VideoProcessBlt. Ta metoda przekazuje zestaw przykładów wideo do urządzenia do przetwarzania wideo. W odpowiedzi urządzenie do przetwarzania wideo przetwarza obrazy wejściowe i generuje jedną ramkę wyjściową. Przetwarzanie może obejmować deinterlacing, konwersję przestrzeni kolorów i mieszanie podstream. Dane wyjściowe są zapisywane na powierzchni docelowej dostarczonej przez obiekt wywołujący.
Metoda VideoProcessBlt przyjmuje następujące parametry:
- PRT wskazuje powierzchnię docelową renderowania IDirect3DSurface9 , która otrzyma przetworzoną ramkę wideo.
- pBltParams wskazuje DXVA2_VideoProcessBltParams strukturę określającą parametry dla usterki.
- pSamples to adres tablicy struktur DXVA2_VideoSample . Te struktury zawierają próbki danych wejściowych dla błędu.
- Zestawy NumSamples dają rozmiar tablicy pSamples .
- Zarezerwowany parametr jest zarezerwowany i powinien być ustawiony na wartość NULL.
W tablicy pSamples obiekt wywołujący musi podać następujące przykłady danych wejściowych:
- Bieżący obraz z podstawowego strumienia wideo.
- Obrazy odwołujące się do przodu i do tyłu, jeśli są wymagane przez algorytm deinterlacingu.
- Zero lub więcej podstream obrazów, maksymalnie 15 podstreams.
Sterownik oczekuje, że ta tablica będzie w określonej kolejności, zgodnie z opisem w przykładowej kolejności danych wejściowych.
Parametrylitu
Struktura DXVA2_VideoProcessBltParams zawiera ogólne parametry dla błędu. Najważniejsze parametry są przechowywane w następujących elementach członkowskich struktury:
TargetFrame to czas prezentacji ramki wyjściowej. W przypadku zawartości progresywnej tym razem musi być równy czas rozpoczęcia bieżącej ramki z podstawowego strumienia wideo. Tym razem jest określony w elemencie Start struktury DXVA2_VideoSample dla tego przykładu wejściowego.
W przypadku zawartości z przeplotem ramka z dwoma przeplatanymi polami tworzy dwie ramki wyjściowe z odinterlacedem. W pierwszej ramce wyjściowej czas prezentacji musi być równy czas rozpoczęcia bieżącego obrazu w podstawowym strumieniu wideo, podobnie jak zawartość progresywna. W drugiej ramce wyjściowej czas rozpoczęcia musi być równy punkt środkowy między godziną rozpoczęcia bieżącego obrazu w podstawowym strumieniu wideo a czasem rozpoczęcia następnego obrazu w strumieniu. Jeśli na przykład wejściowy film wideo to 25 klatek na sekundę (50 pól na sekundę), ramki wyjściowe będą miały sygnatury czasowe pokazane w poniższej tabeli. Sygnatury czasowe są wyświetlane w jednostkach 100 nanosekund.
Obraz wejściowy Ramka docelowa (1) Ramka docelowa (2) 0 0 200000 400000 0 600000 800000 800000 1000000 1200000 1200000 1400000 Jeśli zawartość z przeplotem składa się z pojedynczych pól, a nie przeplatanych pól, czasy wyjściowe zawsze pasują do czasów wejściowych, tak jak w przypadku zawartości progresywnej.
TargetRect definiuje prostokątny region na powierzchni docelowej. Blit zapisze dane wyjściowe w tym regionie. W szczególności każdy piksel wewnątrz obiektu TargetRect zostanie zmodyfikowany i nie zostaną zmodyfikowane żadne piksele poza wartością TargetRect . Prostokąt docelowy definiuje prostokąt ograniczenia dla wszystkich wejściowych strumieni wideo. Umieszczanie poszczególnych strumieni w tym prostokątze jest kontrolowane za pośrednictwem parametru pSamplesIDirectXVideoProcessor::VideoProcessBlt.
BackgroundColor zapewnia kolor tła niezależnie od tego, gdzie nie jest wyświetlany żaden obraz wideo. Na przykład gdy obraz wideo 16 x 9 jest wyświetlany w obszarze 4 x 3 (letterboxing), regiony w polu litery są wyświetlane z kolorem tła. Kolor tła ma zastosowanie tylko w obrębie prostokąta docelowego (TargetRect). Wszystkie piksele poza targetRect nie są modyfikowane.
DestFormat opisuje przestrzeń kolorów wideo wyjściowego — na przykład czy ITU-R jest używany kolor BT.709 lub BT.601. Te informacje mogą mieć wpływ na sposób wyświetlania obrazu. Aby uzyskać więcej informacji, zobacz rozszerzone informacje o kolorze.
Inne parametry są opisane na stronie referencyjnej struktury DXVA2_VideoProcessBltParams .
Przykłady danych wejściowych
Parametr pSamplesIDirectXVideoProcessor::VideoProcessBlt wskazuje tablicę struktur DXVA2_VideoSample . Każda z tych struktur zawiera informacje o jednej próbce wejściowej i wskaźnik do powierzchni Direct3D, która zawiera próbkę. Każda próbka jest jedną z następujących czynności:
- Bieżący obraz ze strumienia podstawowego.
- Obraz odniesienia do przodu lub do tyłu ze strumienia podstawowego, używany do deinterlacingu.
- Podsieciowy obraz.
Dokładna kolejność, w jakiej próbki muszą pojawić się w tablicy, została opisana w dalszej części sekcji Input Sample Order (Przykładowa kolejność danych wejściowych).
Można dostarczyć maksymalnie 15 obrazów podrzędnych, chociaż większość aplikacji wideo potrzebuje maksymalnie jednego podstreamu. Liczba podstreamów może ulec zmianie z każdym wywołaniem metody VideoProcessBlt. Obrazy podrzędne są wskazywane przez ustawienie elementu członkowskiego SampleFormat.SampleFormat struktury DXVA2_VideoSample równej DXVA2_SampleSubStream. W przypadku podstawowego strumienia wideo ten element zawiera opis przeplotu wejściowego wideo. Aby uzyskać więcej informacji, zobacz DXVA2_SampleFormat wyliczenie.
W przypadku podstawowego strumienia wideo elementy członkowskie początkowe i końcowe struktury DXVA2_VideoSample dają czas rozpoczęcia i zakończenia przykładu wejściowego. W przypadku obrazów podrzędnych ustaw te wartości na zero, ponieważ czas prezentacji jest zawsze obliczany na podstawie strumienia podstawowego. Aplikacja jest odpowiedzialna za śledzenie, kiedy każdy podsieci obraz powinien być prezentowany i przesyłany do pliku VideoProcessBlt w odpowiednim czasie.
Dwa prostokąty definiują sposób pozycjonowania źródłowego wideo dla każdego strumienia:
- Element członkowski SrcRect struktury DXVA2_VideoSample określa prostokąt źródłowy, prostokątny region obrazu źródłowego, który pojawi się w złożonej ramce wyjściowej. Aby przyciąć obraz, ustaw tę wartość na mniejszą niż rozmiar ramki. W przeciwnym razie ustaw rozmiar ramki równy rozmiarowi ramki.
- Element członkowski DstRect tej samej struktury określa prostokąt docelowy, prostokątny obszar powierzchni docelowej, w którym będzie wyświetlana ramka wideo.
Sterownik blits pikseli z prostokąta źródłowego do prostokąta docelowego. Dwa prostokąty mogą mieć różne rozmiary lub współczynniki proporcji; sterownik przeskaluje obraz zgodnie z potrzebami. Ponadto każdy strumień wejściowy może używać innego współczynnika skalowania. W rzeczywistości skalowanie może być konieczne w celu uzyskania poprawnego współczynnika proporcji w ramce wyjściowej. Sterownik nie bierze pod uwagę współczynnika proporcji pikseli źródła, więc jeśli obraz źródłowy używa pikseli innych niż kwadratowe, do aplikacji należy obliczenie poprawnego prostokąta docelowego.
Preferowane formaty podstream to AYUV i AI44. Ten ostatni jest formatem paletyzowanym z 16 kolorami. Wpisy palety są określone w składowej Pal struktury DXVA2_VideoSample . (Jeśli źródłowy format wideo jest pierwotnie wyrażony jako typ nośnika programu Media Foundation, wpisy palety są przechowywane w atrybucie MF_MT_PALETTE ). W przypadku formatów niez paletyzowanych wyczyść tę tablicę na zero.
Kompozycja obrazu
Każda operacja blit jest definiowana przez następujące trzy prostokąty:
- Prostokąt docelowy (TargetRect) definiuje region na powierzchni docelowej, na której będą wyświetlane dane wyjściowe. Obraz wyjściowy jest przycięty do tego prostokąta.
- Prostokąt docelowy dla każdego strumienia (DstRect) definiuje miejsce wyświetlania strumienia wejściowego na obrazie złożonym.
- Prostokąt źródłowy dla każdego strumienia (SrcRect) definiuje, która część obrazu źródłowego jest wyświetlana.
Prostokąty docelowe i docelowe są określane względem powierzchni docelowej. Prostokąt źródłowy jest określony względem obrazu źródłowego. Wszystkie prostokąty są określone w pikselach.
Urządzenie do przetwarzania wideo alfa łączy obrazy wejściowe przy użyciu dowolnego z następujących źródeł danych alfa:
- Dane alfa na piksel z podstreams.
- Wartość alfa planarna dla każdego strumienia wideo określona w elemencie PlanarAlpha struktury DXVA2_VideoSample .
- Planarna wartość alfa złożonego obrazu określona w elemencie alfa struktury DXVA2_VideoProcessBltParams . Ta wartość służy do łączenia całego złożonego obrazu z kolorem tła.
W tej sekcji przedstawiono szereg przykładów pokazujących sposób tworzenia obrazu wyjściowego przez urządzenie do przetwarzania wideo.
Przykład 1. Skrzynka pocztowa
W tym przykładzie pokazano, jak ustawić pole literału obrazu źródłowego, ustawiając prostokąt docelowy na mniejszy niż prostokąt docelowy. Podstawowy strumień wideo w tym przykładzie to obraz 720 × 480 i ma być wyświetlany przy współczynniku proporcji 16:9. Powierzchnia docelowa to 640 × 480 pikseli (współczynnik proporcji 4:3). Aby osiągnąć prawidłowy współczynnik proporcji, prostokąt docelowy musi wynosić 640 × 360. Dla uproszczenia w tym przykładzie nie ma podstreamu. Na poniższym diagramie przedstawiono prostokąty źródłowe i docelowe.
Na powyższym diagramie przedstawiono następujące prostokąty:
Prostokąt docelowy: { 0, 0, 640, 480 }
Podstawowy film wideo:
- Prostokąt źródłowy: { 0, 0, 720, 480 }
- Prostokąt docelowy: { 0, 60, 640, 420 }
Sterownik zdeinterlace wideo, zmniejszy ramkę odinterlaced do 640 × 360 i rozbił ramkę do prostokąta docelowego. Prostokąt docelowy jest większy niż prostokąt docelowy, dlatego sterownik użyje koloru tła do wypełnienia poziomych pasków powyżej i poniżej ramki. Kolor tła jest określony w strukturze DXVA2_VideoProcessBltParams .
Przykład 2. Rozciąganie obrazów podrzędnych
Obrazy podrzędne mogą wykraczać poza podstawowy obraz wideo. Na przykład w wideo DVD podstawowy strumień wideo może mieć współczynnik proporcji 4:3, podczas gdy podstream wynosi 16:9. W tym przykładzie oba strumienie wideo mają te same wymiary źródłowe (720 × 480), ale podstream ma być wyświetlany przy współczynniku proporcji 16:9. Aby osiągnąć ten współczynnik proporcji, obraz podrzędny jest rozciągnięty w poziomie. Prostokąty źródłowe i docelowe są wyświetlane na poniższym diagramie.
Na powyższym diagramie przedstawiono następujące prostokąty:
Prostokąt docelowy: { 0, 0, 854, 480 }
Podstawowy film wideo:
- Prostokąt źródłowy: { 0, 0, 720, 480 }
- Prostokąt docelowy: { 0, 107, 474, 480 }
Podstream:
- Prostokąt źródłowy: { 0, 0, 720, 480 }
- Prostokąt docelowy: { 0, 0, 854, 480 }
Te wartości zachowują wysokość obrazu i skaluj oba obrazy w poziomie. W regionach, w których są wyświetlane oba obrazy, są one w połączeniu alfa. Gdzie obraz podstream wykracza poza podstawowy film wideo, podstream jest alfa w połączeniu z kolorem tła. To połączenie alfa odpowiada zmienionym kolorom po prawej stronie diagramu.
Przykład 3. Niezgodna wysokość strumienia
W poprzednim przykładzie podstream i strumień podstawowy mają taką samą wysokość. Strumienie mogą również mieć niedopasowane wysokości, jak pokazano w tym przykładzie. Obszary w prostokątze docelowym, w którym nie ma wyświetlanego filmu wideo, używają koloru tła — czarnego w tym przykładzie. Prostokąty źródłowe i docelowe są wyświetlane na poniższym diagramie.
Na powyższym diagramie przedstawiono następujące prostokąty:
- Prostokąt docelowy: { 0, 0, 150, 85 }
- Podstawowy film wideo:
- Prostokąt źródłowy: { 0, 0, 150, 50 }
- Prostokąt docelowy: { 0, 17, 150, 67 }
- Podstream:
- Prostokąt źródłowy: { 0, 0, 100, 85 }
- Prostokąt docelowy: { 25, 0, 125, 85 }
Przykład 4. Docelowy prostokąt mniejszy niż powierzchnia docelowa
W tym przykładzie pokazano przypadek, w którym prostokąt docelowy jest mniejszy niż powierzchnia docelowa.
Na powyższym diagramie przedstawiono następujące prostokąty:
- Powierzchnia docelowa: { 0, 0, 300, 200 }
- Prostokąt docelowy: { 0, 0, 150, 85 }
- Podstawowy film wideo:
- Prostokąt źródłowy: { 0, 0, 150, 50 }
- Prostokąt docelowy: { 0, 17, 150, 67 }
- Podstream:
- Prostokąt źródłowy: { 0, 0, 100, 85 }
- Prostokąt docelowy: { 25, 0, 125, 85 }
Piksele poza prostokątem docelowym nie są modyfikowane, więc kolor tła jest wyświetlany tylko w obrębie prostokąta docelowego. Obszar kropkowany wskazuje części powierzchni docelowej, których nie dotyczy błąd.
Przykład 5. Prostokąty źródłowe
Jeśli określisz prostokąt źródłowy, który jest mniejszy niż obraz źródłowy, sterownik rozerwa tylko ten fragment obrazu. W tym przykładzie prostokąty źródłowe określają prawą dolną ćwiartę podstawowego strumienia wideo i lewą dolną ćwiartkę podstreamu (wskazywaną przez znaczniki skrótu na diagramie). Prostokąty docelowe są takie same jak prostokąty źródłowe, więc wideo nie jest rozciągnięte. Prostokąty źródłowe i docelowe są wyświetlane na poniższym diagramie.
Na powyższym diagramie przedstawiono następujące prostokąty:
- Prostokąt docelowy: { 0, 0, 720, 576 }
- Podstawowy film wideo:
- Rozmiar powierzchni źródłowej: { 0, 0, 720, 480 }
- Prostokąt źródłowy: { 360, 240, 720, 480 }
- Prostokąt docelowy: { 0, 0, 360, 240 }
- Podstream:
- Rozmiar powierzchni źródłowej: { 0, 0, 640, 576 }
- Prostokąt źródłowy: { 0, 288, 320, 576 }
- Prostokąt docelowy: { 400, 0, 720, 288 }
Przykład 6. Intersecting Destination Prostokąty
Ten przykład jest podobny do poprzedniego, ale prostokąty docelowe przecinają się. Wymiary powierzchni są takie same jak w poprzednim przykładzie, ale prostokąty źródłowe i docelowe nie są. Ponownie wideo jest przycięte, ale nie rozciągnięte. Prostokąty źródłowe i docelowe są wyświetlane na poniższym diagramie.
Na powyższym diagramie przedstawiono następujące prostokąty:
- Prostokąt docelowy: { 0, 0, 720, 576 }
- Podstawowy film wideo:
- Rozmiar powierzchni źródłowej: { 0, 0, 720, 480 }
- Prostokąt źródłowy: { 260, 92, 720, 480 }
- Prostokąt docelowy: { 0, 0, 460, 388 }
- Podstream:
- Rozmiar powierzchni źródłowej: { 0, 0, 640, 576 }
- Prostokąt źródłowy: { 0, 0, 460, 388 }
- Prostokąt docelowy: { 260, 188, 720, 576 }
Przykład 7. Rozciąganie i przycinanie wideo
W tym przykładzie wideo jest rozciągnięte, a także przycięte. Obszar 180 × 120 z każdego strumienia jest rozproszony w celu pokrycia 360 × 240 obszaru w prostokątze docelowym.
Na powyższym diagramie przedstawiono następujące prostokąty:
- Prostokąt docelowy: { 0, 0, 720, 480 }
- Podstawowy film wideo:
- Rozmiar powierzchni źródłowej: { 0, 0, 360, 240 }
- Prostokąt źródłowy: { 180, 120, 360, 240 }
- Prostokąt docelowy: { 0, 0, 360, 240 }
- Podstream:
- Rozmiar powierzchni źródłowej: { 0, 0, 360, 240 }
- Prostokąt źródłowy: { 0, 0, 180, 120 }
- Prostokąt docelowy: { 360, 240, 720, 480 }
Przykładowa kolejność danych wejściowych
Parametr pSamples metody VideoProcessBlt jest wskaźnikiem do tablicy przykładów wejściowych. Przykłady z podstawowego strumienia wideo są wyświetlane jako pierwsze, a następnie obrazy podrzędne w kolejności Z. Przykłady należy umieścić w tablicy w następującej kolejności:
- Przykłady dla podstawowego strumienia wideo są wyświetlane jako pierwsze w tablicy w kolejności czasowej. W zależności od trybu deinterlace sterownik może wymagać co najmniej jednego przykładu odwołania z podstawowego strumienia wideo. Elementy członkowskie NumForwardRefSamples i NumBackwardRefSamples struktury DXVA2_VideoProcessorCaps określają liczbę przykładów odwołań do przodu i wstecz. Obiekt wywołujący musi podać te przykłady referencyjne, nawet jeśli zawartość wideo jest progresywna i nie wymaga odlotu. (Może się to zdarzyć, gdy ramki progresywne są przekazywane do urządzenia z deinterlacingiem, na przykład gdy źródło zawiera mieszankę ramek przeplatanych i progresywnych).
- Po próbkach dla podstawowego strumienia wideo tablica może zawierać maksymalnie 15 przykładów podstream, rozmieszczonych w kolejności Z od dołu do góry. Podstreamy są zawsze progresywne i nie wymagają obrazów referencyjnych.
W dowolnym momencie podstawowy strumień wideo może przełączać się między zawartością przeplotową i progresywną, a liczba podstreamów może ulec zmianie.
Element członkowski SampleFormat.SampleFormat struktury DXVA2_VideoSample wskazuje typ obrazu. W przypadku obrazów podrzędnych ustaw tę wartość na DXVA2_SampleSubStream. W przypadku obrazów progresywnych wartość jest DXVA2_SampleProgressiveFrame. W przypadku obrazów z przeplotem wartość zależy od układu pola.
Jeśli sterownik wymaga przykładów odwołania do przodu i do tyłu, pełna liczba próbek może nie być dostępna na początku sekwencji wideo. W takim przypadku dołącz wpisy do nich w tablicy pSamples , ale oznacz brakujące przykłady jako typ DXVA2_SampleUnknown.
Elementy członkowskie początkowe i końcowe struktury DXVA2_VideoSample zapewniają lokalizację czasową każdej próbki. Te wartości są używane tylko dla przykładów z podstawowego strumienia wideo. W przypadku obrazów podrzędnych ustaw dla obu elementów członkowskich wartość zero.
Poniższe przykłady mogą pomóc w wyjaśnieniu tych wymagań.
Przykład 1
Najprostszy przypadek występuje, gdy nie ma podstreams, a algorytm deinterlacingu nie wymaga przykładów odwołań (NumForwardRefSamples i NumBackwardRefSamples są zerowe ). Bob deinterlacing jest przykładem takiego algorytmu. W takim przypadku tablica pSamples powinna zawierać jedną powierzchnię wejściową, jak pokazano w poniższej tabeli.
| Indeks | Typ powierzchni | Lokalizacja czasowa |
|---|---|---|
| pSamples[0] | Przeplatany obraz. | T |
Przyjmuje się, że wartość czasu T to godzina rozpoczęcia bieżącej ramki wideo.
Przykład 2
W tym przykładzie aplikacja łączy dwa podstreamy ze strumieniem podstawowym. Algorytm deinterlacingu nie wymaga przykładów referencyjnych. W poniższej tabeli przedstawiono sposób rozmieszczania tych przykładów w tablicy pSamples .
| Indeks | Typ powierzchni | Lokalizacja czasowa | Porządek Z |
|---|---|---|---|
| pSamples[0] | Obraz z przeplotem | T | 0 |
| pSamples[1] | Podstream | 0 | 1 |
| pSamples[2] | Podstream | 0 | 2 |
Przykład 3
Teraz załóżmy, że algorytm deinterlacingu wymaga jednego przykładu odwołania wstecznego i jednego przykładu odwołania do przodu. Ponadto są udostępniane dwa podstream zdjęcia, w sumie pięć powierzchni. Prawidłowa kolejność jest wyświetlana w poniższej tabeli.
| Indeks | Typ powierzchni | Lokalizacja czasowa | Porządek Z |
|---|---|---|---|
| pSamples[0] | Obraz przeplotowy (odwołanie) | T −1 | Nie dotyczy |
| pSamples[1] | Obraz z przeplotem | T | 0 |
| pSamples[2] | Obraz przeplotowy (odwołanie) | T +1 | Nie dotyczy |
| pSamples[3] | Podstream | 0 | 1 |
| pSamples[4] | Podstream | 0 | 2 |
Czas T −1 to czas rozpoczęcia ramki przed bieżącą ramką, a T +1 to godzina rozpoczęcia następującej ramki.
Jeśli strumień wideo przełączy się do zawartości progresywnej, używając tego samego trybu usuwania, aplikacja musi podać taką samą liczbę próbek, jak pokazano w poniższej tabeli.
| Indeks | Typ powierzchni | Lokalizacja czasowa | Porządek Z |
|---|---|---|---|
| pSamples[0] | Obraz progresywny (odwołanie) | T −1 | Nie dotyczy |
| pSamples[1] | Obraz progresywny | T | 0 |
| pSamples[2] | Obraz progresywny (odwołanie) | T +1 | Nie dotyczy |
| pSamples[3] | Podstream | 0 | 1 |
| pSamples[4] | Podstream | 0 | 2 |
Przykład 4
Na początku sekwencji wideo przykłady odwołań do przodu i do tyłu mogą być niedostępne. W takim przypadku wpisy dla brakujących przykładów znajdują się w tablicy pSamples z typem przykładowym DXVA2_SampleUnknown.
Zakładając, że tryb deinterlacingu wymaga jednego przykładu do przodu i jednego odwołania wstecznego, pierwsze trzy wywołania metody VideoProcessBlt będą miały sekwencje danych wejściowych pokazanych w poniższych trzech tabelach.
| Indeks | Typ powierzchni | Lokalizacja czasowa |
|---|---|---|
| pSamples[0] | Nieznany | 0 |
| pSamples[1] | Nieznany | 0 |
| pSamples[2] | Obraz przeplotowy (odwołanie) | T +1 |
| Indeks | Typ powierzchni | Lokalizacja czasowa |
|---|---|---|
| pSamples[0] | Nieznany | 0 |
| pSamples[1] | Obraz z przeplotem | T |
| pSamples[2] | Obraz przeplotowy (odwołanie) | T +1 |
| Indeks | Typ powierzchni | Lokalizacja czasowa |
|---|---|---|
| pSamples[0] | Obraz z przeplotem | T −1 |
| pSamples[1] | Obraz z przeplotem | T |
| pSamples[2] | Obraz przeplotowy (odwołanie) | T +1 |
Tematy pokrewne