Habilitación de la aceleración de vídeo de DirectX
[La característica asociada a esta página, WINDOWS Media Format 11 SDK, es una característica heredada. Se ha reemplazado por lector de origen y escritor receptor. Lector de origen y escritor receptor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector fuente y escritor receptor en lugar del SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
En esta sección se describe cómo habilitar la aceleración de vídeo de Microsoft® DirectX® al reproducir contenido transmitido en un reproductor personalizado.
Información previa
DirectX Video Acceleration (DirectX VA) es una especificación de API para la aceleración de hardware de operaciones de descodificación 2D. Permite que los descodificadores de software descarguen determinadas operaciones que consumen mucha CPU en la tarjeta gráfica para su procesamiento. Para los usuarios finales, esto hace posible un vídeo de alta velocidad de bits, como la reproducción de DVD de pantalla completa en equipos antiguos equipados con tarjetas gráficas compatibles con DirectX VA.
A partir del SDK de la serie 9 de Windows Media, el filtro contenedor DMO admite DirectX VA. Esto significa que, en el caso de la reproducción local, las aplicaciones pueden usar el filtro wm ASF Reader para reproducir contenido basado en Windows Media y la aceleración de hardware directX VA se invocará automáticamente si la tarjeta gráfica la admite. Sin embargo, el filtro lector ASF de WM no admite la reproducción de contenido transmitido. Por lo tanto, si quieres admitir DirectX VA al reproducir contenido transmitido en un reproductor personalizado, debes usar un mecanismo alternativo, que es el que usa Reproductor multimedia de Windows a partir de la serie Windows Media 9.
Dado que Reproductor multimedia de Windows se diseñó antes de desarrollar los filtros QASF, Reproductor multimedia de Windows tiene su propio filtro de origen, basado en el SDK de Windows Media Format, para reproducir contenido basado en Windows Media. El filtro de origen de Windows Media WMP ofrece datos descomprimidos directamente a los representadores de audio y vídeo. Por el contrario, el lector DE ASF de WM entrega contenido comprimido de bajada a los objetos multimedia de DirectX (DMO) del descodificador de Windows Media, que se hospedan dentro del contenedor DMO. En los diagramas siguientes se muestran las diferencias entre el lector ASF de WM y el filtro de origen de Windows Media de WMP.
Para habilitar DirectX VA para el contenido transmitido, debe crear un filtro de origen personalizado como el del diagrama superior. Básicamente, este filtro usará el SDK de Windows Media Format para crear instancias de un objeto WM Reader, descomprimir los ejemplos y enviarlos de bajada en sus patillas de salida. En esta explicación se supone que ya ha creado el filtro de origen y ya está listo para implementar la compatibilidad con DirectX VA.
Para habilitar DirectX VA, la tarea básica del filtro de origen es proporcionar video Renderer y WMV Decoder DMO con las interfaces que necesitarán para negociar la conexión de DirectX VA. El filtro de origen no participa en esas negociaciones. Después de que se inicie el streaming, la única tarea relacionada con DirectX VA que el filtro de origen puede realizar es modificar las marcas de tiempo en las muestras de vídeo antes de que el descodificador WMV los entregue al representador de vídeo. La razón principal para hacerlo es proporcionar control de escala de tiempo personalizado más allá de lo que habilitan las interfaces de DirectShow® estándar.
Se definen tres interfaces para habilitar las comunicaciones necesarias entre el SDK de Windows Media Format, el filtro de origen del reproductor, el DMO del descodificador de vídeo de Windows Media y el mezclador de superposición o el representador de mezcla de vídeo. Estas interfaces se describen en la tabla siguiente.
Interfaz | Descripción |
---|---|
IWMCodecAMVideoAccelerator | Expuesto por el DMO del descodificador de Windows Media y llamado por el filtro de origen de un reproductor multimedia para configurar las distintas conexiones necesarias para habilitar DirectX VA para la descodificación del contenido de Windows Media Video. |
IWMPlayerTimestampHook | Se implementa en el filtro de origen del reproductor. Permite que el filtro modifique las marcas de tiempo en los ejemplos de vídeo antes de entregarlas de bajada. |
IWMReaderAccelerator | Se implementa en el objeto WM Reader. Un filtro de origen del reproductor lo llama para obtener interfaces del DMO del descodificador. |
Orden de las operaciones en reproducción habilitada para DIRECTX VA
En esta sección se describe el orden general de las operaciones en tiempo de ejecución para un reproductor habilitado para VA de DirectX y su filtro de origen. Los componentes a los que se hace referencia en esta sección son:
- Un reproductor multimedia de terceros, denominado reproductor.
- Un filtro de origen personalizado, creado por el reproductor, que usa el SDK de Windows Media Format para descomprimir contenido basado en Windows Media.
- El pin de salida de vídeo del filtro de origen del reproductor, denominado pin de salida.
- El gráfico de filtros de reproducción de vídeo DirectShow, denominado gráfico.
- El representador de mezcla de vídeos, denominado VMR.
- El objeto Lector asincrónico del SDK de Windows Media Format, denominado lector.
- El objeto multimedia Descodificador de vídeo de Windows Media DirectX, denominado DMO del descodificador.
El orden de las operaciones es el siguiente:
- El reproductor crea una instancia de su filtro de origen y un objeto lector. El lector crea un DMO de descodificador de vídeo y establece el tipo de entrada (comprimido) en él. Esto debe ocurrir antes de que el reproductor intente configurar su gráfico de reproducción de vídeo porque el SDK y el DMO del descodificador deben estar implicados en el proceso de negociación con el grafo, y DMO debe conocer el formato de entrada durante el paso 9.
- El reproductor llama a IGraphBuilder::Render, proporcionándole el pin de salida del filtro de origen de vídeo. En este momento, el administrador de gráficos de filtros directShow intenta conectar el VMR al filtro de origen de vídeo del reproductor.
- El administrador de gráficos de filtros llama a IPin::Connect en el pin de salida del filtro de origen de vídeo del reproductor.
Los pasos del 4 al 10 se producen dentro de IPin::Connect.
El filtro de origen obtiene la interfaz IWMCodecAMVideoAccelerator del método IWMReaderAccelerator::GetCodecInterface del lector. Si el códec no admite DirectX VA, es posible que se produzca un error en la llamada a GetCodecInterface . En este caso, la negociación continúa como de costumbre, sin compatibilidad con DirectX VA.
El filtro de origen pasa el puntero IAMVideoAccelerator del pin pasado a Connect to the decoder DMO through IWMCodecAMVideoAccelerator::SetAcceleratorInterface.
A continuación, el filtro de origen delega el resto de la operación IPin::Connect al método CBaseOutputPin::Connect . La enumeración de formato con el SDK continúa como lo hace hoy. Si el códec admite DirectX VA para el contenido que se está conectando, el códec DMO presenta primero esos subtipos directX VA, antes de que se admitan los tipos YUV y RGB. Si la compatibilidad con DirectX VA está disponible, se intentan los pasos del 7 al 11 en el contexto de un subtipo de VA de DirectX. En el fragmento de código siguiente se muestra cómo identificar un subtipo multimedia de DirectX VA.
bool IsDXVASubtype( AM_MEDIA_TYPE * pmt ) { // All DXVA types have the same last 3 DWORDs. // guidDXVA is the base GUID for all DXVA subtypes. GUID guidDXVA = { 0x00000000, 0xa0c7, 0x11d3, { 0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5 } }; unsigned long const * plguid; unsigned long const * plguidDXVA; plguid = (unsigned long const *)&pmt->subtype; plguidDXVA = (unsigned long *)&guidDXVA; if( ( plguid[1] == plguidDXVA[1] ) && ( plguid[2] == plguidDXVA[2] ) && ( plguid[3] == plguidDXVA[3] ) ) { return true; } return false; }
La implementación de CBaseOutputPin::Connect llama a IPin::CompleteConnect durante el paso 3. Si se está considerando un subtipo va de DirectX, se intenta la negociación de DirectX VA. El pin de salida llama a IWMCodecAMVideoAccelerator::NegotiateConnection, pasando el tipo de medio de salida actual.
El DMO del descodificador realiza la negociación necesaria con vmR a través de la interfaz IAMVideoAccelerator y devuelve el GUID del subtipo de vídeo en el que los dos han acordado. El pin de salida delega todas las llamadas IAMVideoAcceleratorNotify recibidas durante este proceso a la interfaz IAMVideoAcceleratorNotify del descodificador DMO, que también se puede obtener a través del método IWMReaderAccelerator::GetCodecInterface .
Si NegotiateConnection se realiza correctamente, el pin de salida llama a IWMCodecAMVideoAccelerator::SetPlayerNotify con una interfaz IWMPlayerTimestampHook . Este enlace permite que el filtro de origen actualice las marcas de tiempo en los ejemplos antes de que se entreguen al representador.
El filtro de origen llama a IWMReaderAccelerator::Notify con el tipo de medio negociado. Esto permite al lector actualizar sus variables internas y confirmar en DirectX VA. Este es el último lugar en el que se puede producir un error en el códec o lector. Si se produce un error en alguno de los pasos anteriores, el filtro de origen debe volver al paso 3 e intentar el siguiente tipo enumerado por el lector.
Se inicia la reproducción. El lector omite los búferes de salida del DMO del descodificador si el tipo de salida de conexión es DirectX VA.
Cuando se produce IPin::D isconnect , el filtro de origen llama a IWMCodecAMVideoAccelerator::SetAcceleratorInterface con un valor NULL. Esto interrumpe la conexión de DirectX VA entre el códec y el representador.
Temas relacionados