DirectX Surface Buffer
Objek buffer permukaan DirectX adalah buffer media yang mengelola permukaan Direct3D. Untuk membuat instans objek ini, panggil MFCreateDXSurfaceBuffer dan teruskan penunjuk ke permukaan DirectX. Buffer permukaan DirectX mengekspos antarmuka berikut:
Ada beberapa cara untuk mengakses memori permukaan dari objek buffer:
- Disarankan: Panggil IMFGetService::GetService pada buffer. Gunakan pengidentifikasi layanan MR_BUFFER_SERVICE. Metode mengembalikan penunjuk ke permukaan Direct3D yang mendasar.
- Panggil IMF2DBuffer::Lock2D. Metode ini memanggil IDirect3DSurface9::LockRect langsung di permukaan. Metode IMF2DBuffer::Unlock2D memanggil UnlockRect di permukaan.
- Panggil IMFMediaBuffer::Kunci. Umumnya ini tidak disarankan, karena memaksa objek untuk menyalin memori dari permukaan Direct3D dan kemudian kembali lagi. MetodeLock2D lebih efisien.
BaikKuncidan Lock2D dapat gagal jika permukaan yang mendasar tidak dapat dikunci. Buffer permukaan DirectX mengimplementasikan kedua metode ini terutama untuk komponen yang tidak dirancang untuk bekerja dengan permukaan Direct3D.
Perender video yang ditingkatkan (EVR) membuat buffer permukaan DirectX ketika dekoder tidak dikonfigurasi untuk DirectX Video Acceleration (DXVA). Untuk informasi selengkapnya, lihat IMFVideoSampleAllocator.
Mendapatkan Permukaan Direct3D
Untuk mendapatkan permukaan Direct3D dari sampel video, lakukan hal berikut:
- Panggil IMFSample::GetBufferByIndex dengan nilai indeks nol.
- PanggilMFGetServicedan tentukan pengidentifikasi layanan MR_BUFFER_SERVICE.
Kode berikut menunjukkan langkah-langkah berikut:
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;
}
Topik terkait