打开和关闭流
Stream 类接口向 Stream 类微型驱动程序发送 SRB_OPEN_STREAM 请求,以使用所选视频格式打开流。 SRB_OPEN_STREAM中传递的信息包括要打开的流的索引和指向 KS_VIDEOINFOHEADER 结构的指针的指针。 流索引对应于微型驱动程序为响应先前SRB_GET_STREAM_INFO请求而返回的 KS_DATARANGE_VIDEO 结构数组 中的流的索引 。 有关处理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 成员指定的裁剪和缩放信息。
如果设备硬件不支持 KS_VIDEOINFOHEADER 的 AvgTimePerFrame 成员中请求的捕获帧速率,则它应始终选择下一 个较低的 可用帧速率。 例如,如果相机可以支持每秒 7 帧的捕获帧速率 (fps) 和 15 fps,并且客户端应用程序尝试以 10 fps 的捕获帧速率打开流,则相机应创建 7-fps 的物理流。
对于捕获所有 70 个可用物理帧的 10 秒捕获,微型驱动程序应报告捕获 100 帧,其中 30 帧已被 KSPROPERTY_DROPPEDFRAMES_CURRENT 属性删除。
当输出缓冲区是 DirectDraw 图面时,将应用特殊规则。 在这种情况下,KS_BITMAPINFOHEADER结构的 biWidth 成员实际上表示目标 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 请求发送到微型驱动程序以关闭流。 然后,微型驱动程序应将所有未完成的流 SRB 返回到 Stream 类接口。