Повесть о настоящих линуксоидах

с элементами квеста

Все началось с того, что мне, для тестирования разрабатываемого программного продукта, понадобилась простенькая Web-камера. Заказывать такую камеру на работе - долго и хлопотно, проще самому купить, так что в выходные я отправился на соседний радио-рынок. Ларек, в котором торговали дешевыми китайскими мышками, клавиатурами и Web-камерами, нашелся довольно быстро. Услышав вопрос, поддерживают ли эти Web-камеры Linux, продавец посмотрел на меня испуганно. Впрочем, поддержка Linux мне не требовалась, а вопрос я задал скорее из любопытства. Ладно, решил я вслух, уж под Windows они точно будут работать (продавец энергично закивал головой)...

Рассматривая купленный девайс, я понял, что приобрел действительно безымянную Web-камеру. Коробку с устройством украшала единственная глубокомысленная надпись: «Digital USB PC Camera». К чему относилось прилагательное «digital», я так и не понял, - то ли к PC, то ли к Camera, а может и к USB. Внешне устройство напоминало вражеский самолет-диверсант – никаких опознавательных знаков на корпусе. Только один из винтов был заклеен голографической наклейкой, что, видимо, символизировало гарантийные обязательства, взятые на себя неизвестным изготовителем. Кроме самой камеры в коробке я нашел мини-диск. Надпись на мини-диске гласила, что на него можно записать 255 мегабайт данных или 25 минут музыки. Оставалось надеяться, что там записаны драйверы, а не музыка. Ни о каких инструкциях и описаниях, разумеется, речи не шло. Придя домой, я воткнул камеру в компьютер и выяснил, наконец, что стал обладателем устройства под названием Vimicro ZC0301PLH. Система Windows XP обнаружила драйверы на мини-диске и установила их, после чего заявила, что новое устройство работать не может. Для того чтобы камера заработала, пришлось перезагружать ОС и переустанавливать драйверы. Я получил все, что мне было нужно, но, вспомнив разговор с продавцом, решил проверить, будет ли камера работать с Linux.

Сначала мне показалось, что на подключение нового девайса компьютер с Kubuntu не отреагировал вообще. Однако когда я заглянул в директорию /dev/, то с удивлением обнаружил новое устройство - /dev/video0. Прошу заметить, что ни перезагрузок системы, ни закачек дополнительных модулей из репозитория Kubuntu для установки нового устройства не потребовалось. При этом никакие устройства видео-захвата на данном компьютере ранее не устанавливались. Вот он, настоящий Plug and Play! Дрожащими от нетерпения руками я запустил программу VLC из командной строки и уже через несколько минут мог смотреть транслируемое камерой видео с любого компьютера локальной сети (с помощью MPlayer или все той же VLC). Для тех, кого интересуют технические подробности моего эксперимента, привожу текст команды запуска VLC в режиме трансляции видео с устройства /dev/video0:

vlc -vvv -I rc v4l:// :v4l-vdev="/dev/video0" :v4l-norm=3
    :v4l-frequency=-1 --sout '#transcode{vcodec=mpgv,vb=3000,ab=256,venc=ffmpeg{keyint=80,hurry-up,vt=800000},deinterlace}:std{access=http,mux=ts,dst=192.168.1.36}'
    --ttl 4

Где 192.168.1.36 – адрес узла-источника видео. В результате видео поток можно смотреть в любом способном к этому плеере, введя URL http://192.168.1.36:8080 И так, что же это, товарищи, получается? В системе Windows, для которой производитель, вроде бы, специально обеспечил поддержку своего устройства, камера установилась довольно криво, а в Linux, для которой официальная поддержка отсутствует, - заработала сразу, без всяких дополнительных усилий, как это принято теперь говорить, «прямо из коробки».


Изображение с видеокамеры в окне VLC for Linux

Откуда дровишки?

Желая выяснить происхождение столь замечательных драйверов для Linux, я погрузился в Интернет. Нельзя не отметить некоторую иронию ситуации – обычно поиском драйверов занимаются тогда, когда какое-то устройство отказывается работать, я же начал искать источник драйверов именно потому, что все заработало лучше, чем я ожидал.

