Läs på engelska

Dela via


Direct3D-Aware MFI

I det här avsnittet beskrivs hur du implementerar en Direct3D-medveten Media Foundation-transformering (MFT) för video.

En MFT-video anses Direct3D-medveten om den kan bearbeta exempel som innehåller Direct3D-ytor. Den typiska orsaken till att stödja Direct3D i en video MFT är att aktivera maskinvaruaccelererad avkodning med hjälp av DirectX Video Acceleration (DXVA).

I det här avsnittet beskrivs de steg som krävs för att göra MFT Direct3D-medveten. Det här avsnittet beskriver inte mekaniken för DXVA-avkodning. Information om DXVA finns i DirectX Video Acceleration 2.0.

Viktigt

Från och med Windows 8 kan IMFDXGIDeviceManager användas i stället för IDirect3DDeviceManager9. För Windows Store-appar måste du använda IMFDXGIDeviceManager och Microsoft Direct3D 11. Mer information finns i Direct3D 11 Video-API:er.

 

  1. Implementera metoden IMFTransform::GetAttributes. Den här metoden returnerar en pekare till ett attributarkiv.
  2. MFT måste ange värdet för attributet MF_SA_D3D_AWARE till TRUE- i ett eget attributarkiv. Från och med Windows 8 använder du MF_SA_D3D11_AWAREom du använder Direct3D 11 .
  3. Om attributet MF_SA_D3D_AWARE (eller MF_SA_D3D11_AWARE om du använder Direct3D 11) TRUE-under formatförhandlingen kan klienten skicka MFT_MESSAGE_SET_D3D_MANAGER meddelandet till MFT. Händelseparametern ulParam är en pekare till gränssnittet IDirect3DDeviceManager9. Från och med Windows 8 kan du använda IMFDXGIDeviceManager i stället för IDirect3DDeviceManager9. Klienten krävs inte för att skicka det här meddelandet.
  4. MFT anropar IDirect3DDeviceManager9::GetVideoService för att fråga efter den DXVA-tjänst som behövs. Från och med Windows 8, om IMFDXGIDeviceManager användes MFT-anropen IMFDXGIDeviceManager::GetVideoService. Vanligtvis frågar en avkodare efter IDirectXVideoDecoderServiceoch en videoprocessor frågar efter IDirectXVideoProcessorService.
  5. Förutsatt att föregående steg lyckas måste IMFTransform::GetInputAvailableType och IMFTransform::GetOutputAvailableType metoder returnera DXVA-kompatibla format.
  6. Klienten konfigurerar medietyperna på MFT. Om en medietyp inte är kompatibel med DXVA måste MFT returnera felkoden MF_E_UNSUPPORTED_D3D_TYPE.
  7. I det här läget finns det två alternativ, beroende på om klienten hittar ett lämpligt DXVA-format.
    • Om klienten har konfigurerat ett DXVA-format kan det börja bearbetas. Nu kan MFT använda DXVA för bearbetning eller återgå till programvarubearbetning.
    • Om klienten inte hittar ett acceptabelt DXVA-format kan klienten skicka ett annat MFT_MESSAGE_SET_D3D_MANAGER meddelande. Den här tidsinställningen ulParam till NULL-. MFT måste släppa pekaren IDirect3DDeviceManager9 (IMFDXGIDeviceManager pekare, om IMFDXGIDeviceManager- användes) och andra DXVA-gränssnitt och återgå till programvarubearbetning. I det här läget får MFT inte använda DXVA-bearbetning.

En Direct3D-medveten MFT måste förberedas för att hantera prover som innehåller en Direct3D-yta. Exemplet innehåller exakt en mediebuffert. Om du vill hämta Direct3D-ytan från bufferten anropar du funktionen MFGetService och anger MR_BUFFER_SERVICE-tjänsten. Mer information finns i DirectX Surface Buffer.

En MFT som använder DXVA måste allokera sina egna utdataexempel enligt följande:

  1. I metoden IMFTransform::GetOutputStreamInfo anger du flaggan MFT_OUTPUT_STREAM_PROVIDES_SAMPLES.
  2. Skapa en pool med DXVA-ytor enligt beskrivningen i DXVA-specifikationen.
  3. Skapa medieexempel genom att anropa MFCreateVideoSampleFromSurface.

MFT bör alltid ha stöd för programvarubearbetning som reserv eftersom DXVA-bearbetning kanske inte är tillgänglig av flera skäl:

  • GPU:n kanske inte stöder DXVA.
  • Klienten kanske inte använder Direct3D.
  • DXVA-profiler definieras inte för varje videoformat.

En Direct3D-medveten MFT måste ha en enda utdataström. Den kan inte ha flera utdata.

Skriva en anpassad MFT-