Буфер 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 из примера видео, сделайте следующее:
- Вызов МВФSample::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;
}
Связанные разделы