Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Интерфейс класса Stream отправляет запрос SRB_OPEN_STREAM минидрайверу класса Stream, чтобы открыть поток для выбранного видеоформата. Сведения, передаваемые в SRB_OPEN_STREAM, включают индекс открываемого потока и указатель на указатель на структуру KS_VIDEOINFOHEADER. Индекс потока соответствует индексу потока в массиве структур KS_DATARANGE_VIDEO, возвращаемых минидрайвером в ответ на предыдущий запрос SRB_GET_STREAM_INFO. Дополнительные сведения об обработке SRB_GET_STREAM_INFO см. в разделе Категории потоков.
Следующий пример кода получает индекс потока, формат видео потоковой передачи ядра и заголовок видеоинформации потоковой передачи ядра.
int StreamNumber = pSrb->StreamObject->StreamNumber;
PKS_DATAFORMAT_VIDEOINFOHEADER pKSDataFormat =
(PKS_DATAFORMAT_VIDEOINFOHEADER) pSrb->CommandData.OpenFormat;
PKS_VIDEOINFOHEADER pVideoInfoHdrRequested =
&pKSDataFormat->VideoInfoHeader;
Минидрайверы должны убедиться, что они могут поддерживать запрошенный формат потока. В частности, необходимо проверить содержимое структуры KS_BITMAPINFOHEADER вместе с информацией об обрезке и масштабировании, указанной для членов rcSource и rcTarget.
Если оборудование устройства не может поддерживать частоту кадров захвата, запрошенную в элементе AvgTimePerFrame KS_VIDEOINFOHEADER, оно всегда должно выбрать следующую более низкую доступную частоту кадров. Например, если камера может поддерживать частоту кадров захвата 7 кадров в секунду (fps) и 15 fps, а клиентское приложение пытается открыть поток с частотой кадров захвата 10 кадров в секунду, камера должна создать физический поток 7-fps.
Для десятисекундного захвата, в котором записываются все 70 доступных физических кадров, минидрайвер должен сообщить о захвате 100 кадров, из которых 30 кадров были удалены свойством KSPROPERTY_DROPPEDFRAMES_CURRENT.
Специальные правила применяются, если выходной буфер является поверхностью DirectDraw. В этом случае элемент biWidth структуры KS_BITMAPINFOHEADER фактически представляет интервал целевой поверхности DirectDraw, который обычно превышает ширину видеоизображения. Шаг поверхности обычно является шириной поверхности, умноженной на ее байтовую глубину. Например, для поверхности, которая имеет ширину 640 пикселей с глубиной цвета 32 бита на пиксель, шаг будет составлять 2560 байт.
Чтобы определить запрошенную ширину изображения, используйте следующий пример кода:
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;
}
Интерфейс класса Stream отправляет минидрайверу запрос SRB_CLOSE_STREAM, чтобы закрыть поток. Затем минидрайвер должен возвращать все незавершённые потоковые SRBs в интерфейс класса Stream.