AVStream のスプリッター
AVStream ミニドライバーは、AVStream クラス ドライバー機能を使用して、ストリームが特定のピンを通過する際にデータ ストリームを複数のコピーに分割できます。 この分割プロセスは、ドライバーが入力ストリームをコピーして 2 つの同じ出力ストリームを生成する必要がある場合に便利です。
これを行うには、ピンのKSPIN_DESCRIPTOR_EX 構造体の Flags メンバーに KSPIN_FLAG_SPLITTER を設定します。 このフラグがピンに設定されている場合、ピンは自動スプリッターとして機能します。 AVStream は、ストリームの分割に必要なすべてのデータを自動的にコピーします。
DirectX8.0 より後のリリースでは、KSPIN_FLAG_SPLITTER フラグはフィルター中心フィルターとピン中心フィルターの両方のピンに対して機能します。 以前のリリースでは、フィルター中心のフィルターのピンに対してのみ、このフラグがサポートされています。
次の図は、入力ピンがストリームを 2 つの出力ピンに分割するフィルターの構成を示しています。 この出力ピンのダウンストリーム フィルターによって、データがインプレースに変更されます。
フレームは入力ピンに到着し、入力キューに配置されます。 ミニドライバーは、入力キューと元のピンの出力キューとのみ対話します。 AVStream は、最初のピンのキューから 2 番目のピンのキューにデータを自動的にコピーします。
わかりやすくするために、この図では出力ピンにフレームを供給する方法を示していません。 たとえば、出力ピンにフレームを提供するには、要求元とアロケーターが各キューに関連付けられ、このパイプ セクションに属している可能性があります。 または、フレームがダウンストリーム フィルターから取得される場合があります。
KSFILTER_DISPATCH 構造体では、ミニドライバーは、ベンダーが提供する AVStrMiniFilterProcess コールバック ルーチンへのポインターを指定します。 このコールバック ルーチンでは、ミニドライバーは、次に示す KSPROCESSPIN 構造体の配列を含む KSPROCESSPIN_INDEXENTRY 構造体へのポインターを受け取ります。
次の図は、ミニドライバーがプロセス ピンの一覧の 2 つの出力ピンを区別する方法を示しています。
この図では、DB は KSPROCESSPIN 構造体の DelegateBranch メンバーを参照し、CS は CopySource メンバーを参照します。 入力ピンと最初の出力ピンの DelegateBranch メンバーと CopySource メンバーの両方が NULL です。 これは、ミニドライバーがこれらのピンのフレームを処理する役割を担っていることを示します。
ただし、2 番目の出力ピンには、最初の出力ピンを指す CopySource があります。 これは、2 番目の出力ピンが最初の出力ピンとは別のパイプにあり、AVStream が最初の出力ピンのキューに配置されたデータを 2 番目の出力ピンのキューに自動的にコピーすることを示します。
2つの出力ピンが同じパイプに組み込まれていると、より複雑なスプリッターケースが発生する可能性があります。 たとえば、ダウンストリーム フィルターがこれらのピンから送信されたデータを変更しない限り、ミニドライバーは同じパイプに 2 つの分割ベースの出力ピンを含めることができます。 データは変更されないため、出力ピンは読み取り専用と見なされます。両方のダウンストリーム フィルターが同じバッファーを受け取ります。
また、分割ピンに自動的にアタッチされるダウンストリーム フィルターの一部がデータを変更し、それ以外のフィルターは変更しない場合もあります。
この場合、フィルター レイアウトは次の図のようになります。これは、分割出力ピンの 3 つのインスタンスを含むフィルターを示しています。
ダウンストリーム フィルターではデータが変更されないため、ピン A と ピン B は同じパイプに割り当てられます。A と B のダウンストリームのフィルターは、同じバッファー ポインターを受け取ります。
ミニドライバーは、入力キューと 1 つの出力キューとのみ対話します。 AVStream は、A/B キューと C キューから自動的にコピーします。 また、ピン A とピン B を介して同じデータ フレームを送信する分割オブジェクトも作成されます (ストリーム ヘッダーが異なることに注意してください)。
KSPROCESSPIN 構造体の配列は次のとおりです。
ミニドライバーが通常の状況で対話する必要がある唯一のピンは、ピン A です。
上記の図を簡略化するために、要求者とアロケーターは図から省略されました。 図は、フレーム分割プロセスのみを示すことを目的としています。