ビデオのキャプチャ
ストリームが 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);
ミニドライバーは、キャプチャされたデータに関する追加情報フィールド (キャプチャされたフレーム、ドロップされたフレーム、フィールドの極性など) を設定する必要があります。 フレーム情報は通常、ドライバライタが定義したストリーム拡張のメンバに格納されます。
*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_PAU Standard Edition 状態への移行時にこれらのメンバーを更新することは許容されます。
KSSTATE_PAUSE状態からKSSTATE_RUN状態またはKSSTATE_RUN状態からKSSTATE_PAUSE状態に移行する場合は、PictureNumberまたはDropCountを更新しないでください。
フレームが以前にドロップされた場合、ミニドライバーは不連続フラグを設定し、内部フラグをリセットする必要があります。 次のコードは、データ不連続性フラグの設定を示しています。
if (pStrmEx->fDiscontinuity) {
pDataPacket->OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;
pStrmEx->fDiscontinuity = FALSE;
}
最後に、ミニドライバーは SRB の制御を放棄し、フレーム キャプチャを完了する必要があります。
CompleteStreamSRB (pSrb);