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


Буфер DirectX Surface

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

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

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

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

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

Получение Surface Direct3D

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

  1. Вызов МВФSample::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;
}

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

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