Sdílet prostřednictvím


Podpora DXVA 2.0 v Media Foundation

Toto téma popisuje, jak podporovat DirectX Video Acceleration (DXVA) 2.0 v transformaci Media Foundation (MFT) pomocí Microsoft Direct3D 9. Konkrétně popisuje komunikaci mezi dekodérem a rendererem videa, který je zprostředkován zavaděčem topologie. Toto téma nepopisuje, jak implementovat dekódování DXVA.

Ve zbývající části tohoto tématu se termín dekodér vztahuje k dekodéru MFT, který přijímá komprimované video a produkuje nekomprimované video. Termín dekodér označuje hardwarový akcelerátor videa implementovaný grafickým ovladačem.

Spropitné

Informace o dekódování videa v Microsoft Direct3D 11 najdete v tématu Podpora dekódování videa Direct3D 11 v Media Foundation.

 

Poznámka

Aplikace pro Windows Store musí používat Direct3D 11.

 

Tady jsou základní kroky, které dekodér musí provést pro podporu DXVA 2.0 v Media Foundation:

  1. Otevřete rukojeť grafického zařízení Direct3D 9.
  2. Vyhledejte konfiguraci dekodéru DXVA.
  3. Přidělení nekomprimovaných vyrovnávacích pamětí
  4. Dekódujte rámce.

Tyto kroky jsou podrobněji popsány ve zbývající části tohoto tématu.

Otevření úchytu zařízení Direct3D

MFT využívá správce Microsoft Direct3D pro získání popisovače zařízení Direct3D 9. Chcete-li otevřít popisovač zařízení, proveďte následující kroky:

  1. Vystavit atribut MF_SA_D3D_AWARE s hodnotou TRUE. Zavaděč topologie dotazuje tento atribut voláním IMFTransform::GetAttributes. Nastavení atributu na TRUE upozorní načítač topologie, že MFT podporuje DXVA.
  2. Když začne vyjednávání formátu, zavaděč topologie volá IMFTransform::ProcessMessage se zprávou MFT_MESSAGE_SET_D3D_MANAGER. Parametr ulParam je IUnknown ukazatel na správce zařízení Direct3D video rendereru. Zadejte dotaz na tento ukazatel IDirect3DDeviceManager9 rozhraní.
  3. Pro zavolání použijte IDirect3DDeviceManager9::OpenDeviceHandle pro získání popisovače zařízení Direct3D vykreslovače.
  4. Volejte IDirect3DDeviceManager9::GetVideoService a předat identifikátor zařízení. Tato metoda vrátí ukazatel na rozhraní IDirectXVideoDecoderService.
  5. Uložte ukazatele a popisovač zařízení do mezipaměti.

Vyhledání konfigurace dekodéru

MFT musí najít kompatibilní konfiguraci pro zařízení dekodéru DXVA. Po ověření vstupního typu proveďte následující kroky uvnitř metody MMFTransform::SetInputType:

  1. Volání IDirectXVideoDecoderService::GetDecoderDeviceGuids. Tato metoda vrátí pole identifikátorů GUID dekodéru zařízení.

  2. Projděte pole identifikátorů GUID dekodéru a najděte ty, které dekodér podporuje. Například pro dekodér MPEG-2 byste hledali DXVA2_ModeMPEG2_MOCOMP, DXVA2_ModeMPEG2_IDCTnebo DXVA2_ModeMPEG2_VLD.

  3. Když najdete identifikátor GUID zařízení dekodéru kandidáta, předejte identifikátor GUID do metody IDirectXVideoDecoderService::GetDecoderRenderTargets. Tato metoda vrátí pole cílových formátů vykreslení zadané jako D3DFORMAT hodnoty.

  4. Projděte cílové formáty vykreslování a vyhledejte formát podporovaný dekodérem.

  5. Volání IDirectXVideoDecoderService::GetDecoderConfigurations. Předejte stejný identifikátor GUID dekodéru spolu se strukturou DXVA2_VideoDesc, která popisuje navrhovaný výstupní formát. Metoda vrátí pole DXVA2_ConfigPictureDecode struktur. Každá struktura popisuje jednu možnou konfiguraci pro dekodérové zařízení. Vyhledejte konfiguraci, kterou dekodér podporuje.

  6. Uložte cílový formát a konfiguraci vykreslení.

Ve metodě IMFTransform::GetOutputAvailableType vrátí nekomprimovaný formát videa na základě navrhovaného cílového formátu vykreslení.

Ve metodě IMFTransform::SetOutputType zkontrolujte typ média oproti formátu cílového vykreslení.

Náhradní dekódování softwaru

