Abrindo e fechando um fluxo
A interface da classe Stream envia uma solicitação SRB_OPEN_STREAM para um minidriver da classe Stream para abrir um fluxo com o formato de vídeo selecionado. As informações passadas em SRB_OPEN_STREAM incluem o índice do fluxo a ser aberto e um ponteiro para um ponteiro para uma estrutura KS_VIDEOINFOHEADER . O índice de fluxo corresponde ao índice do fluxo na matriz de estruturas de KS_DATARANGE_VIDEO retornadas pelo minidriver em resposta a uma solicitação de SRB_GET_STREAM_INFO anterior. Para obter mais informações sobre como lidar com SRB_GET_STREAM_INFO, consulte Categorias de fluxo.
O código de exemplo a seguir obtém o índice de fluxo, o formato de dados de streaming de kernel e o cabeçalho de informações de vídeo de streaming de kernel.
int StreamNumber = pSrb->StreamObject->StreamNumber;
PKS_DATAFORMAT_VIDEOINFOHEADER pKSDataFormat =
(PKS_DATAFORMAT_VIDEOINFOHEADER) pSrb->CommandData.OpenFormat;
PKS_VIDEOINFOHEADER pVideoInfoHdrRequested =
&pKSDataFormat->VideoInfoHeader;
Os minidrivers devem verificar se podem dar suporte ao formato de fluxo solicitado. Em particular, o conteúdo da estrutura KS_BITMAPINFOHEADER deve ser verificado, juntamente com informações de corte e dimensionamento especificadas pelos membros rcSource e rcTarget .
Se o hardware do dispositivo não puder dar suporte à taxa de quadros de captura solicitada no membro AvgTimePerFrame do KS_VIDEOINFOHEADER, ele sempre deverá selecionar a próxima taxa de quadros mais baixa disponível. Por exemplo, se uma câmera puder dar suporte a uma taxa de quadros de captura de 7 quadros por segundo (fps) e 15 fps, e um aplicativo cliente tentar abrir o fluxo a uma taxa de quadros de captura de 10 fps, a câmera deverá criar um fluxo físico de 7 fps.
Para uma captura de dez segundos na qual todos os 70 quadros físicos disponíveis são capturados, o minidriver deve relatar 100 quadros capturados, dos quais 30 quadros foram removidos pela propriedade KSPROPERTY_DROPPEDFRAMES_CURRENT .
Regras especiais se aplicam quando o buffer de saída é uma superfície DirectDraw. Nesse caso, o membro biWidth da estrutura KS_BITMAPINFOHEADER realmente representa o passo da superfície DirectDraw de destino, que normalmente é maior que a largura da imagem de vídeo. O passo de uma superfície geralmente é a largura da superfície multiplicada por sua profundidade de bytes. Por exemplo, para uma superfície de 640 pixels de largura com uma profundidade de cor de 32 bits por pixel, o passo seria de 2560 bytes.
Para determinar a largura da imagem solicitada, use o seguinte exemplo de código:
if (IsRectEmpty(&pVideoInfoHdrRequested->rcTarget) {
Width = pVideoInfoHdrRequested->bmiHeader.biWidth;
Height = pVideoInfoHdrRequested->bmiHeader.biHeight;
}
else {
Width = pVideoInfoHdrRequested->rcTarget.right −
pVideoInfoHdrRequested->rcTarget.left;
Height = pVideoInfoHdrRequested->rcTarget.bottom −
pVideoInfoHdrRequested->rcTarget.top;
}
A interface da classe Stream envia uma solicitação SRB_CLOSE_STREAM para o minidriver para fechar um fluxo. Em seguida, o minidriver deve retornar todos os SRBs de fluxo pendentes para a interface da classe Stream.