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


Предоставление пользовательского Allocator-Presenter для VMR-7

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи захватом аудио и видео в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Распределитель-презентатор отвечает за выделение поверхностей DirectDraw и представление видеокадров для визуализации. В подавляющем большинстве сценариев функциональность аллокатора-представителя по умолчанию будет более чем достаточной для потребностей приложения. Подключив пользовательский аллокатор-презентер, приложение может получить прямой доступ к видеоданным и полностью контролировать процесс отрисовки. Компромисс для этой повышенной мощности заключается в том, что приложение должно обрабатывать добавленную сложность управления поверхностями DirectDraw.

с помощью пользовательского аллокатора-презентера

На предыдущем рисунке показаны интерфейсы связи, используемые VMR и аллокатором-презентатором. Настраиваемый распределитель-презентер, переопределяющий всю функциональность выделения и презентации по умолчанию, должен реализовать интерфейсы IVMRImagePresenter и IVMRSurfaceAllocator, а также, по желанию, интерфейс IVMRWindowlessControl.

Чтобы заменить распределитель-презентер по умолчанию, приложение вызовет метод IVMRSurfaceAllocatorNotify::AdviseSurfaceAllocator и передаст указатель на новый распределитель-презентер. В ответ на этот вызов VMR вызовет метод IVMRSurfaceAllocator::AdviseNotify, чтобы предоставить указатель на интерфейс IVMRSurfaceAllocatorNotify VMR. Распределитель-презентер будет использовать этот указатель интерфейса при передаче событий к VMR с помощью метода IVMRSurfaceAllocatorNotify::NotifyEvent.

В качестве альтернативного решения, приложение может использовать как собственный аллокатор-презентер, так и аллокатор-презентер по умолчанию. В этом сценарии настраиваемый распределитель-аллокатор обрабатывает только те вызовы, которые требуют кастомных функций, и передает остальные вызовы из VMR через аллокатор по умолчанию. Во многих случаях необходимо переопределить интерфейс IVMRImagePresenter.

с использованием двух распределителей-презентаторов

Чтобы использовать как настраиваемый выделитель-представитель, так и выделитель-представитель по умолчанию, приложение сначала вызовет IVMRSurfaceAllocatorNotify::AdviseSurfaceAllocator, чтобы предоставить указатель на новый выделитель-представитель. Это приводит к уничтожению аллокатора-презентера по умолчанию, поэтому приложение должно создать другой его экземпляр, вызвав QueryInterface на VMR и запросив интерфейс IVMRSurfaceAllocator. Как показано на предыдущем рисунке, пользовательский выделитель-демонстратор переопределяет методы интерфейса IVMRImagePresenter и просто передает все вызовы интерфейсу IVMRSurfaceAllocator через реализацию по умолчанию. На рисунке также показан интерфейс IVMRWindowlessControl, реализованный на распределителе-презентере.

Поставка пользовательского Allocator-Presenter для VMR-9

режим воспроизведения без отрисовки VMR (настраиваемый Allocator-Presenters)