Как я перевернул изображение с веб-камеры в 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

Здесь все достаточно просто. Нужно установить пакеты с 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 по умолчанию эта опция включена, а я использовал свой старый конфиг.
+45
2 сентября 2011, 02:37
51
Fillo 8,6

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

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
+1
Systerr #
С месяц назад встречал этот ноутбук и эту проблему с камерой. Мне до сих пор непонятно зачем же ставить камеру вверх ногами в ноутбуках, в чем плюшки такого решения? Судя по форумам с такой проблемой сталкиваются в пользователи windows, но там все решается правильным драйвером.
За статью спасибо, она пригодиться многим.
+3
nikitko #
Я где-то читал, что это не фича, а баг конвейера, где ноутбуки собирались.
После чего, были выпущены специальные драйвера для Win, переворачивавшие изображение обратно.
0
litos #
В некоторых ноутбуках камеру можно крутить вокруг оси и после переворота она будет показывать не человека за экраном, а то что перед экраном (не разу конечно таким не пользовался).
Соответственно в одном из положений изображение получается перевернутым.

Кстати, а нельзя ли пропатчить этот самый USB Video Class Video Driver на предмет перевернутого изображения, никто не пытался ковырять его, может быть там не все так уж и сложно?
0
anarsoul #
Я ковырял sn9c20x (который вырос в gspca_sn9c20x). Вебкамера обычно состоит из USB-бриджа и сенсора, у самого бриджа есть несколько gpio, через которые можно управлять LED-ами или опрашивать положение камеры. Соотв. в нём поддержка поворотов для некоторых моделей ноутов есть. У UVC должно быть что-то похожее, но чтобы реализовать эту поддержку нужна или инфа от разработчика бриджа, или реверсить виндовый драйвер (он обычно повороты обрабатывает корректно)
0
muromec #
UVC — это общий драйвер для usb video class, поэтому ничего про ноги кокретной карточки знать не может, он просто поддерживает определенный протокол, который реализуется видеокамерой.

соответственно через этот протокол сильно GPIO и не потыкаешь.
0
anarsoul #
Бриджу ничего не мешает реагировать на несовместимые с UVC control-реквесты на EP0 ;)
0
muromec #
>Бриджу ничего не мешает реагировать

… или не реагировать!
0
Fillo #
Патчи есть, но использование V4L — это более-менее гарантируемый результат, так пишут разработчики, а поэтому я и не стал ковырять патчи, которые непонятно кто писал.
–3
Fillo #
В Windows все решается прямо из скайпа без напильника, а в случае с ASUS K52D у меня вообще не было проблем.
+1
Sirix #
У меня к сожалению из скайпа не решилось, настройки камеры были просто заблокированы. Потратил кучу времени, чтоб найти подходящие дрова под семерку
–2
amaranth #
Спасибо. У меня на ASUS F7Z в Ubuntu 10.04 тоже присутствовала эта проблема. Просто я чаще использую Windows 7/
0
Squier #
Asus K50IJ
Создал кнопку на рабочем с командой env LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so skype
И мудрить не надо.
0
dgeliko #
Это относится не только к этому ноуту. У меня данная проблема была с камерой Microfost VX-3000, решил также, только чтоб не переправлять везде шоткаты и не править меню для всех юзеров, сделал так:

1. mv /usr/bin/skype /usr/bin/skype_real
2. touch /usr/bin/skype
3. echo «LD_PRELOAD=/usr/lib32/libv4l/v4l1compat.so /usr/bin/skype_real» > /usr/bin/skype
4.chmod +x /usr/bin/skype
5. ????
6. PROFIT!!!
+5
cronoc #
По просьбе одного_хорошего_человека, которого нет на хабре >>

«автор не умеет гугл юзать, ибо решение было давно. ещё в 2009 году. статья тут — code.google.com/p/irklug/wiki/NotebookAsusK50ab и сам код тут — code.google.com/p/irklug/source/browse/notebooks/asus-k50ab/camnormalize

P.S> правда я сам уже давно не использую этот костыль. ибо с версии 10.04 камера сама переворачивается :)»
+1
Fillo #
Да, это как-то просмотрел…

На самом деле я решил написать эту статью, потому что долгое время не мог понять, почему на моем собранном ядре ничего не работает, а на дефолтном работает. Потратил полдня и открыл для себя фичу про dmi identifivation via sysfs. Если говорить о моем оправдании, то об этом ничего не написано в том решении на гуглокоде. :)
+2
FSA #
Ну вот, ещё найти вменяемую инструкцию о том, как заставить встроенный микрофон нормально работать, в том числе работать после случайных падений PulseAudio, а также сделать чтобы при включении наушников отключались динамики. И наступит счастье :)
+2
Nebulosa #
А я столкнувшись с такой же проблемой, отписал о ней разработчику V4L2 и через пару дней была готова версия в которой для моего ноута переворачивалось изображение. Там, я так понял, есть некая таблица с чипами для которых нужно переворачивать изображение.
+1
MAXH0 #
ИМХО этому посту место где то в Welinux а не на Хабре — очень специфическая проблема и решение не оригинальное (без полета фантазии). Решения в коментах и то веселее.
+1
Fillo #
С камерой не специфическая проблема, у многих встречается такая. Как и драйвер — в основном везде UVC и GSPCA. Но если вы про DMI, то для меня это стало маленьким открытием. Чуть позже я нашел упоминание про это на одном из иностранных форумов в глубоких комментах, но больше нигде не встречал вообще.
0
scottKey #
В ~/.profile или в /etc/profile
LIBV4LCONTROL_FLAGS=1
LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so
export LIBV4LCONTROL_FLAGS LD_PRELOAD

В ~/fix
v4l2ctrl -l ~/v4l2_settings

при входе в систему подгружаем fix
И не нужно будет ничего править и ничего создавать

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.