Поделиться через


Буфер Поверхности DirectX

Объект буфера поверхности DirectX — это буфер мультимедиа, который управляет поверхностью Direct3D. Чтобы создать экземпляр этого объекта, вызовите MFCreateDXSurfaceBuffer и передайте указатель на поверхность DirectX. Буфер поверхности DirectX предоставляет следующие интерфейсы:

Существует несколько способов доступа к поверхностной памяти из объекта buffer:

  • Рекомендуется: вызовите IMFGetService::GetService в буфере. Используйте идентификатор службы MR_BUFFER_SERVICE. Метод возвращает указатель на базовую поверхность Direct3D.
  • Позвоните по телефону IMF2DBuffer::Lock2D. Этот метод вызывает IDirect3DSurface9::LockRect непосредственно на поверхности. Метод IMF2DBuffer::Unlock2D вызывает UnlockRect на поверхности.
  • Позвоните по телефону IMFMediaBuffer::Lock. Как правило, это не рекомендуется, так как он заставляет объект копировать память из поверхности Direct3D, а затем снова. Метод Lock2D более эффективен.

Блокировка и блокировка 2D могут завершиться сбоем, если базовая поверхность не блокируется. Буфер поверхности DirectX реализует эти два метода в основном для компонентов, которые не предназначены для работы с поверхностями Direct3D.

Расширенный отрисовщик видео (EVR) создает буферы поверхности DirectX, если декодер не настроен для ускорения видео DirectX (DXVA). Дополнительные сведения см. в разделе IMFVideoSampleAllocator.

Получение Direct3D Surface

Чтобы получить поверхность Direct3D из примера видео, сделайте следующее:

  1. Вызовите метод 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;
}

Буферы мультимедиа

Примеры видео