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

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

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

с помощью пользовательского распределителя-докладчика

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

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

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

с помощью двух распределителей-выступающих

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

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

Режим воспроизведения без отрисовки VMR (пользовательские выступающие распределителя)