Direct3D-Aware MFT
En este tema se describe cómo implementar un transformación de Media Foundation (MFT) compatible con Direct3D para vídeo.
Un vídeo MFT se considera compatibles con Direct3D si puede procesar muestras que contienen superficies direct3D. La razón habitual para admitir Direct3D en un vídeo MFT es habilitar la descodificación acelerada por hardware, mediante directX Video Acceleration (DXVA).
En este tema se describen los pasos necesarios para tener en cuenta MFT Direct3D. En este tema no se tratan los mecanismos de descodificación de DXVA. Para obtener información sobre DXVA, consulte DirectX Video Acceleration 2.0.
Importante
A partir de Windows 8, se puede usar IMFDXGIDeviceManager en lugar de la IDirect3DDeviceManager9. Para las aplicaciones de la Tienda Windows, debes usar IMFDXGIDeviceManager y Microsoft Direct3D 11. Para obtener más información, consulta las API de vídeo de Direct3D 11.
- Implemente el método IMFTransform::GetAttributes. Este método devuelve un puntero a un almacén de atributos.
- El MFT debe establecer el valor del atributo MF_SA_D3D_AWARE en TRUE en su propio almacén de atributos. A partir de Windows 8, si usa Direct3D 11, use MF_SA_D3D11_AWARE.
- Durante la negociación de formato, si el atributo MF_SA_D3D_AWARE (o MF_SA_D3D11_AWARE si usa Direct3D 11) es TRUE, el cliente puede enviar el mensaje MFT_MESSAGE_SET_D3D_MANAGER al MFT. El parámetro de evento ulParam es un puntero a la interfazIDirect3DDeviceManager9. A partir de Windows 8, puedes usar IMFDXGIDeviceManager en lugar de IDirect3DDeviceManager9. El cliente no es necesario para enviar este mensaje.
- MFT llama a IDirect3DDeviceManager9::GetVideoService para consultar el servicio DXVA que necesita. A partir de Windows 8, si se usó IMFDXGIDeviceManager las llamadas de MFT IMFDXGIDeviceManager::GetVideoService. Normalmente, un descodificador consultaría IDirectXVideoDecoderServicey un procesador de vídeo consultaría IDirectXVideoProcessorService.
- Suponiendo que el paso anterior es correcto, los métodos IMFTransform::GetInputAvailableType y IMFTransform::GetOutputAvailableType deben devolver formatos compatibles con DXVA.
- El cliente configura los tipos de medios en el MFT. Si un tipo de medio no es compatible con DXVA, MFT debe devolver el código de error MF_E_UNSUPPORTED_D3D_TYPE.
- En este momento, hay dos opciones, dependiendo de si el cliente encuentra un formato DXVA adecuado.
- Si el cliente configura correctamente un formato DXVA, puede empezar a procesarse. En este momento, el MFT puede usar DXVA para su procesamiento o revertir al procesamiento de software.
- Como alternativa, si el cliente no encuentra un formato DXVA aceptable, el cliente puede enviar otro mensaje de MFT_MESSAGE_SET_D3D_MANAGER, esta configuración de hora ulParam a NULL. El MFT debe liberar el puntero IDirect3DDeviceManager9 (el puntero IMFDXGIDeviceManager, si se usó IMFDXGIDeviceManager) y cualquier otra interfaz DXVA y revertir al procesamiento de software. En este momento, el MFT no debe usar el procesamiento DXVA.
Un MFT compatible con Direct3D debe estar preparado para controlar muestras que contienen una superficie de Direct3D. El ejemplo contendrá exactamente un búfer multimedia. Para obtener la superficie de Direct3D del búfer, llame a la función MFGetService y especifique el servicio MR_BUFFER_SERVICE. Para obtener más información, consulta directX Surface Buffer.
Un MFT que use DXVA debe asignar sus propios ejemplos de salida, como se indica a continuación:
- En el métodoIMFTransform::GetOutputStreamInfo, establezca la marca MFT_OUTPUT_STREAM_PROVIDES_SAMPLES.
- Cree un grupo de superficies DXVA, como se describe en la especificación DXVA.
- Cree ejemplos multimedia llamando a MFCreateVideoSampleFromSurface.
El MFT siempre debe admitir el procesamiento de software como reserva, ya que es posible que el procesamiento DXVA no esté disponible, por varias razones:
- Es posible que la GPU no admita DXVA.
- Es posible que el cliente no use Direct3D.
- Los perfiles DXVA no se definen para cada formato de vídeo.
Un MFT compatible con Direct3D debe tener un único flujo de salida. No puede tener varias salidas.
Temas relacionados
-
escribir un MFT personalizado