Trabajar con destinos de representación de Direct3D

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, 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.

Se definen varios subtipos multimedia para destinos de representación de Direct3D para su uso con VMR-7 y VMR-9. Cuando un filtro ascendente propone una conexión con uno de estos subtipos, indica al VMR que la representación se va a realizar en un destino de representación de Direct3D. Para VMR-7, será un destino de representación de DirectX 7 Direct3D y, para VMR-9, será un destino de representación de DirectX 9 Direct3D. Si vmR está en modo de mezcla, la superficie también será una superficie de textura de Direct3D. Si vmR no está en modo de mezcla, la superficie será una superficie direct3D normal. Los formatos de píxeles ARGB solo se admiten cuando vmR está en modo de mezcla. Los subtipos de destino de representación son:

VMR-7 VMR-9
MEDIASUBTYPE_RGB32_D3D_DX7_RT MEDIASUBTYPE_RGB32_D3D_DX9_RT
MEDIASUBTYPE_RGB16_D3D_DX7_RT MEDIASUBTYPE_RGB16_D3D_DX9_RT
MEDIASUBTYPE_ARGB32_D3D_DX7_RT MEDIASUBTYPE_ARGB32_D3D_DX9_RT
MEDIASUBTYPE_ARGB4444_D3D_DX7_RT MEDIASUBTYPE_ARGB4444_D3D_DX9_RT
MEDIASUBTYPE_ARGB1555_D3D_DX7_RT MEDIASUBTYPE_ARGB1555_D3D_DX9_RT

 

Estos tipos se definen en el archivo de encabezado uuids.h. Los tipos de medios MEDIASUBTYPE_RGB32 son un formato RGBx888 y los tipos de medios MEDIASUBTYPE_RGB16 son un formato RGB565. Para obtener más información sobre estos formatos de píxeles, consulte la documentación de DirectX Graphics.

Solicitar una superficie desbloqueada

El bloqueo y el desbloqueo de superficies de DirectDraw son operaciones de cálculo costosas. Al usar los subtipos multimedia de destino de representación de Direct3D, el filtro ascendente necesita que se desbloqueen las superficies para que pueda funcionar en ellos con el hardware gráfico. Para evitar una operación innecesaria de desbloqueo de bloqueo, VMR admite una nueva marca en el método IMemAllocator::GetBuffer , AM_GBF_NODDSURFACELOCK, que indica al VMR que no bloquee la superficie de DirectDraw antes de pasar una muestra al filtro ascendente. Cuando se usa esta marca, se producirá un error en las llamadas a IMediaSample::GetPointer porque no hay ningún puntero bloqueado. Para obtener acceso a la superficie de DirectDraw, el filtro debe llamar a QueryInterface en el objeto IMediaSample devuelto y solicitar la interfaz IVMRSurface . Obviamente, el filtro ascendente debe asegurarse de que la superficie no está bloqueada cuando libera la muestra de vuelta a la lista gratuita.