Введение

Механизм видеовывода для X Window System, веб-сайт с аналогичным названием.

Расширение X Video, часто сокращаемое как XVideo или Xv, является механизмом видеовывода для X Window System. Протокол был разработан Дэвидом Карвером; спецификация для версии 2 протокола была написана в июле 1991 года. В настоящее время он в основном используется для изменения размера видеоконтента непосредственно в аппаратном обеспечении видеоконтроллера, чтобы увеличить изображение или вывести его на весь экран. Без XVideo, X пришлось бы выполнять масштабирование на центральном процессоре. Это потребовало бы значительных вычислительных ресурсов, что могло бы замедлить или ухудшить качество видеопотока; видеоконтроллеры специально разработаны для подобных вычислений и могут выполнять их гораздо эффективнее. Аналогичным образом, расширение X Video позволяет видеоконтроллеру выполнять преобразование цветовых пространств, а также изменять контрастность, яркость и цветовой тон отображаемого видеопотока. Для этого необходимо сочетание трех факторов:

Во-первых, видеоконтроллер должен предоставлять необходимые функции. Во-вторых, программное обеспечение драйвера видеоконтроллера и программа сервера дисплея X должны реализовывать интерфейс XVideo. И, в-третьих, программное обеспечение для воспроизведения видео должно использовать этот интерфейс. Большинство современных видеоконтроллеров предоставляют функции, необходимые для XVideo; эта возможность известна как аппаратное масштабирование и ускорение YUV, или иногда как 2D-ускорение. Сервер отображения XFree86 X реализовал поддержку XVideo начиная с версии 4.0.2. Чтобы проверить, поддерживает ли сервер X-дисплея XVideo, можно использовать утилиту xdpyinfo. Для проверки наличия необходимых функций в видеоконтроллере и реализации XVideo в драйвере устройства можно использовать программу xvinfo. Программы воспроизведения видео, работающие в системе X Window, такие как MPlayer, MythTV или xine, обычно имеют опцию включения вывода XVideo. Настоятельно рекомендуется включить эту опцию, если аппаратное обеспечение GPU и драйверы устройств поддерживают XVideo, а более современные системы рендеринга, такие как OpenGL и VDPAU, недоступны – прирост производительности будет заметен даже на быстром процессоре. Хотя сам протокол предусматривает функции для чтения и записи видеопотоков с видеоадаптеров и на них, на практике сегодня используются только функции XvPutImage и XvShmPutImage: клиентская программа последовательно подготавливает изображения и передает их графическому оборудованию для масштабирования, преобразования и отображения.

Показать

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

Роль поддержки и компостирования менеджера окна

В X, то, как видео в конечном итоге отрисовывается, во многом зависит от используемого оконного менеджера X. При правильно установленных драйверах и графическом оборудовании, таком как поддерживаемые чипсеты Intel, ATI и nVidia, некоторые оконные менеджеры, называемые композитными оконными менеджерами, позволяют обрабатывать окна отдельно, а затем отрисовывать (или компоновать) их. Это подразумевает, что все окна сначала отрисовываются в отдельные выходные буферы в памяти, а затем объединяются для формирования полного графического интерфейса. Находясь в (видео) памяти, отдельные окна могут быть преобразованы независимо, и ускоренное видео может быть добавлено на этом этапе с использованием текстурного фильтра, прежде чем окно будет скомпоновано и отрисовано. XVideo также может использоваться для ускорения воспроизведения видео во время отрисовки окон с использованием OpenGL Framebuffer Object или pbuffer. Metacity, оконный менеджер X, использует композитинг таким образом. Композитинг также может использовать ускорение 3D-графических конвейеров, например, текстуру GLX EXT из pixmap. В частности, этот процесс позволяет нескольким видеовыходам совместно использовать один и тот же экран, не мешая друг другу. Другие композитные оконные менеджеры, такие как Compiz, также используют композитинг. Однако, на системе с ограниченной функциональностью ускорения OpenGL, особенно при отсутствии OpenGL Framebuffer Object или pbuffer, использование среды OpenGL, такой как Xgl, делает аппаратное ускорение xv невозможным.

Недостатки хрома-клавирования

В случае, если менеджер окон не поддерживает композитинг, сложнее определить, где именно должен быть отрисован видеопоток, поскольку к моменту аппаратного ускорения вывод уже преобразован в единое изображение. Обычно единственный способ решения этой задачи – использование пост-обработанного аппаратного оверлея с применением цветового ключа (хрома-ки). После отрисовки всех окон в нашем распоряжении остаются только размер и положение канвы видеоокна. Для определения видимой области видеоокна необходима дополнительная информация, указывающая, какие части канвы перекрыты другими окнами, а какие – нет. Поэтому видеоплеер отрисовывает канву сплошным цветом (например, зеленым), который фактически становится своеобразной третьей координатой. Когда все окна отрисованы, окна, перекрывающие видеоплеер, блокируют отображение зеленого цвета. При добавлении видеопотока к конечному изображению графический адаптер сканирует координаты канвы. Обнаружив зеленый цвет, он понимает, что нашел видимую часть видеоокна и отрисовывает только ее. Этот же метод был единственным доступным способом аппаратного ускорения видео в Microsoft Windows XP и более ранних версиях, поскольку функции управления окнами были настолько тесно интегрированы в операционную систему, что их ускорение было невозможным. Если менеджер окон не поддерживает композитинг, то использование пост-обработанных аппаратных оверлеев с цветовым ключом, как описано выше, может сделать невозможным создание корректных скриншотов приложений Xvideo. Также это может препятствовать отображению такого воспроизведения на вторичном дисплее, если на аппаратном уровне разрешено только одно оверлейное наложение.

Примеры программ

testxv.c: на большинстве установок он компилируется командой "gcc -o testxv testxv.c -L/usr/X11R6/lib -lX11 -lXext -lXv"
testxv2.cc: еще один пример на C++