開啟和關閉資料流程

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 結構的內容,以及 rcSourcercTarget 成員所指定的裁剪和縮放資訊。

如果裝置硬體不支援 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 類別介面。