マスター クロック
ミニドライバーは、他のミニドライバーが作成したクロックにストリームを同期できます。複数のストリームを 1 クロックに同期できます。 ピンが マスター クロックを使用または生成する場合、ミニドライバーは KSPROPERTY_STREAM_MASTERCLOCKをサポートする必要があります。 クライアントは、このプロパティを使用して、ピンのマスター クロックを設定することもできます。 レンダリングやキャプチャ操作を実行するピンは、頻繁にマスター クロックを使用します。 ミニドライバーは、終了時にクロック参照を解放する役割があります。
マスター クロックのインターフェイスは、メソッド、プロパティ、イベントをサポートするファイル オブジェクトです。
ファイル オブジェクトに対するすべてのクエリは、PASSIVE_LEVEL でのみ使用できます。 ただし、クロック位置のクエリは、DISPATCH_LEVEL で使用可能な直接関数呼び出しポインターでもサポートされており、このポインターはファイル オブジェクトが有効である限り有効です。 この直接呼び出しは、クロックのファイル オブジェクトにコンテキスト パラメーターとして渡す必要があります。
ファイル ハンドルは、ピンが IRP_MJ_CREATE によって作成されるのと同様に、フィルター ピン インスタンスに対する作成リクエストによって取得します。 この要求により、ピンのファイル ハンドルが作成されるのと同様に、独自のコンテキスト情報を使用してファイル ハンドルが作成されます。 このファイル ハンドルは呼び出し元に戻され、カーネル モード フィルターのマスター クロックを設定するために使用できます。 フィルターがグラフのマスター クロックを割り当てる際、ピン インスタンスは親ファイル オブジェクトにクエリして、マスター クロックを所有しているかどうかを判断できます。
フィルターにこのマスター クロックのファイル ハンドルが与えられると、それを使用してプロパティをクエリできます。 マスター クロックがカーネル モード フィルターに基づいている場合は、マスター クロックのカーネル モード部分へのファイル ハンドルをクエリするインターフェイスをサポートする必要があります。 インターフェイスがサポートされていない場合、クロックがユーザー モード ベースであり、カーネル モード フィルターが同期できないと見なされます。
マスター クロック ハンドルを要求する DirectShow プロキシ フィルターは、それを基になるカーネル モード フィルター ファイル ハンドルに渡します。 カーネル モード フィルターは、基になるファイル オブジェクトを参照します。 フィルターがすでにマスター クロックを持っていた場合、ファイル オブジェクトを再参照して新しいハンドルを使用します。 これを行うには、フィルターが 停止状態である必要があります。
マスター クロック オブジェクトの物理的な時刻は、多くの場合、ハードウェア ベースです。 マスター クロックを表示するフィルターに物理クロックがない場合は、ストリーム時間は表示されるデータのタイム スタンプに従って進行します。 このような状況では、データ不足のためにタイム スタンプが停止する可能性があります。
マスター クロックの背後にある物理的な時刻はリモートである可能性があります。その場合、正確な読み取り値を提供するのはローカル プロキシの役割です。 たとえば、プロキシは 1394 接続全体の遅延を補正したり、ネットワーク全体の遅延を平均化したりする必要があります。 さらに、他のカーネル フィルターが同じ 1394 バス上の 2 つ目のデバイスのプロキシである場合、2 つのデバイスは、マスター クロックとやり取りするプライベートメソッドをネゴシエートできます。 このような場合、互換性を確認するために、デバイスはプライベート インターフェイスを使用してクロックの種類を決定する必要があります。