다음을 통해 공유


DirectX Surface 버퍼

DirectX 표면 버퍼 개체는 Direct3D 표면을 관리하는 미디어 버퍼입니다. 이 개체의 instance 만들려면 MFCreateDXSurfaceBuffer를 호출하고 DirectX 화면에 포인터를 전달합니다. DirectX 표면 버퍼는 다음 인터페이스를 노출합니다.

버퍼 개체에서 Surface 메모리에 액세스하는 방법에는 여러 가지가 있습니다.

  • 권장: 버퍼에서 IMFGetService::GetService 를 호출합니다. 서비스 식별자 MR_BUFFER_SERVICE 사용합니다. 메서드는 기본 Direct3D 표면에 대한 포인터를 반환합니다.
  • IMF2DBuffer::Lock2D를 호출합니다. 이 메서드는 표면에서 직접 IDirect3DSurface9::LockRect 를 호출합니다. IMF2DBuffer::Unlock2D 메서드는 Surface에서 UnlockRect를 호출합니다.
  • IMFMediaBuffer::Lock을 호출합니다. 일반적으로 개체가 Direct3D 표면에서 메모리를 복사한 다음 다시 다시 복사하도록 강제하기 때문에 권장되지 않습니다. Lock2D 메서드가 더 효율적입니다.

기본 표면을 잠글 수 없는 경우 Lock 및 Lock2D 가 모두 실패할 수 있습니다. DirectX 표면 버퍼는 Direct3D 표면에서 작동하도록 설계되지 않은 구성 요소에 대해 주로 이러한 두 가지 방법을 구현합니다.

EVR(고급 비디오 렌더러)은 디코더가 DXVA(DirectX Video Acceleration)에 대해 구성되지 않은 경우 DirectX 표면 버퍼를 만듭니다. 자세한 내용은 IMFVideoSampleAllocator를 참조하세요.

Direct3D Surface 가져오기

비디오 샘플에서 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;
}

미디어 버퍼

비디오 샘플