IMFVideoPositionMapper
COM公式ドキュメント
入力ビデオストリーム上の位置を、対応する出力ビデオストリーム上の位置にマッピングします。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
出力画像の座標を入力画像の座標にマッピングします。
| xOut | FLOAT | in | 出力画像の X 座標。[0...1] の範囲に正規化されます。 |
| yOut | FLOAT | in | 出力画像の Y 座標。[0...1] の範囲に正規化されます。 |
| dwOutputStreamIndex | DWORD | in | 座標マッピングの対象となる出力ストリームのインデックス。 |
| dwInputStreamIndex | DWORD | in | 座標マッピングの対象となる入力ストリームのインデックス。 |
| pxIn | FLOAT* | out | マッピングされた入力画像の X 座標を受け取ります。[0...1] の範囲に正規化されます。 |
| pyIn | FLOAT* | out | マッピングされた入力画像の Y 座標を受け取ります。[0...1] の範囲に正規化されます。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| ビデオレンダラーがシャットダウンされています。 |
解説(Remarks)
次の図において、R(dest) はビデオの描画先の四角形です。この四角形は IMFVideoDisplayControl::GetVideoPosition を呼び出すことで取得できます。四角形 R1 はビデオ内のサブストリームです。点 P は、R(dest) を基準としたピクセル座標 (x,y) を持ちます。
R(dest) を基準とした点 P の位置を正規化座標で表すと、次のように計算されます。
float xn = float(x + 0.5) / widthDest;
float xy = float(y + 0.5) / heightDest;
ここで widthDest と heightDest は R(dest) の幅と高さ(ピクセル単位)です。
R1 を基準とした点 P の位置を計算するには、次のように MapOutputCoordinateToInputStream を呼び出します。
float x1 = 0, y1 = 0;
hr = pMap->MapOutputCoordinateToInputStream(xn, yn, 0, dwInputStreamIndex, &x1, &y1);
x1 および y1 に返される値は [0...1] の範囲に正規化されています。ピクセル座標に戻すには、これらの値を R1 のサイズでスケーリングします。
int scaledx = int(floor(x1 * widthR1));
int scaledy = int(floor(xy * heightR1));
点 P が R1 の外側にある場合、x1 および y1 が [0...1] の範囲外になることがある点に注意してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFVideoPositionMapper "{1F6A9F17-E70B-4E24-8AE4-0B2C3BA7A4AE}" #usecom global IMFVideoPositionMapper IID_IMFVideoPositionMapper "{}" #comfunc global IMFVideoPositionMapper_MapOutputCoordinateToInputStream 3 float,float,int,int,var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IMFVideoPositionMapper "{1F6A9F17-E70B-4E24-8AE4-0B2C3BA7A4AE}" #usecom global IMFVideoPositionMapper IID_IMFVideoPositionMapper "{}" #comfunc global IMFVideoPositionMapper_MapOutputCoordinateToInputStream 3 float,float,int,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。