Direct3D レンダー ターゲットの操作
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
Direct3D レンダー ターゲットのいくつかのメディア サブタイプは、VMR-7 と VMR-9 で使用するために定義されています。 アップストリーム フィルターは、これらのサブタイプのいずれかとの接続を提案すると、レンダリングが Direct3D レンダー ターゲットで実行されることを VMR に示します。 VMR-7 の場合、これは DirectX 7 Direct3D レンダー ターゲットになり、VMR-9 の場合は DirectX 9 Direct3D レンダー ターゲットになります。 VMR がミキシング モードの場合、サーフェスも Direct3D テクスチャ サーフェスになります。 VMR がミキシング モードでない場合、サーフェスは通常の Direct3D サーフェスになります。 ARGB ピクセル形式は、VMR がミキシング モードの場合にのみサポートされます。 レンダー ターゲットサブタイプは次のとおりです。
VMR-7 | VMR-9 |
---|---|
MEDIASUBTYPE_RGB32_D3D_DX7_RT | MEDIASUBTYPE_RGB32_D3D_DX9_RT |
MEDIASUBTYPE_RGB16_D3D_DX7_RT | MEDIASUBTYPE_RGB16_D3D_DX9_RT |
MEDIASUBTYPE_ARGB32_D3D_DX7_RT | MEDIASUBTYPE_ARGB32_D3D_DX9_RT |
MEDIASUBTYPE_ARGB4444_D3D_DX7_RT | MEDIASUBTYPE_ARGB4444_D3D_DX9_RT |
MEDIASUBTYPE_ARGB1555_D3D_DX7_RT | MEDIASUBTYPE_ARGB1555_D3D_DX9_RT |
これらの型は、ヘッダー ファイル uuids.h で定義されています。 MEDIASUBTYPE_RGB32メディアの種類は RGBx888 形式で、MEDIASUBTYPE_RGB16メディアの種類は RGB565 形式です。 これらのピクセル形式の詳細については、DirectX グラフィックスのドキュメントを参照してください。
ロック解除されたサーフェスの要求
DirectDraw サーフェスのロックとロック解除は、計算コストの高い操作です。 Direct3D レンダー ターゲット メディア サブタイプを使用する場合、アップストリーム フィルターは、グラフィックス ハードウェアで操作できるように、サーフェスのロックを解除する必要があります。 不要なロック解除操作を回避するために、VMR は IMemAllocator::GetBuffer メソッド (AM_GBF_NODDSURFACELOCK) で新しいフラグをサポートしています。このメソッドは、サンプルをアップストリーム フィルターに渡す前に DirectDraw サーフェスをロックしないように VMR に指示します。 このフラグを使用すると、ロックされたポインターがないため、 IMediaSample::GetPointer の呼び出しは失敗します。 DirectDraw サーフェスへのアクセスを取得するには、返された IMediaSample オブジェクトで QueryInterface を呼び出し、IVMRSurface インターフェイスを要求する必要があります。 明らかに、アップストリーム フィルターは、サンプルをフリー リストに戻すときに、サーフェスがロックされていないことを確認する必要があります。