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.
- Implementera metoden IMFTransform::GetAttributes. Den här metoden returnerar en pekare till ett attributarkiv.
- 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 .
- 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.
- 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.
- Förutsatt att föregående steg lyckas måste IMFTransform::GetInputAvailableType och IMFTransform::GetOutputAvailableType metoder returnera DXVA-kompatibla format.
- Klienten konfigurerar medietyperna på MFT. Om en medietyp inte är kompatibel med DXVA måste MFT returnera felkoden MF_E_UNSUPPORTED_D3D_TYPE.
- 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:
- I metoden IMFTransform::GetOutputStreamInfo anger du flaggan MFT_OUTPUT_STREAM_PROVIDES_SAMPLES.
- Skapa en pool med DXVA-ytor enligt beskrivningen i DXVA-specifikationen.
- 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.