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 メソッドの方が効率的です。

基になるサーフェスがロックできない場合、 LockLock2D の両方が失敗する可能性があります。 DirectX サーフェス バッファーは、主に Direct3D サーフェスで動作するように設計されていないコンポーネントに対して、これら 2 つのメソッドを実装します。

デコーダーが DirectX ビデオ アクセラレーション (DXVA) 用に構成されていない場合、拡張ビデオ レンダラー (EVR) によって DirectX サーフェス バッファーが作成されます。 詳細については、「 IMFVideoSampleAllocator」を参照してください。

Direct3D サーフェスの取得

ビデオ サンプルから Direct3D サーフェスを取得するには、次の操作を行います。

  1. インデックス値が 0 の IMFSample::GetBufferByIndex を呼び出します。
  2. 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;
}

メディア バッファー

ビデオ サンプル