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


Некверное смешивание

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

Этот раздел относится к Windows XP с пакетом обновления 2 (SP2) или более поздней версии.

Когда VMR-9 смешивает два или более потоков, существует две точки, в которых может произойти масштабирование: когда микшер композитирует входные потоки и когда распределитель-выступающий отрисовывает составное изображение.

Операции смешивания vmr

Предыдущие версии VMR-9 всегда композитировали входные потоки с использованием квадратной (1:1) пропорции пикселей (PAR), даже если существовал только один видеопоток. Если входной поток имел некверные пиксели, это приводило к ненужной операции масштабирования. Конечно, следует избегать масштабирования, так как это снижает качество конечного изображения.

Начиная с Windows XP с пакетом обновления 2 (SP2), VMR-9 поддерживает два разных способа избежать проблемы двойного масштабирования:

  • Реализация пользовательского allocator-presenter и поддержка интерфейса IVMRSurfaceAllocatorEx9 .
  • Используйте режим некверного смешивания.

В этом разделе описывается режим некверного смешивания. Приложения могут сочетать оба метода.

Как работает некверное смешивание

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

Выбор потоков зависит от текущего режима смешивания:

  • Режим смешивания YUV ограничен одним видеопотоком на контакте 0. (Другие контакты могут иметь вложенные или закрытые подпись потоки.) Таким образом, VMR-9 всегда выбирает контакт 0 для размера целевого образа и PAR.
  • В режиме смешивания RGB vmr выбирает поток с наибольшим размером изображения. Если их несколько, выбирается один из них с наибольшим z-порядком; а если привязка все еще есть, она выбирает поток с наименьшим числом контактов.

Примеры операций

Пример 1. Поток 0 имеет размер 720 x 480 пикселей с пропорциями изображения 16:9. Поток 1 — это 640 x 480 пикселей с пропорциями изображения 4:3.

В этом примере поток 0 имеет наибольший размер изображения, поэтому VMR выбирает этот поток независимо от режима смешивания RGB или режима смешивания YUB. Par имеет значение 32:27 (16:9 / 720:480), то есть изображение должно быть растянуто по горизонтали в соответствии с этим соотношением, чтобы получить правильное соотношение сторон изображения 16:9.

Чтобы соответствовать целевой паре, микшер VMR масштабирует поток 1 по обратному соотношению (27:32), что приводит к созданию изображения 540 x 480. Затем два потока композитируются на одну поверхность. Для правильного отображения полученного изображения выступающий распределитель должен растянуть изображение по горизонтали в соответствии с пропорциями изображения 16:9.

Пример 1.

Пример 2. Поток 0 имеет размер 720 x 480 пикселей с пропорциями изображения 16:9. Поток 1 — это 1024 x 768 пикселей с пропорциями изображения 4:3.

Если VMR-9 использует режим смешивания YUV, он всегда выбирает поток 0. Таким образом, он растягивает поток от 1 до 540 x 480 пикселей, чтобы соответствовать PAR потока 0.

Если VMR-9 использует режим смешивания RGB, он выбирает поток 1 в качестве целевого объекта, так как этот поток имеет наибольший размер изображения. Он растягивает поток 0 до размера изображения 1024 x 576 пикселей. Обратите внимание, что в этом случае составное изображение имеет значение PAR 1:1, поэтому распределитель-выступающий не должен исправлять некверные пиксели. (Возможно, потребуется растянуть видео, чтобы учесть прямоугольник назначения.)

Использование режима некверного смешивания

Режим некверного смешивания рекомендуется использовать, если выполняется одно из следующих условий:

  • Приложение никогда не отправляет более одного видеопотока в VMR-9.
  • Приложение отрисовывает файлы DVD, телевизора или ms-dvr. В этом случае также следует использовать режим смешивания YUV, если его поддерживает графическое оборудование.

Если приложение смешивает несколько видеопотоков, которые могут иметь различные размеры изображения или пропорции пикселей, рекомендуется использовать режим смешивания квадратов по умолчанию.

Чтобы настроить режим неквадратного смешивания, необходимо остановить граф фильтра и отключить все входные контакты на VMR-9. Затем вызовите IVMRMixerControl9::SetMixingPrefs с флагом MixerPref9_NonSquareMixing:

DWORD dwPrefs;
pMixControl->GetMixingPrefs(&dwPrefs);  
dwPrefs |= MixerPref9_NonSquareMixing;
pMixControl->SetMixingPrefs(dwPrefs);

Примечание

При объединении флага MixerPref9_NonSquareMixing с флагом MixerPref9_ARAdjustXorY VMR-9 игнорирует флаг MixerPref9_ARAdjustXorY.

 

Если в приложении используется пользовательский распределитель-выступающий с режимом некверного смешивания, имейте в виду, что составное изображение может иметь некверную par. Выступающий-распределитель должен масштабировать изображение до квадрата (1:1) PAR.

Статические растровые изображения

Если вы используете интерфейс IVMRMixerBitmap9 для смешивания статического растрового изображения с видео, следует рассматривать его как второй видеопоток для режима смешивания VMR.

VMR рассматривает растровое изображение как имеющее тот же PAR, что и целевой объект. Он не масштабирует растровое изображение в соответствии с пропорциями пикселей целевого объекта. В конфигурации vmr по умолчанию целевой объект имеет par 1:1, который соответствует большинству растровых изображений. В режиме неквадратного смешивания целевой объект может иметь некверные пиксели. Чтобы убедиться, что растровое изображение отображается правильно, приложение должно предоставить изображение, par которого соответствует целевому PAR.

Использование режима смешивания VMR