Compartilhar via


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.