次の方法で共有


ビデオのキャプチャ

ストリームが 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_INFOKS_VBI_FRAME_INFO、または KSPROPERTY_DROPPEDFRAMES_CURRENT_SPictureNumber または 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);