次の方法で共有


ビデオ レンダラにおける転送元矩形と転送先矩形

ビデオ メディア タイプの VIDEOINFOVIDEOINFOHEADERVIDEOINFOHEADER2 フォーマット構造体には 3 つのサイズがある。ここでは、その内容と機能について説明する。

まず、これらの構造体の bmiHeader メンバにサイズがある。bmiHeader メンバは BITMAPINFOHEADER 構造体であり、独自の幅メンバと高さメンバとして bmiHeader.biWidth および bmiHeader.biHeight を持つ。

また、各構造体の rcSource メンバに矩形がある。さらに、各構造体の rcTarget メンバにも矩形がある。

2 つのフィルタ A と B があり、この 2 つが特定のビデオ メディア タイプで互いに接続されているとする。A が左側 (アップストリーム)、B が右側 (ダウンストリーム) である。

フィルタ A とフィルタ B の間のバッファには、サイズ (bmiHeader.biWidthbmiHeader.biHeight) がある。フィルタ A は rcSource によって決定される入力ビデオの一部を受け取り、そのビデオをバッファの rcTarget 部分に合わせて伸縮する。入力ビデオで使われる部分は、フィルタ A および B が最初に接続されるメディア タイプの (biWidthbiHeight) サイズと、rcSource との比率によって決まる。rcSource が空である場合、フィルタ A はその入力ビデオの全体を使う。rcTarget が空である場合、フィルタ A は出力バッファの全体にビデオを収める。

たとえば、フィルタ A が 160 × 120 ピクセルのビデオ データを受け取ると仮定する。また、フィルタ A が次のメディア タイプでフィルタ B に接続されているとする。

(biWidth, biHeight): 320, 240

rcSource: (0, 0, 0, 0)

rcTarget: (0, 0, 0, 0)

この場合、フィルタ A は受け取ったビデオを x 方向と y 方向の両方について 2 倍に伸長し、320 × 240 の出力バッファに収める。

もう 1 つの例として、フィルタ A が 160 × 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) 部分を受け取り、ビデオをサイズ (320, 240) に (x 方向に 4 倍、y 方向に 2 倍に) 伸長して、320 × 240 の出力バッファに収める。

ここで、フィルタ A が CBaseAllocator::GetBuffer を呼び出し、返されたメディア サンプルにアタッチされたメディア タイプにより、フィルタ B がフィルタ A にそれまでとは異なるサイズまたは種類のビデオを要求していることが示される。新しいメディア タイプは次のとおりである。

(biWidth, biHeight): 640, 480

rcSource: (0, 0, 160, 120)

rcTarget: (0, 0, 80, 60)

この場合、メディア サンプルにはサイズが 640 × 480 のバッファが含まれる。rcSource メンバは、新しいメディア タイプ (640, 480) ではなく、最初に接続されていたメディア タイプ (320, 240) に基づく。したがって、rcSource は入力ビデオの左上の 25% が使われることを指定する。rcTarget の (0, 0, 80, 60) に従って、入力ビデオのこの部分は 640 × 480 の出力バッファの左上の (80, 60) ピクセルに配置される。フィルタ A は 160 × 120 のビデオを受け取るため、入力ビデオの左上は (80, 60) となる。これは出力ビットマップと同じサイズであり、伸縮は不要である。

フィルタ A は出力バッファの残りのピクセルにはデータを配置せず、その部分のビットは操作しない。rcSource メンバは、フィルタ A とフィルタ B の間に最初に接続されていたメディア タイプの biWidthbiHeight によって制限される。rcTarget は、メディア サンプルの新しい biWidthbiHeight によって制限される。上記の例では、rcSource は (0, 0, 320, 240) の境界を出ることができず、rcTarget は (0, 0, 640, 480) の境界を出ることができない。