DirectX Surface 버퍼
DirectX 표면 버퍼 개체는 Direct3D 표면을 관리하는 미디어 버퍼입니다. 이 개체의 인스턴스를 만들려면 MFCreateDXSurfaceBuffer 호출하고 DirectX 화면에 포인터를 전달합니다. DirectX 표면 버퍼는 다음 인터페이스를 노출합니다.
버퍼 개체에서 Surface 메모리에 액세스하는 방법에는 여러 가지가 있습니다.
- 권장: 버퍼에서 IMFGetService::GetService 호출합니다. 서비스 식별자 MR_BUFFER_SERVICE사용합니다. 이 메서드는 기본 Direct3D 화면에 대한 포인터를 반환합니다.
- IMF2DBuffer::Lock2D호출합니다. 이 메서드는 IDirect3DSurface9::LockRect 직접 호출합니다. IMF2DBuffer::Unlock2D 메서드는 UnlockRect 호출합니다.
- IMFMediaBuffer::Lock호출합니다. 일반적으로 개체가 Direct3D 화면에서 메모리를 복사한 다음 다시 다시 복사하도록 강제하기 때문에 권장되지 않습니다. Lock2D 메서드가 더 효율적입니다.
기본 표면을 잠글 수 없는 경우 Lock 및 Lock2D 모두 실패할 수 있습니다. DirectX 표면 버퍼는 주로 Direct3D 표면에서 작동하도록 설계되지 않은 구성 요소에 대해 이러한 두 가지 메서드를 구현합니다.
디코더가 DXVA(DirectX Video Acceleration)에 대해 구성되지 않은 경우 EVR(향상된 비디오 렌더러)은 DirectX 표면 버퍼를 만듭니다. 자세한 내용은 IMFVideoSampleAllocator참조하세요.
Direct3D Surface 가져오기
비디오 샘플에서 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;
}
관련 항목