Suporte à captura de vídeo e outros dispositivos filho
Um driver de miniporta de vídeo e o driver de um dispositivo de captura de vídeo ou outro dispositivo filho podem definir mutuamente uma interface privada que o driver filho pode usar para se comunicar com seu dispositivo por meio do driver de miniporto pai. Um driver de captura de vídeo filho deve estar firmemente acoplado ao driver de miniporto de exibição pai. Na verdade, a captura de vídeo pode ser implementada como parte do driver de miniporta de exibição. Um driver de captura de vídeo pode usar a interface privada com o driver de miniporta de exibição para acessar o barramento I2C e para outras finalidades.
Para inicializar a interface privada, o driver de captura de vídeo envia uma solicitação de IRP_MN_QUERY_INTERFACE para o driver de porta de exibição (parte de Dxgkrnl.sys) para o driver de miniporta de exibição. Depois que o driver de porta de exibição recebe essa solicitação, ele chama a função DxgkDdiQueryInterface do driver de miniport e passa um ponteiro para uma estrutura QUERY_INTERFACE que contém informações para inicializar a interface privada.
Nota Se a captura de vídeo for implementada como parte do driver de miniporta de exibição, a captura de vídeo poderá chamar DxgkDdiQueryInterface diretamente.
Cada driver de um dispositivo filho (incluindo dispositivos de captura de vídeo) deve retornar o GUID do adaptador que indica o hardware ao qual o dispositivo está associado. O GUID do adaptador é fornecido ao driver de miniporto de exibição no membro AdapterGuid da estrutura DXGK_START_INFO que é apontada pelo parâmetro DxgkStartInfo da função DxgkDdiStartDevice que é enviada quando o adaptador é inicializado. Os componentes de captura do modo de usuário podem mapear posteriormente esse GUID do adaptador para um adaptador de exibição.
No Modelo de Driver de Vídeo do Microsoft Windows 2000, os aplicativos de captura de vídeo enviam buffers de captura de memória do sistema para o modo kernel. Em seguida, o modo kernel descreve os buffers de memória do sistema usando estruturas de MDL (lista de descritores de memória) e envia os MDLs para o driver de captura de vídeo. Além de dar suporte à captura na memória do sistema, o modelo de driver de exibição do Windows Vista dá suporte à captura na memória de vídeo. O runtime do Direct3D chama funções do tipo Aceleração de Vídeo 2.0 do DirectX para direcionar a GPU para executar o pós-processamento em dados de captura. Em vez de enviar MDLs para descrever os buffers de memória de vídeo, o driver de exibição do modo de usuário enviará valores de tipo D3DKMT_HANDLE que são identificadores para capturar alocações de buffer. Portanto, a combinação de driver de captura de vídeo e driver de miniporta de vídeo pode usar funções de retorno de chamada existentes, como DxgkCbGetHandleData , para referenciar dados privados que descrevem o buffer de captura. A combinação de driver também pode usar a função de retorno de chamada DxgkCbGetCaptureAddress para retornar o endereço físico do buffer de captura.
Os aplicativos de captura de vídeo chamam o runtime do Direct3D para criar buffers de captura; o runtime subsequentemente chama o driver de exibição no modo de usuário. O runtime chama a função CreateResource do driver de exibição no modo de usuário com o sinalizador de campo de bit CaptureBuffer definido no membro Flags da estrutura D3DDDIARG_CREATERESOURCE para criar buffers de captura. O driver de miniporta de exibição também deve especificar o sinalizador Capturar campo de bits para o gerenciador de memória de vídeo quando o gerenciador de memória chamar a função DxgkDdiCreateAllocation do driver de miniporta de exibição para criar alocações para os buffers de captura. Quando os buffers de captura são criados, eles são imediatamente fixados na memória e não são desafixados até que sejam liberados. Como a pilha de captura deve enviar identificadores de alocação do modo kernel para buffers de captura para o driver de captura, o runtime chama a função GetCaptureAllocationHandle do driver de exibição no modo de usuário para mapear cada identificador de recurso para o identificador de alocação do modo kernel para esse recurso.
O driver de captura pode relatar se ele dá suporte à captura na memória do sistema diretamente. Se o driver de captura der suporte à captura diretamente na memória do sistema, os MDLs serão enviados para o driver de captura para essa finalidade. Se o driver de captura não der suporte à captura direta na memória do sistema, o runtime criará buffers de captura de memória de vídeo e o driver de captura deverá preenchê-los. A função CaptureToSysMem do driver de exibição no modo de usuário é chamada para copiar o conteúdo de um buffer de captura para uma superfície de memória do sistema. O runtime pode usar CaptureToSysMem em vez da função Blt para aproveitar o hardware especial para transferências de bloco de bits (bitblt) que não exigem que o driver de exibição do modo de usuário chame a função pfnRenderCb .
Como o AVStream controla a captura de vídeo, o subsistema de kernel de elementos gráficos DirectX não está ciente de quando ocorre a captura de vídeo. No entanto, o subsistema de kernel gráfico está ciente das alocações usadas como buffers de captura. Quando um buffer de captura está prestes a ser destruído, o subsistema de kernel gráfico chama a função DxgkDdiStopCapture do driver de miniporta de exibição para indicar que a operação de captura deve parar imediatamente de usar uma alocação como buffer de captura. Se a operação de captura já tiver sido interrompida por meio da pilha de captura, o driver poderá ignorar a chamada com segurança.