擷取影片
一旦資料流程處於 KSSTATE_RUN 狀態,擷取程式就會開始。 根據開啟資料流程時所傳遞之 KS_VIDEOINFOHEADER結構的AvgTimePerFrame成員所指定的框架間隔,串流會將影像傳輸至透過SRB_READ_DATA傳遞的緩衝區。 擷取映射的其他資訊會傳回附加至KSSTREAM_HEADER結構結尾的KS_FRAME_INFO結構中。
下列範例程式碼會取得附加的 KS_FRAME_INFO 結構:
PKSSTREAM_HEADER pDataPacket = pSrb->CommandData.DataBufferArray;
PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO) (pDataPacket + 1);
minidriver 應該設定所擷取資料的其他資訊欄位,例如擷取的畫面、卸載的畫面格,以及欄位極性。 框架資訊通常會儲存在驅動程式寫入器定義資料流程延伸模組的成員中。
*pFrameInfo = pStrmEx->FrameInfo; // Get the frame info from the minidriver-defined stream extension
最好是在轉換至KSSTATE_ACQUIRE狀態時,更新KS_FRAME_INFO、KS_VBI_FRAME_INFO或KSPROPERTY_DROPPEDFRAMES_CURRENT_S的 PictureNumber或DropCount成員。
在從 KSSTATE_ACQUIRE 狀態轉換為 KSSTATE_PAUSE 狀態時,可以接受更新這些成員。
請勿將 PictureNumber 或 DropCount 從 KSSTATE_PAUSE 狀態更新為 KSSTATE_RUN 狀態或 KSSTATE_RUN 狀態轉換為 KSSTATE_PAUSE 狀態。
如果先前已卸載框架,迷你驅動程式應該設定不連續旗標,然後重設其內部旗標。 下列程式碼示範如何設定資料不連續旗標:
if (pStrmEx->fDiscontinuity) {
pDataPacket->OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;
pStrmEx->fDiscontinuity = FALSE;
}
最後,minidriver 應該放棄 SRB 的控制,以完成畫面擷取。
CompleteStreamSRB (pSrb);