Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
DirectX yüzey arabellek nesnesi, Direct3D yüzeyini yöneten bir medya arabelleğidir. Bu nesnenin bir örneğini oluşturmak için MFCreateDXSurfaceBuffer çağırın ve DirectX yüzeyine bir işaretçi geçirin. DirectX yüzey arabelleği aşağıdaki arabirimleri kullanıma sunar:
Surface belleğine arabellek nesnesinden erişmenin birkaç yolu vardır:
- Önerilen: Arabelleğe IMFGetService::GetServiceçağırın. MR_BUFFER_SERVICEhizmet tanımlayıcısını kullanın. yöntemi, temel alınan Direct3D yüzeyine yönelik bir işaretçi döndürür.
- IMF2DBuffer::Lock2Darayın. Bu yöntem, doğrudan yüzeyde IDirect3DSurface9::LockRect çağırır. IMF2DBuffer::Unlock2D yöntemi, yüzeyde UnlockRect çağırır.
- ARAMA IMFMediaBuffer::Lock. Genellikle bu önerilmez, çünkü nesneyi Direct3D yüzeyinden belleği kopyalamaya zorlar ve sonra tekrar geri döndürür. Lock2D yöntemi daha verimlidir.
Temeldeki yüzey kilitlenebilir değilse hem Lock hem de Lock2D başarısız olabilir. DirectX yüzey arabelleği öncelikle Direct3D yüzeyleriyle çalışacak şekilde tasarlanmamış bileşenler için bu iki yöntemi uygular.
Gelişmiş video işleyicisi (EVR), kod çözücü DirectX Video Hızlandırma (DXVA) için yapılandırılmadığında DirectX yüzey arabellekleri oluşturur. Daha fazla bilgi için bkz. IMFVideoSampleAllocator.
Direct3D Yüzeyi Edinme
Video örneğinden Direct3D yüzeyi almak için aşağıdakileri yapın:
- Sıfır dizin değeriyle IMFSample::GetBufferByIndex çağırın.
- MFGetServiceçağırın ve MR_BUFFER_SERVICE hizmet tanımlayıcısını belirtin.
Aşağıdaki kod şu adımları gösterir:
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;
}
İlgili konular