Compartir a través de


Direct3D-Aware MFT

En este tema se describe cómo implementar una transformación de Media Foundation compatible con Direct3D (MFT) para vídeo.

Un vídeo MFT se considera compatible con Direct3D si puede procesar muestras que contienen superficies de Direct3D. La razón típica para admitir Direct3D en un vídeo MFT es habilitar la descodificación acelerada por hardware, mediante la aceleración de vídeo DirectX (DXVA).

En este tema se describen los pasos necesarios para que MFT Direct3D sea compatible. En este tema no se trata la mecánica de la descodificación de DXVA. Para obtener información sobre DXVA, vea DirectX Video Acceleration 2.0.

Importante

A partir de Windows 8, IMFDXGIDeviceManager se puede usar en lugar de 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.

 

  1. Implemente el método IMFTransform::GetAttributes . Este método devuelve un puntero a un almacén de atributos.
  2. 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.
  3. 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 interfaz IDirect3DDeviceManager9 . A partir de Windows 8, puede usar IMFDXGIDeviceManager en lugar de IDirect3DDeviceManager9. No es necesario que el cliente envíe este mensaje.
  4. MFT llama a IDirect3DDeviceManager9::GetVideoService para consultar el servicio DXVA que necesita. A partir de Windows 8, si IMFDXGIDeviceManager fue utilizado el MFT llama a IMFDXGIDeviceManager::GetVideoService. Normalmente, un descodificador consultaría IDirectXVideoDecoderService y un procesador de vídeo consultaría IDirectXVideoProcessorService.
  5. Suponiendo que el paso anterior es correcto, los métodos IMFTransform::GetInputAvailableType y IMFTransform::GetOutputAvailableType deben devolver formatos compatibles con DXVA.
  6. 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.
  7. 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 comenzar el procesamiento. En este momento, el MFT puede usar DXVA para el 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 vez estableciendo ulParam en 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 desde el 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 usa DXVA debe asignar sus propias muestras de salida, como se indica a continuación:

  1. En el método IMFTransform::GetOutputStreamInfo , establezca la marca MFT_OUTPUT_STREAM_PROVIDES_SAMPLES .
  2. Cree un grupo de superficies DXVA, como se describe en la especificación DXVA.
  3. Cree ejemplos multimedia mediante una llamada a MFCreateVideoSampleFromSurface.

El MFT siempre debe admitir el procesamiento de software como reserva, ya que es posible que el procesamiento de 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.

Escritura de un MFT personalizado