開啟和關閉資料流程
Stream 類別介面會將 SRB_OPEN_STREAM 要求傳送至 Stream 類別 minidriver,以開啟具有所選視訊格式的資料流程。 傳入SRB_OPEN_STREAM的資訊包括要開啟的資料流程索引,以及 KS_VIDEOINFOHEADER 結構的指標指標。 資料流程索引會對應至 minidriver 傳回 之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;
Minidrivers 應該確認它們可以支援要求的資料流程格式。 特別是,應該驗證 KS_BITMAPINFOHEADER 結構的內容,以及 rcSource 和 rcTarget 成員所指定的裁剪和縮放資訊。
如果裝置硬體不支援 KS_VIDEOINFOHEADER AvgTimePerFrame 成員所要求的擷取畫面播放速率,它應該一律選取下一個 較低的 畫面播放速率。 例如,如果相機可以支援每秒 7 個畫面的擷取畫面播放速率, (fps) 和 15 fps,而用戶端應用程式會嘗試以 10 fps 的擷取畫面播放速率開啟資料流程,相機應該建立 7 fps 實體串流。
針對擷取所有 70 個可用實體框架的十秒擷取,迷你驅動程式應該報告擷取的 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 要求傳送至 minidriver,以關閉資料流程。 minidriver 接著應該會將所有未處理的資料流程 SRB 傳回至 Stream 類別介面。