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 MR_BUFFER_SERVICE pengidentifikasi layanan. Metode mengembalikan pointer 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::Lock. Umumnya ini tidak disarankan, karena memaksa objek untuk menyalin memori dari permukaan Direct3D dan kemudian kembali lagi. Metode Lock2D lebih efisien.

Kunci dan 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 disempurnakan (EVR) membuat buffer permukaan DirectX saat 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:

  1. Panggil IMFSample::GetBufferByIndex dengan nilai indeks nol.
  2. Panggil MFGetService dan tentukan pengidentifikasi layanan MR_BUFFER_SERVICE .

Kode berikut menunjukkan langkah-langkah ini:

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;
}

Buffer Media

Sampel Video