ビデオ レンダラーのソース四角形とターゲット四角形
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
ビデオ メディアの種類の VIDEOINFO、VIDEOINFOHEADER、VIDEOINFOHEADER2 形式の構造体には、3 つのサイズがあります。 この記事では、その機能とそのしくみについて説明します。
まず、これらの構造体の bmiHeader メンバーにサイズがあります。 bmiHeader メンバーは、独自の幅と高さのメンバー bmiHeader.biWidth と bmiHeader.biHeight を持つ BITMAPINFOHEADER 構造体です。
次に、これらの構造体の rcSource メンバーに四角形があります。最後に、これらの構造体の rcTarget メンバーに四角形があります。
A と B の 2 つのフィルターがあり、これらのフィルターが、特定のビデオ メディアの種類で互いに接続されているとします (左側の A、アップストリーム、右側または下流の B)。
フィルター A と B の間を渡すバッファーには、サイズ (bmiHeader.biWidth、 bmiHeader.biHeight) があります。 フィルター A は、 rcSource によって決定された入力ビデオの一部を取得し、そのビデオをストレッチしてバッファーの rcTarget 部分を埋める必要があります。 使用する入力ビデオの部分は、 rcSource が最初に接続された A と B をフィルター処理するメディアの種類の (biWidth、 biHeight) サイズと比較する方法に基づいています。 rcSource が空の場合、フィルター A は入力ビデオ全体を使用します。 rcTarget が空の場合、フィルター A は出力バッファー全体を埋めます。
たとえば、フィルター A が 160 x 120 ピクセルのビデオ データを受信しているとします。 また、フィルター A が次のメディアの種類のフィルター B に接続されているとします。
- (biWidth、 biHeight): 320、240
- rcSource: (0, 0, 0, 0)
- rcTarget: (0, 0, 0, 0)
つまり、フィルター A は受信したビデオを x 方向と y 方向の両方で 2 ずつ拡大し、320 x 240 の出力バッファーを埋めます。
別の例として、フィルター A が 160 x 120 のビデオ データを受信し、次のメディアの種類のフィルター B に接続されているとします。
- (biWidth、 biHeight): 320、240
- rcSource: (0、0、160、240)
- rcTarget: (0, 0, 0, 0)
rcSource メンバーは、接続されているバッファー サイズ 320、240 を基準にしています。 指定された rcSource (0、 0、160、240)はバッファの左半分、フィルタAはその入力ビデオの左半分、または(0、0、80、120)部分を取り、ビデオを(x方向に4ずつ、y方向に2ずつ)のサイズにビデオを伸ばして320 x 240出力バッファを充填する。
次に、フィルター A が CBaseAllocator::GetBuffer を呼び出し、返されるメディア サンプルにメディアの種類がアタッチされていることを前提としています。これは、フィルター B がフィルター A に、以前に提供していたとは異なるサイズまたは種類のビデオを提供することを示しています。 新しいメディアの種類が次の場合を想定します。
- (biWidth、 biHeight): 640、480
- rcSource: (0、0、160、120)
- rcTarget: (0、0、80、60)
これは、メディア サンプルのサイズが 640 x 480 のバッファーを持っていることを意味します。 rcSource メンバーは、元の接続されたメディアの種類 (320、240) に対して相対的であり、新しいメディアの種類 (640、480) には関係ないため、rcSource は入力ビデオの左上隅 (25%) を使用するように指定します。 入力ビデオのこの部分は、(0, 0, 80, 60) の rcTarget で指定された 640 x 480 出力バッファーの左上 (80, 60) ピクセルに配置されます。 フィルター A は 160 x 120 のビデオを受信するため、入力ビデオの左上隅は (80, 60) の部分であり、出力ビットマップの同じサイズであり、ストレッチは必要ありません。
フィルター A は、出力バッファーの他のピクセルにデータを配置せず、それらのビットはそのままにします。 rcSource メンバーは、フィルター A と B の間に接続された元のメディアの種類の biWidth と biHeight によって囲まれており、rcTarget はメディア サンプルの新しい biWidth と biHeight によって囲まれます。 前の例では、 rcSource は (0、0、320、240) の境界外に移動できず、 rcTarget は (0,0, 640, 480) の境界の外に出ることができませんでした。