Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › IMFVideoPositionMapper

IMFVideoPositionMapper

COM
IID1f6a9f17-e70b-4e24-8ae4-0b2c3ba7a4ae継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

入力ビデオストリーム上の位置を、対応する出力ビデオストリーム上の位置にマッピングします。

メソッド 1

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT MapOutputCoordinateToInputStream(FLOAT xOut, FLOAT yOut, DWORD dwOutputStreamIndex, DWORD dwInputStreamIndex, FLOAT* pxIn, FLOAT* pyIn)

出力画像の座標を入力画像の座標にマッピングします。

xOutFLOATin出力画像の X 座標。[0...1] の範囲に正規化されます。
yOutFLOATin出力画像の Y 座標。[0...1] の範囲に正規化されます。
dwOutputStreamIndexDWORDin座標マッピングの対象となる出力ストリームのインデックス。
dwInputStreamIndexDWORDin座標マッピングの対象となる入力ストリームのインデックス。
pxInFLOAT*outマッピングされた入力画像の X 座標を受け取ります。[0...1] の範囲に正規化されます。
pyInFLOAT*outマッピングされた入力画像の Y 座標を受け取ります。[0...1] の範囲に正規化されます。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドが成功しました。
MF_E_SHUTDOWN
ビデオレンダラーがシャットダウンされています。

解説(Remarks)

次の図において、R(dest) はビデオの描画先の四角形です。この四角形は IMFVideoDisplayControl::GetVideoPosition を呼び出すことで取得できます。四角形 R1 はビデオ内のサブストリームです。点 P は、R(dest) を基準としたピクセル座標 (x,y) を持ちます。

Illustration showing a rectangle labeled R dest surrounding one labeled R1, which contains a point P located at (x,y)

R(dest) を基準とした点 P の位置を正規化座標で表すと、次のように計算されます。

float xn = float(x + 0.5) / widthDest;
float xy = float(y + 0.5) / heightDest;

ここで widthDestheightDest は 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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 方式にも切替可。