Мои поиски вывели меня на группу GSPCA, занимающуюся разработкой драйверов Web-камер для Linux. Официальной страницей проекта, как я понимаю, является страница его руководителя Мишеля Ксарда (mxhaard.free.fr). Список оборудования, поддерживаемого на данный момент, вы можете найти на странице http://mxhaard.free.fr/spca5xx.html. (там я нашел и свою модель). К сожалению, информация из этого списка не всегда может помочь вам с выбором Web-камеры, поскольку многие производители (как это было и в моем случае) не снабжают свои устройства сопроводительной информацией.

GSPCA – не единственная группа, которая занимается разработкой драйверов для USB-устройств видео-захвата. Важную роль в этой работе играет так же Linux UVC (http://linux-uvc.berlios.de).

UVC (USB Video Class) – это спецификация, описывающая единый интерфейс для различных устройств (Web-камер, камкордеров и т.п.), передающих или принимающих видео-поток по шине USB. Для того чтобы понять, как повсеместное распространение устройств UVC может изменить нашу жизнь, следует вспомнить ситуацию с фотокамерами и аудио-плеерами, подключаемыми к компьютеру с помощью USB. Еще 5-6 назад каждое такое устройство поставлялось с собственным набором драйверов и программ, которые позволяли перекачивать данные с устройства на компьютер и обратно. Сейчас, как вы конечно, знаете, ситуация коренным образом изменилась. Любой современный фотоаппарат или плеер, наделенный интерфейсом USB, воспринимается компьютером как внешний диск. Никаких специальных драйверов для подключения такого устройства к компьютеру не требуется, а передача данных выполняется с помощью стандартного файл-менеджера. Все это стало возможным благодаря тому, что современные USB-устройства, хранящие информацию в виде файлов (будь то плеер, фотокамера, «флешка», или внешний дисковод), поддерживают единый стандарт, описанный в спецификации USB Mass Storage Specification. UVC должна стать для USB-устройств, генерирующих видео-потоки (и принимающих видео-потоки, создаваемые компьютером), тем же, чем UMS стала для устройств, хранящих данные. Когда UVC получит повсеместное распространение, для подключения всех USB-устройств видео-захвата и видео-вывода будет достаточно одного общего UVC-драйвера. Пока же разные устройства продолжают использовать «фирменные» интерфейсы, работа группы GSPCA не теряет актуальности.

Драйверы устройств видео-захвата основаны на системе V4L (Video for Linux), которая реализована в модуле ядра videodev и вспомогательных модулях. В настоящее время драйверы разрабатываются для интерфейса V4L2, хотя старый интерфейс V4L1 сохранен ради обратной совместимости. Для того чтобы ваша система могла работать с камерами, для которых существуют драйверы GSPCA, в ней так же должен быть установлен модуль gspca. Именно благодаря наличию этого модуля в ядре Kubuntu моя Web-камера заработала «сама собой», сразу после подключения. Для поддержки устройств UVC требуется, соответственно, модуль uvc.

Web-камера с точки зрения программного обеспечения

Мы не будем углубляться в детали устройства USB Web-камер, рассмотрим только те параметры, которые влияют на выбор программного обеспечения, обслуживающего устройство. С точки зрения подбора драйвера важнейшим компонентом камеры является чип моста USB (USB bridge). Именно этот чип обеспечивает взаимодействие камеры с шиной USB вашего компьютера. Например, сочетание ZC0301PLH в названии купленной мной камеры указывает на микросхему моста USB (говоря точнее, в данном случае микросхема выполняет всю обработку видео данных, начиная с опроса состояния матрицы CMOS и заканчивая сжатием данных и отправкой их по шине USB). К счастью для разработчиков драйверов, оригинальных чипов для USB-мостов существует не так уж много. Камеры разных производителей зачастую оснащаются одними и теми же чипами, что позволяет использовать для них одни и те же (или незначительно модифицированные) драйверы. Второй важный компонент – датчик и изображения (image sensor). Казалось бы, этот элемент камеры не имеет прямого отношения к драйверам, однако разработчикам последних приходится учитывать протокол управления сенсором, используемый камерой. С точки зрения драйверов и прикладного программного обеспечения важную роль играет формат, в котором камера передает видеоданные. Некоторые камеры передают видео в форме несжатого потока, другие камеры сжимают отдельные кадры в формате JPEG или используют один из форматов MPEG для передачи видео.

Как видим, с драйверами для Web-камер у Linux нет проблем. С прикладным ПО дела обстоят ничуть не хуже. Лично я для работы с Web-камерой воспользовался программой VLC. Эта кросс-платформенная программа позволяет просматривать видео, переданное камерой (так же как и видео из других источников) и сохранять видео на диске. Кроме того VLC можно использовать как сервер и клиент для передачи видео по локальной сети. Список программ, которые могут заинтересовать тех, кто работает с Web-камерами, можно найти, например, на станице http://linuxtv.org/v4lwiki/index.php/Streaming.

Слово разработчику

Как и во многих других Linux-проектах, в группе GSPCA трудятся и наши соотечественники. Один из них, Сергей Сучков, любезно согласился ответить на наши вопросы.

Как Вы пришли к разработке драйверов для Web-камер, что Вами движет? Ведь вряд ли производители этих устройств станут когда-нибудь спонсировать Вашу работу.
Однажды купил web-камеру которая не поддерживалась в Linux. Так как на десктопе и ноутбуке я ничего, кроме Linux не использую c 1995 года пришлось разбираться с драйвером (вот он, путь настоящего линуксоида! – А.Б.). GSPCA (в то время он еще назывался spca5xx) оказался самым простым в модификации исходного кода. Сам по себе код GSPCA имеет очень длинную историю и в нём отметилось более 200 разработчиков. Сначала мной двигало просто желание заставить работать новую железяку а потом уже любопытство. Мою работу никто не спонсирует, но, насколько я знаю, некоторые разработчики довольно тесно контактируют с производителями железа или даже являются штатными сотрудниками таких компаний.

Я обнаружил, что установить web-камеру, даже «безымянную», под Linux проще, чем под Windows. Как вы можете это объяснить?
Дело в различных концепциях поддержки железа в Linux и в Windows. В Windows обычно производитель железа отдельно прилагает драйвер для того или иного девайса. Эти драйвера пишутся либо программистами самой компании, либо аутсорсерами (что бывает гораздо чаще) по спецификациям, предоставляемым производителем железа. В Linux это не гарантировано (хотя в последние несколько лет всё больше производителей железа кроме драйверов для Winddows стали предоставлять и драйвера для Linux). В этом плане GSPCA (который кстати пока не является частью ядра) представляет собой «комбайн» который одновременно поддерживает более 250 различных web-камер и развивается одной командой. Кроме GSPCA есть еще несколько аналогичных проектов по поддержке web-камер в Linux. Например, UVC Linux поддерживает web-камеры, соответствующие спецификации UVC. Поэтому вероятность получить поддержку популярной web-камеры «из коробки» в Linux весьма высока. Ну и потом web-камеры «безымянны» только для конечного пользователя. Внутри них находятся вполне конкретные наборы системной логики (т.н. USB bridge) и сенсоры вполне конкретных производителей данных компонентов, которые производитель web-камеры собрал в единое целое и поставил (или не поставил) на ней свою торговую марку.

По мнению многих разработчиков, написать драйвер для Linux проще, чем для Windows. Так ли это?
В общем — да. Есть особенности и для той и для другой системы, но Linux в этом плане проще (по крайней мере, для меня).

Что самое трудное в разработке драйверов для Web-камер?
Сейчас это в основном отсутствие спецификаций на протокол управления тем или иным сенсором и на закрытые форматы кодирования видеоданных при передаче (хотя в настоящее время с большинством таких форматов уже разобрались).

Каким образом вы получаете технические сведения о камерах, для которых пишутся драйверы?

Во-первых, реверс-инжиниринг(RE) USB протокола «общения» web-камеры и компьютера (т.н. USB snoop) под Windows. Во-вторых - анализ полученных данных и сравнение с существующими драйверами. Иногда удаётся получить спецификации (от производителей – А.Б.).

Приходится ли дизассемблировать драйверы для Windows?
Сами драйверы лично я никогда не дизассемблировал.

Какого уровня разработчики требуются в вашу группу? Если с вами захочет сотрудничать человек, который хорошо знает C/C++, знаком с основными классическими алгоритмами, писал прикладные программы для Linux, но не имеет опыта разработки драйверов, вы найдете для него задачу?
Конечно. Писать драйвера не так сложно как это кажется на первый взгляд. Разумеется придётся немного разобраться в архитектуре ядра. Не обязательно во всей, но в основных моментах, плюс, разумеется, в тех подсистемах с которыми придётся работать непосредственно. Основных проблем у разработчиков GSPCA как бы две (ImHO): Отсутствие свободного времени и отсутствие всего спектра поддерживаемого железа у разработчиков для тестирования новых возможностей или при изменении архитектуры драйвера (обратная сторона поддержки >250 камер).

Предположим, я – производитель ноутбуков. Я хочу предустанавливать Linux на свою продукцию. При этом я строго соблюдаю законы, охраняющие права интеллектуальной собственности, поэтому я не устанавливаю такие программные продукты, как, например, MPlayer. Есть ли в наборах ваших драйверов нечто такое, что помешало бы сверх-осторожному производителю железа предустанавливать их на свою продукцию в России или за ее пределами?
Это зависит от законодательства конкретной страны. В некоторых странах RE разрешён в некоторых нет. AFAIK RE в России (как и в Европе) явно не запрещён. Но это, в общем, довольно легко обойти чисто технически. Данные полученные посредством RE можно сделать «загружаемыми», как это, например, делается для firmware в некоторых устройствах. На мой взгляд, каких-то серьёзных юридических проблем для производителя ноутбуков это не представляет. Всегда есть возможность договориться с производителем того или иного компонента, тем более что таких конкурирующих производителей десятки.

На мой взгляд, за последние 2-3 года поддержка мультимедиа-технологий в Linux заметно улучшилась. Какой вклад в это внесли разработчики ядра, и какой – разработчики других компонентов системы?
Сложно назвать точный процент находясь «внутри». И те и другие работают.

Несколько лет назад часто говорили о том, что основной причиной невысокой популярности Linux на десктопах является отсутствие необходимых драйверов, кодеков и тому подобного. Сейчас ситуация существенно изменилась: и драйверы и кодеки, вроде бы, есть, но Linux на десктопах по-прежнему – редкость. В чем, на Ваш взгляд, причина такого положения дел?
Причины, скорее всего, в большей степени нетехнического характера. Если говорить о ситуации в мире вообще, то большая часть компьютеров сейчас используется с предустановленной системой и массовый пользователь относительно нечасто (в своей массе) занимается установкой системы. Кроме того есть исторический фактор обратной совместимости (то же самое было при переходе от DOS к Windows 3.x а затем с Win16 на Win32). Конечный пользователь привык к некоторому набору используемых им программ и ему не так уж и просто перейти даже на хороший функциональный аналог.

Послесловие

Итак, на сегодняшний день поддержка драйверов Web-камер (и видеокамер вообще) реализована в Linux на весьма достойном уровне. Если вы хотите организовать систему видеонаблюдения, транслировать живое видео или просто поболтать с друзьями по видео-телефону, ОС Linux готова придти вам на помощь. Тем не менее, проблемы с драйверами остаются и некоторые их этих проблем носят принципиальный характер. Речь идет о пресловутых патентах на технологии, используемые в драйверах. 

К сожалению, даже тогда, когда спецификация UVC получит повсеместное распространение, проблемы с правами интеллектуальной собственности не исчезнут. Практически все устройства видео-захвата используют сжатие данных. Проприетарные алгоритмы сжатия, и эти алгоритмы, прежде всего алгоритмы семейства MPEG-4, могут стать серьезным препятствием на пути распространения открытого ПО, предназначенного для работы устройствами видео-захвата. Проблема не в технической реализации. Когда Сергей Сухов говорит, что с основными форматами разработчики уже разобрались, он немного скромничает. На сегодняшний день Linux «разобралась» со всеми форматами, которые поддерживаются (или будут поддерживаться в ближайшее время) цифровыми видеокамерами. Декодирование MPEG-1,2,4, MJPEG, VYUV не представляет в Linux никаких проблем. Однако юридический статус открытых кодеков в большинстве стран не позволяет разработчикам железа предустанавливать их на свою продукцию. Эти ограничения пока что не актуальны для нашей страны, но и наш рынок не является ориентиром для ведущих производителей. В результате «самой предустанваливаемой» ОС в мире была и остается Windows, а пользователи, в большинстве своем, просто не готовы сносить с ноутбука «винду», за которую они все равно уже заплатили, и ставить вместо нее Linux. Неудивительно, что число тех, кто, как Сергей Сухов, пользуется на настольных компьютерах исключительно нашей любимой ОС, составляет около 3% от общего числа пользователей ПК. 

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

Отсутствие Linux на десктопах объясняется, на мой взгляд, отнюдь не только предубеждением пользователей и производителей железа. Предубеждение – слишком простое объяснение и слишком универсальное. Почему мало людей пользуется Макинтошами? Из-за предубеждения пользователей ПК – отвечают сторонники Маков. Если уж говорить о предубеждениях, препятствующих широкому распространению Linux среди рядовых пользователей, то следует коснуться и тех предубеждений, которые царят среди разработчиков Linux. Любопытна в этом смысле полемика, развернувшаяся некоторое время назад на форумах разработчиков V4L. Как уже отмечалось, в настоящее время для Linux существует две системы V4L – изначальная, названная позднее V4L1, и более новая V4L2. Первая версия V4L появилась в далеком уже 1999 году и неудивительно, что для нее разработано множество драйверов и прикладных программ. До сих пор далеко не все эти драйверы и программы портированы на V4L2, которая стала частью Linux, начиная с версии ядра 2.5 (экспериментальной). Особенно остро эту проблему почувствовали те, кто был вынужден пользоваться закрытыми драйверами, выпущенными производителями железа. По мере того как V4L2 набирала популярность пользователи начали требовать обеспечения обратной совместимости с V4L1. Позиция разработчиков V4L2 заключалась в том, что обратная совместимость не требуется. Новая версия V4L, не совместимая с прежней версией, будет стимулировать производителей оборудования писать открытые драйверы, а если некоторые производители не захотят этого делать, тем хуже для них. Излишне говорить, что применительно к драйверам такая модель обновления не очень подходит. Разработчики оборудования не так уж охотно пишут драйверы для Linux, а желающих обновлять драйверы для морально устаревшего (читай – уже распроданного) оборудования и вовсе немного. В конце концов здравый смысл победил и модуль v4l1 остался в ядре Linux, в «компактном» варианте, предназначенном для обеспечения обратной совместимости. Стоит отметить, однако, что группа UVC Linux разрабатывает свои драйверы и инструменты исключительно для V4L2. Те, кто хочет ознакомиться с полемикой между разработчиками UVC Linux и пользователями их продукции, могут почитать тред http://lists.berlios.de/pipermail/linux-uvc-devel/2006-February/000292.html. От себя добавим, что, вопреки предсказаниям разработчиков, модуль V4L1 до сих пор «живет» в новейших ядрах Linux. 

Таким образом, фанатичные приверженцы открытого ПО не только не считают отсутствие обратной совместимости интерфейсов модулей ядра недостатком, но даже видят в этой несовместимости хороший способ «перетряхивать систему», освобождая ее от закрытого и не развивающегося «балласта». Мнение же пользователей, которым удобство работы важнее, чем модель разработки, может категорически не совпадать с мнением разработчиков. Сторонники бескомпромиссной открытости победят только в том случае, если их идеи примут производители компьютерного оборудования. В противном же случае победа (по крайней мере, на десктопах) гарантирована другой ОС. 

Для Linux Format (вариант без правок), январь 2008

© 2008 Андрей Боровский


На главную