Trabalhando com destinos de renderização do Direct3D
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
Vários subtipos de mídia para destinos de renderização direct3D são definidos para uso com a VMR-7 e a VMR-9. Quando um filtro upstream propõe uma conexão com um desses subtipos, ele indica à VMR que a renderização deve ser executada em um destino de renderização Direct3D. Para a VMR-7, esse será um destino de renderização directx 7 Direct3D e, para VMR-9, esse será um destino de renderização directx 9 Direct3D. Se a VMR estiver no modo de combinação, a superfície também será uma superfície de textura Direct3D. Se a VMR não estiver no modo de combinação, a superfície será uma superfície Direct3D regular. Os formatos de pixel ARGB só têm suporte quando a VMR está no modo de combinação. Os subtipos de destino de renderização são:
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 |
Esses tipos são definidos no arquivo de cabeçalho uuids.h. Os tipos de mídia MEDIASUBTYPE_RGB32 são um formato RGBx888 e MEDIASUBTYPE_RGB16 tipos de mídia são um formato RGB565. Para obter mais informações sobre esses formatos de pixel, consulte a documentação do DirectX Graphics.
Solicitando uma superfície desbloqueada
Bloquear e desbloquear superfícies do DirectDraw são operações computacionalmente caras. Ao usar os subtipos de mídia de destino de renderização direct3D, o filtro de upstream precisa que as superfícies sejam desbloqueadas para que elas possam operar neles com o hardware gráfico. Para evitar uma operação desnecessária de desbloqueio de bloqueio, a VMR dá suporte a um novo sinalizador no método IMemAllocator::GetBuffer, AM_GBF_NODDSURFACELOCK, que instrui a VMR a não bloquear a superfície do DirectDraw antes de passar um exemplo para o filtro upstream. Quando esse sinalizador for usado, as chamadas para IMediaSample::GetPointer falharão porque não há nenhum ponteiro bloqueado. Para obter acesso à superfície DirectDraw, o filtro deve chamar QueryInterface no objeto IMediaSample retornado e solicitar a interface IVMRSurface . Obviamente, o filtro de upstream deve garantir que a superfície não esteja bloqueada quando liberar o exemplo de volta para a lista gratuita.