DirectX Surface Buffer
DirectX サーフェス バッファー オブジェクトは、Direct3D サーフェスを管理するメディア バッファーです。 このオブジェクトのインスタンスを作成するには、 MFCreateDXSurfaceBuffer を呼び出し、DirectX サーフェスへのポインターを渡します。 DirectX サーフェス バッファーは、次のインターフェイスを公開します。
バッファー オブジェクトからサーフェス メモリにアクセスするには、いくつかの方法があります。
- 推奨: バッファーで IMFGetService::GetService を呼び出します。 サービス識別子 MR_BUFFER_SERVICEを使用します。 メソッドは、基になる Direct3D サーフェスへのポインターを返します。
- IMF2DBuffer::Lock2D を呼び出します。 このメソッドは 、IDirect3DSurface9::LockRect をサーフェス上で直接呼び出します。 IMF2DBuffer::Unlock2D メソッドは、サーフェス上で UnlockRect を呼び出します。
- IMFMediaBuffer::Lock を呼び出します。 一般に、これは、Direct3D サーフェスからメモリをコピーしてから、もう一度戻すオブジェクトを強制するため、推奨されません。 Lock2D メソッドの方が効率的です。
基になるサーフェスがロックできない場合、 Lock と Lock2D の両方が失敗する可能性があります。 DirectX サーフェス バッファーは、主に Direct3D サーフェスで動作するように設計されていないコンポーネントに対して、これら 2 つのメソッドを実装します。
デコーダーが DirectX ビデオ アクセラレーション (DXVA) 用に構成されていない場合、拡張ビデオ レンダラー (EVR) によって DirectX サーフェス バッファーが作成されます。 詳細については、「 IMFVideoSampleAllocator」を参照してください。
Direct3D サーフェスの取得
ビデオ サンプルから Direct3D サーフェスを取得するには、次の操作を行います。
- インデックス値が 0 の IMFSample::GetBufferByIndex を呼び出します。
- MFGetService を呼び出し、MR_BUFFER_SERVICE サービス識別子を指定します。
これらの手順を示すコードは次のようになります。
HRESULT GetD3DSurfaceFromSample(IMFSample *pSample, IDirect3DSurface9 **ppSurface)
{
*ppSurface = NULL;
IMFMediaBuffer *pBuffer = NULL;
HRESULT hr = pSample->GetBufferByIndex(0, &pBuffer);
if (SUCCEEDED(hr))
{
hr = MFGetService(pBuffer, MR_BUFFER_SERVICE, IID_PPV_ARGS(ppSurface));
pBuffer->Release();
}
return hr;
}
関連トピック