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


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

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

Чтобы использовать пользовательский выступающий распределителя с фильтром Отрисовщик 9 (VMR-9), выполните следующие действия:

  1. Реализуйте класс, поддерживающий интерфейсы IVMRSurfaceAllocator9 и IVMRImagePresenter9 .

  2. Вызовите QueryInterface для фильтра VMR-9 для интерфейса IVMRFilterConfig9 .

  3. Вызовите метод IVMRFilterConfig9::SetRenderingMode и передайте флаг VMR9Mode_Renderless .

  4. QueryInterface в фильтре VMR-9 для интерфейса IVMRSurfaceAllocatorNotify9 .

  5. Вызовите метод IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator и передайте указатель на метод IVMRSurfaceAllocator9 .

  6. Вызовите метод IVMRSurfaceAllocator9::AdviseNotify своего распределителя-докладчика и передайте указатель на интерфейс IVMRSurfaceAllocatorNotify9 фильтра VMR-9.

  7. В реализации IVMRSurfaceAllocator9::AdviseNotify вызовите IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass в указателе на устройство Direct3D и дескриптор на мониторе, где будет отображаться видео.

  8. В реализации метода IVMRSurfaceAllocator9::InitializeDevice создайте поверхности Direct3D, соответствующие параметрам, заданным в методе InitializeDevice . При необходимости для выделения этих поверхностей можно использовать метод IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper фильтра VMR-9. Храните указатели поверхности в массиве.

    Примечание

    Если вы хотите, чтобы VMR-9 рисовал видеокадры на поверхности текстуры, добавьте флаг VMR9AllocFlag_TextureSurface в структуру VMR9AllocationInfo . Если устройство не поддерживает текстуры в собственном формате видео, может потребоваться создать отдельную поверхность текстуры, а затем скопировать видеокадры из видео surface в текстуру.

     

  9. Во время потоковой передачи VMR-9 получает поверхности от распределителя-докладчика путем вызова метода IVMRSurfaceAllocator9::GetSurface . VMR-9 определяет поверхность по индексу в массиве поверхностей (шаг 8).

  10. Представить образ, когда VMR-9 вызывает метод IVMRImagePresenter9::P resentImage . Параметры включают указатель на поверхность Direct3D, которая содержит видеоиним.

  11. Если устройство Direct3D теряется в любое время, выступающий с распределителем должен восстановить устройство и повторно создать поверхности. Например, устройство может быть потеряно, если режим отображения изменится или пользователь переместит окно на другой монитор. При изменении устройства Direct3D вызовите метод IVMRSurfaceAllocatorNotify9::ChangeD3Device фильтра VMR-9.

  12. При остановке потоковой передачи VMR-9 вызывает метод IVMRSurfaceAllocator9::TerminateDevice . Распределитель-докладчик должен освободить все свои ресурсы Direct3D.

Существуют некоторые различия между VMR-7 и VMR-9 в том, как управляются пользовательскими выступающими распределителями:

  • Метод AllocateSurfaceHelper фильтра VMR-9 доступен для распределителя-докладчика при выделении поверхностей. Этот метод делает ненужным для настраиваемого докладчика распределителя переадресацию любых вызовов к распределителю-докладчику по умолчанию. По этой причине CLSID фильтра VMR-9 по умолчанию не публикуется.
  • В отличие от VMR-7, VMR-9 не предоставляет специального распределителя и докладчика в монопольном режиме DirectDraw. Метод IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper делает этот объект ненужным.
  • Для видео с чередованием VMR-9 всегда отменяет чередование видео перед представлением изображения. Выступающий с распределителем больше не несет ответственности за дескриментирование изображения перед его отображением.

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