Как я перевернул изображение с веб-камеры в Linux из песочницы
Не секрет, что поддержка мультимедиа в Linux сильно прогрессировала за последнее время, но все же остается множество устройств, которые работают некорректно. Бывает, что баг висит в баг-репорте месяцами и никто не обращает на него внимания, а бывает и так, что все решается тонкой настройкой конфигов: разработчики драйверов обычно считают, что если проблема исправляется с помощью хитрых настроек, то это не проблема. И в чем-то я с ними согласен — Unix-way.
На днях я столкнулся с ноутбуком ASUS K52D и установил на него Arch Linux. По-моему, это лучший выбор для тех, кому нравится KISS и бесит Network Manager. Да и какая разница — окружение и ядро везде одно. Впрочем, у меня заработало абсолютно все из коробки, но изображение с веб-камеры было перевернуто по вертикали и горизонтали(проверял в Skype, mplayer и Cheese). Камера от Sonix Technology на шине USB, а поэтому использует драйвер UVC. К слову, на многих ноутбуках от ASUS, Dell, Lenovo, Acer, HP, Fujitsu и т.д. используется камера на шине USB, а поэтому все они будут использовать USB Video Class Video Driver. Благо, он давно есть в ядре.
В списке поддерживаемых устройств драйвером обнаружил, что у меня есть два варианта: либо каждый раз переворачивать ноутбук, либо отстроить прослойку V4L2, которая будет программно переворачивать изображение. Цитирую: «For applications that don't use libv4l, try holding your computer upside-down.» Немножко погуглил в сторону libv4l. Оказалось, что есть люди, которые используют даже xrandr -o! Есть патчи для UVC, но они мне показались неоправданными, ведь у нас есть и рабочий драйвер и userspace-приложение. Как я понял, единственное красивое решение в случае с нашим драйвером — это настройка libv4l с помощью гуевой v4l2ucp и запуск приложения после LD_PRELOAD.
Здесь все достаточно просто. Нужно установить пакеты с libv4l и с v4l2ucp. После установки у вас должны быть бинарники v4l2ucp, v4l2ctrl и библиотека v4l1compat.so. Если это имеется, то вы установили нужные пакеты. Если не ясно, где лежит библиотека, то она без труда найдется find'ом:
В Arch Linux она лежит в /usr/lib/libv4l/v4l1compat.so.
Далее нужно запустить v4l2ucp и поставить там галочки напротив vflip/hflip, а также можно поиграться с яркостью, контрастом и прочими интересными штучками. После чего можно запускать, например, любимый Skype следующим скриптом:
LIBV4LCONTROL_FLAGS — по названию понятно, добавлю только, что эта опция влияет на значения vflip и hflip, а разработчики пишут, что «is for debugging purposes only». По своим наблюдениям я понял, что ее значение должно быть равно 1, чтобы корректно обрабатывались опции flip из v4l2ucp. Хотя значение 3 у меня выполняло vflip без всяких v4l2ucp, но такое решение мне не нравилось — в v4l2ucp есть куча других настроек, которые многие будут использовать. Играться с флагами куда менее удобно в случае с камерой.
И чтобы все это работало после перезагрузки, нужно сохранить текущие настройки в файл, который будем загружать перед стартом приложения.
И наш скрипт можно модернизировать:
Все готово. Такой вариант должен помочь со многими «перевернутыми» камерами UVC. Да и вообще с любыми дефектами ориентации, цвета, чувствительности.
Частая проблема этого решения — отсутствие опций vflip/hflip в v4l2ucp. На форумах я не раз видел, что у некоторых нет этих опций по непонятным причинам, хотя камера поддерживается и никакой информации от разработчиков нет.
У меня тоже сразу не было этих опций. Дело оказалось в том, что libv4l берет информацию о камере через DMI, причем не через обычный dmidecode, а через sysfs! Сразу наводит на мысли о неверной конфигурации ядра.
Поэтому в ядре кроме
должен быть и
На самом деле в Arch Linux по умолчанию эта опция включена, а я использовал свой старый конфиг.
Суть проблемы
На днях я столкнулся с ноутбуком ASUS K52D и установил на него Arch Linux. По-моему, это лучший выбор для тех, кому нравится KISS и бесит Network Manager. Да и какая разница — окружение и ядро везде одно. Впрочем, у меня заработало абсолютно все из коробки, но изображение с веб-камеры было перевернуто по вертикали и горизонтали(проверял в Skype, mplayer и Cheese). Камера от Sonix Technology на шине USB, а поэтому использует драйвер UVC. К слову, на многих ноутбуках от ASUS, Dell, Lenovo, Acer, HP, Fujitsu и т.д. используется камера на шине USB, а поэтому все они будут использовать USB Video Class Video Driver. Благо, он давно есть в ядре.
Найденные решения
В списке поддерживаемых устройств драйвером обнаружил, что у меня есть два варианта: либо каждый раз переворачивать ноутбук, либо отстроить прослойку V4L2, которая будет программно переворачивать изображение. Цитирую: «For applications that don't use libv4l, try holding your computer upside-down.» Немножко погуглил в сторону libv4l. Оказалось, что есть люди, которые используют даже xrandr -o! Есть патчи для UVC, но они мне показались неоправданными, ведь у нас есть и рабочий драйвер и userspace-приложение. Как я понял, единственное красивое решение в случае с нашим драйвером — это настройка libv4l с помощью гуевой v4l2ucp и запуск приложения после LD_PRELOAD.
libv4l, v4l2ucp
Здесь все достаточно просто. Нужно установить пакеты с libv4l и с v4l2ucp. После установки у вас должны быть бинарники v4l2ucp, v4l2ctrl и библиотека v4l1compat.so. Если это имеется, то вы установили нужные пакеты. Если не ясно, где лежит библиотека, то она без труда найдется find'ом:
find /usr/lib -name 'v4l*'В Arch Linux она лежит в /usr/lib/libv4l/v4l1compat.so.
Далее нужно запустить v4l2ucp и поставить там галочки напротив vflip/hflip, а также можно поиграться с яркостью, контрастом и прочими интересными штучками. После чего можно запускать, например, любимый Skype следующим скриптом:
#!/bin/bash
export LIBV4LCONTROL_FLAGS=1
LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so /usr/bin/skype
LIBV4LCONTROL_FLAGS — по названию понятно, добавлю только, что эта опция влияет на значения vflip и hflip, а разработчики пишут, что «is for debugging purposes only». По своим наблюдениям я понял, что ее значение должно быть равно 1, чтобы корректно обрабатывались опции flip из v4l2ucp. Хотя значение 3 у меня выполняло vflip без всяких v4l2ucp, но такое решение мне не нравилось — в v4l2ucp есть куча других настроек, которые многие будут использовать. Играться с флагами куда менее удобно в случае с камерой.
И чтобы все это работало после перезагрузки, нужно сохранить текущие настройки в файл, который будем загружать перед стартом приложения.
v4l2ucp -s ~/v4l2_settingsИ наш скрипт можно модернизировать:
#!/bin/bash
v4l2ctrl -l ~/v4l2_settings
export LIBV4LCONTROL_FLAGS=1
LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so /usr/bin/skype
Все готово. Такой вариант должен помочь со многими «перевернутыми» камерами UVC. Да и вообще с любыми дефектами ориентации, цвета, чувствительности.
В заключение о проблемах
Частая проблема этого решения — отсутствие опций vflip/hflip в v4l2ucp. На форумах я не раз видел, что у некоторых нет этих опций по непонятным причинам, хотя камера поддерживается и никакой информации от разработчиков нет.
У меня тоже сразу не было этих опций. Дело оказалось в том, что libv4l берет информацию о камере через DMI, причем не через обычный dmidecode, а через sysfs! Сразу наводит на мысли о неверной конфигурации ядра.
Поэтому в ядре кроме
CONFIG_VIDEO_V4L2_COMMON=y
CONFIG_VIDEO_V4L2_SUBDEV_API=y
CONFIG_VIDEO_V4L2=y
CONFIG_V4L_USB_DRIVERS=yдолжен быть и
CONFIG_DMIID=y, т.е. Firmware Drivers -> Export DMI identification via sysfs to userspace.На самом деле в Arch Linux по умолчанию эта опция включена, а я использовал свой старый конфиг.

комментарии (26)