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