다음을 통해 공유


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 메서드가 더 효율적입니다.

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

디코더가 DXVA(DirectX Video Acceleration)에 대해 구성되지 않은 경우 EVR(향상된 비디오 렌더러)은 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;
}

미디어 버퍼

비디오 샘플