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.
Usługa Microsoft DirectX Video Acceleration High Definition (DXVA-HD) używa dwóch podstawowych interfejsów:
- IDXVAHD_Device. Reprezentuje urządzenie DXVA-HD. Użyj tego interfejsu, aby wykonywać zapytania dotyczące możliwości urządzenia i tworzyć procesor wideo.
- IDXVAHD_VideoProcessor. Reprezentuje zestaw możliwości przetwarzania wideo. Użyj tego interfejsu, aby wykonać operację blit przetwarzania wideo.
W poniższym kodzie przyjmuje się następujące zmienne globalne:
IDirect3D9Ex *g_pD3D = NULL;
IDirect3DDevice9Ex *g_pD3DDevice = NULL; // Direct3D device.
IDXVAHD_Device *g_pDXVAHD = NULL; // DXVA-HD device.
IDXVAHD_VideoProcessor *g_pDXVAVP = NULL; // DXVA-HD video processor.
IDirect3DSurface9 *g_pSurface = NULL; // Video surface.
const D3DFORMAT RENDER_TARGET_FORMAT = D3DFMT_X8R8G8B8;
const D3DFORMAT VIDEO_FORMAT = D3DFMT_X8R8G8B8;
const UINT VIDEO_FPS = 60;
const UINT VIDEO_WIDTH = 640;
const UINT VIDEO_HEIGHT = 480;
Aby utworzyć procesor wideo DXVA-HD:
Wypełnij strukturę DXVAHD_CONTENT_DESC opisem zawartości wideo. Sterownik używa tych informacji jako wskazówki, aby zoptymalizować możliwości procesora wideo. Struktura nie zawiera pełnego opisu formatu.
DXVAHD_RATIONAL fps = { VIDEO_FPS, 1 }; DXVAHD_CONTENT_DESC desc; desc.InputFrameFormat = DXVAHD_FRAME_FORMAT_PROGRESSIVE; desc.InputFrameRate = fps; desc.InputWidth = VIDEO_WIDTH; desc.InputHeight = VIDEO_HEIGHT; desc.OutputFrameRate = fps; desc.OutputWidth = VIDEO_WIDTH; desc.OutputHeight = VIDEO_HEIGHT;Wywołaj DXVAHD_CreateDevice, aby utworzyć urządzenie DXVA-HD. Ta funkcja zwraca wskaźnik do interfejsu IDXVAHD_Device.
hr = DXVAHD_CreateDevice(g_pD3DDevice, &desc, DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL, NULL, &pDXVAHD);Wywołaj IDXVAHD_Device::GetVideoProcessorDeviceCaps. Ta metoda wypełnia strukturę DXVAHD_VPDEVCAPS możliwościami urządzenia. Jeśli potrzebujesz określonych funkcji przetwarzania wideo, takich jak klucz luma lub filtrowanie obrazów, sprawdź ich dostępność przy użyciu tej struktury.
DXVAHD_VPDEVCAPS caps; hr = pDXVAHD->GetVideoProcessorDeviceCaps(&caps);Sprawdź, czy urządzenie DXVA-HD obsługuje wymagane formaty wideo wejściowe. W temacie Sprawdzanie obsługiwanych formatów DXVA-HD opisano ten krok bardziej szczegółowo.
Sprawdź, czy urządzenie DXVA-HD obsługuje wymagany format danych wyjściowych. W sekcji Sprawdzanie obsługiwanych formatów DXVA-HD opisano ten krok bardziej szczegółowo.
Przydziel tablicę struktur typu DXVAHD_VPCAPS. Liczba elementów tablicy, które należy przydzielić, jest podawana przez VideoProcessorCount składowej struktury DXVAHD_VPDEVCAPS uzyskanej w kroku 3.
// Create the array of video processor caps. DXVAHD_VPCAPS *pVPCaps = new (std::nothrow) DXVAHD_VPCAPS[ caps.VideoProcessorCount ]; if (pVPCaps == NULL) { return E_OUTOFMEMORY; }Każda struktura DXVAHD_VPCAPS reprezentuje odrębny procesor wideo. Tę tablicę można wykonać w pętli, aby odnaleźć możliwości każdego procesora wideo. Struktura zawiera informacje o możliwościach deinterlacingu, przetwarzania telecine i konwersji częstotliwości klatek procesora wideo.
Wybierz procesor wideo do utworzenia. Element VPGuid struktury DXVAHD_VPCAPS zawiera identyfikator GUID, który jednoznacznie identyfikuje procesor wideo. Przekaż GUID do metody IDXVAHD_Device::CreateVideoProcessor. Metoda zwraca wskaźnik IDXVAHD_VideoProcessor.
HRESULT hr = pDXVAHD->GetVideoProcessorCaps( caps.VideoProcessorCount, pVPCaps);Opcjonalnie wywołaj IDXVAHD_Device::CreateVideoSurface, aby utworzyć tablicę wejściowych powierzchni wideo.
Poniższy przykład kodu przedstawia pełną sekwencję kroków:
// Initializes the DXVA-HD video processor.
// NOTE: The following example makes some simplifying assumptions:
//
// 1. There is a single input stream.
// 2. The input frame rate matches the output frame rate.
// 3. No advanced DXVA-HD features are needed, such as luma keying or IVTC.
// 4. The application uses a single input video surface.
HRESULT InitializeDXVAHD()
{
if (g_pD3DDevice == NULL)
{
return E_FAIL;
}
HRESULT hr = S_OK;
IDXVAHD_Device *pDXVAHD = NULL;
IDXVAHD_VideoProcessor *pDXVAVP = NULL;
IDirect3DSurface9 *pSurf = NULL;
DXVAHD_RATIONAL fps = { VIDEO_FPS, 1 };
DXVAHD_CONTENT_DESC desc;
desc.InputFrameFormat = DXVAHD_FRAME_FORMAT_PROGRESSIVE;
desc.InputFrameRate = fps;
desc.InputWidth = VIDEO_WIDTH;
desc.InputHeight = VIDEO_HEIGHT;
desc.OutputFrameRate = fps;
desc.OutputWidth = VIDEO_WIDTH;
desc.OutputHeight = VIDEO_HEIGHT;
#ifdef USE_SOFTWARE_PLUGIN
HMODULE hSWPlugin = LoadLibrary(L"C:\\dxvahdsw.dll");
PDXVAHDSW_Plugin pSWPlugin = (PDXVAHDSW_Plugin)GetProcAddress(hSWPlugin, "DXVAHDSW_Plugin");
hr = DXVAHD_CreateDevice(g_pD3DDevice, &desc,DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL,
pSWPlugin, &pDXVAHD);
#else
hr = DXVAHD_CreateDevice(g_pD3DDevice, &desc, DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL,
NULL, &pDXVAHD);
#endif
if (FAILED(hr))
{
goto done;
}
DXVAHD_VPDEVCAPS caps;
hr = pDXVAHD->GetVideoProcessorDeviceCaps(&caps);
if (FAILED(hr))
{
goto done;
}
// Check whether the device supports the input and output formats.
hr = CheckInputFormatSupport(pDXVAHD, caps, VIDEO_FORMAT);
if (FAILED(hr))
{
goto done;
}
hr = CheckOutputFormatSupport(pDXVAHD, caps, RENDER_TARGET_FORMAT);
if (FAILED(hr))
{
goto done;
}
// Create the VP device.
hr = CreateVPDevice(pDXVAHD, caps, &pDXVAVP);
if (FAILED(hr))
{
goto done;
}
// Create the video surface for the primary video stream.
hr = pDXVAHD->CreateVideoSurface(
VIDEO_WIDTH,
VIDEO_HEIGHT,
VIDEO_FORMAT,
caps.InputPool,
0, // Usage
DXVAHD_SURFACE_TYPE_VIDEO_INPUT,
1, // Number of surfaces to create
&pSurf, // Array of surface pointers
NULL
);
if (FAILED(hr))
{
goto done;
}
g_pDXVAHD = pDXVAHD;
g_pDXVAHD->AddRef();
g_pDXVAVP = pDXVAVP;
g_pDXVAVP->AddRef();
g_pSurface = pSurf;
g_pSurface->AddRef();
done:
SafeRelease(&pDXVAHD);
SafeRelease(&pDXVAVP);
SafeRelease(&pSurf);
return hr;
}
Funkcja CreateVPDevice pokazana w tym przykładzie tworzy procesor wideo (kroki 5–7):
// Creates a DXVA-HD video processor.
HRESULT CreateVPDevice(
IDXVAHD_Device *pDXVAHD,
const DXVAHD_VPDEVCAPS& caps,
IDXVAHD_VideoProcessor **ppDXVAVP
)
{
// Create the array of video processor caps.
DXVAHD_VPCAPS *pVPCaps =
new (std::nothrow) DXVAHD_VPCAPS[ caps.VideoProcessorCount ];
if (pVPCaps == NULL)
{
return E_OUTOFMEMORY;
}
HRESULT hr = pDXVAHD->GetVideoProcessorCaps(
caps.VideoProcessorCount, pVPCaps);
// At this point, an application could loop through the array and examine
// the capabilities. For purposes of this example, however, we simply
// create the first video processor in the list.
if (SUCCEEDED(hr))
{
// The VPGuid member contains the GUID that identifies the video
// processor.
hr = pDXVAHD->CreateVideoProcessor(&pVPCaps[0].VPGuid, ppDXVAVP);
}
delete [] pVPCaps;
return hr;
}
Tematy pokrewne