Pokud MFT nemůže najít konfiguraci DXVA (například pokud grafický ovladač nemá správné schopnosti), měl by vrátit kód chyby MF_E_UNSUPPORTED_D3D_TYPE z SetInputType a SetOutputType metody. Zavaděč topologie odpoví odesláním zprávy MFT_MESSAGE_SET_D3D_MANAGER s hodnotou NULL pro parametr ulParam. MFT by měl uvolnit svůj ukazatel na rozhraní IDirect3DDeviceManager9. Zavaděč topologie pak znovu vyhodnotí typ média a MFT může používat dekódování softwaru.

Přidělování nekomprimovaných vyrovnávacích pamětí

V DXVA 2.0 je dekodér zodpovědný za přidělování povrchů Direct3D, které slouží jako nekomprimované vyrovnávací paměti videa. Dekodér by měl přidělit 3 plochy pro EVR pro použití pro deinterlacing. Toto číslo je pevné, protože Media Foundation neposkytuje způsob, aby EVR určila, kolik povrchů grafický ovladač vyžaduje pro prokládání. Tři plochy by měly být dostatečné pro každého řidiče.

V IMFTransform::GetOutputStreamInfo nastavte příznak MFT_OUTPUT_STREAM_PROVIDES_SAMPLES ve struktuře MFT_OUTPUT_STREAM_INFO. Tento příznak oznámí Media Session, že MFT přiděluje vlastní výstupní vzorky.

Chcete-li vytvořit povrchy, zavolejte IDirectXVideoAccelerationService::CreateSurface. (IDirectXVideoDecoderService rozhraní dědí tuto metodu z IDirectXVideoAccelerationService.) Můžete to udělat v SetInputTypepo vyhledání cílového formátu vykreslení.

Pro každou plochu zavolejte MFCreateVideoSampleFromSurface pro vytvoření vzorku médií pro uložení povrchu. Metoda vrátí ukazatel na rozhraní MMFSample.

Dekódování

Chcete-li vytvořit dekodér zařízení, zavolejte IDirectXVideoDecoderService::CreateVideoDecoder. Metoda vrátí ukazatel na rozhraní dekódovacího zařízení IDirectXVideoDecoder.

Dekódování by mělo nastat uvnitř metoda IMFTransform::ProcessOutput. Na každém snímku zavolejte IDirect3DDeviceManager9::TestDevice pro otestování popisovače zařízení. Pokud se zařízení změnilo, metoda vrátí DXVA2_E_NEW_VIDEO_DEVICE. Pokud k tomu dojde, postupujte takto:

  1. Zavřete popisovač zařízení voláním IDirect3DDeviceManager9::CloseDeviceHandle.
  2. Uvolněte ukazatele IDirectXVideoDecoderService a IDirectXVideoDecoder.
  3. Otevřete nový popisovač zařízení.
  4. Vyjednat novou konfiguraci dekodéru, jak je popsáno v části "Vyhledání konfigurace dekodéru" dříve na této stránce.
  5. Vytvořte nové dekodérové zařízení.

Za předpokladu, že je popisovač zařízení platný, proces dekódování funguje takto:

  1. Získejte dostupnou plochu, která se aktuálně nepoužívá. (Zpočátku jsou k dispozici všechny povrchy.)
  2. Vyžádejte si ukázku médií pro rozhraní IMFTrackedSample.
  3. Volejte IMFTrackedSample::SetAllocator a poskytněte ukazatel na rozhraní IMFAsyncCallback implementované dekodérem. Když renderer videa uvolní ukázku, vyvolá se zpětné volání dekodéru.
  4. Volání IDirectXVideoDecoder::BeginFrame.
  5. Jednou nebo vícekrát udělejte toto:
    1. Volání IDirectXVideoDecoder::GetBuffer pro získání vyrovnávací paměti dekodéru DXVA.
    2. Vyplňte vyrovnávací paměť.
    3. Volání IDirectXVideoDecoder::ReleaseBuffer.
    4. Zavolejte IDirectXVideoDecoder::Execute pro provedení dekódovacích operací na snímku.

DXVA 2.0 používá stejné datové struktury jako DXVA 1.0 pro dekódovací operace. Pro původní sadu profilů DXVA (pro H.261, H.263 a MPEG-2) jsou tyto datové struktury popsány ve specifikaci DXVA 1.0.

V rámci každé dvojice BeginFrame/Execute volání můžete funkci GetBuffer volat vícekrát, ale pro každý typ vyrovnávací paměti DXVA pouze jednou. Pokud ji zavoláte dvakrát se stejným typem vyrovnávací paměti, přepíšete data.

Pomocí zpětného volání z metody SetAllocator (krok 3) sledujte, které ukázky jsou aktuálně dostupné a které se používají.

Akcelerace videa DirectX 2.0

Media Foundation se transformuje na