Pull to refresh

Изменение библиотеки libdc1394 для поддержки нужной камеры

Reading time3 min
Views2K
Когда разговор заходит о свободном программном обеспечении, то одним из аргументов «за» является возможность самому вносить изменения в код. Мне лично кажется, что конечного пользователя такая возможность волнует мало. И дело может быть не только в отсутсвии навыков программирования, но и просто в непонимании, что это возможно.

В этой статье я кратко опишу свой опыт «допиливания» библиотеки libdc1394 под себя, а вернее под ту камеру, с которой я работаю. Предполагаю, что статья может быть интересна тем людям, которые еще сами никогда ничего не подправляли в сторонних библиотеках и тем, кому приходится иметь дело с firewire камерами в линуксе.

Виновник торжества — инфракрасная камера А40 фирмы «Флир». Камера подключается к компьютеру по интерфейсу IEEE 1394 (далее firewire). Производитель предлагает драйвера под Виндоуз, но не поддерживает Линукс. При подключении к компьютеру можно убедиться, что камера «видна» системе, но работать с ней можно только на низком уровне.

Библиотека libdc1394 предоставляет высокоуровневые функции для работы с камерой в линуксе и поддерживает любые камеры, которые следуют спецификации IIDC/DCAM. С использованием этой библиотеки написанные многие программы, работающие с камерами. Именно это библиотека «не видит» подключенную камеру А40. Поэтому первой задачей является опредилить симптомы и возможности. Что же мы можем узнать о камере?

Логично проверить камеру на соответствие спецификации. Причем лучше всего это сделать своими руками, а не доверять библиотеке. Для этого используется программа gscanbus и текст спецификации. В первую очередь я попытался прочесть название камеры и производителя из ПЗУ. Информация в ПЗУ хранится блоками по 32 бита или, другими словами, квадлетами (4 байта). Смещения адресов тоже указанны в квадлетах. По началу это сбивает с толку. Например, если мы прочитали значение a, которое является смещением, то, чтобы его применить в программе gscanbus, надо к базовому адресу прибавить значение 4*a.

После успещного считывания названия камеры и производителя стало очевидно, что камера хоть как–то, но соответствует спецификации IIDC 1.30. И тут возникает закономерный вопрос — почему же тогда библиотека libdc1394 не может работать с этой камерой? Спецификация определяет несколько точных значений. Эти значения проверяются библиотекой libdc1394 при переборе камер, подключенных к компьютеру. Одно из таких значений — unit_spec_ID, равное 0x00A02D. У камеры А40 unit_spec_ID равен 0x407F. Зная это, программисту надо изменить проверяемое условие в библиотеке, и вот она уже видит подключенную камеру.

Аналогичная процедура исследования проводится с поддерживаемыми форматами. Подопотная камера возврашала нули для поддерживаемых форматов и ошибку для неподдерживаемых. По спецификации нули обозначают отсутствие поддержки.

После изменения всех if'оф оказалось, что картинка приходит, но «битая».
битая картинка с инфракрасной камеры

Опрос знакомых и гугл не смогли мне ничем помочь. Работа с камерой по firewire в линуксе не слишком популярная тема. Стоит добавить, что я видел как эта камера работала под линуксом на одном компьютере. К сожалению, у меня не было к нему доступа, я не мог сравнить конфигурации и мне приходилось изобретать велосипед. Но я был уверен, что велосипед возможно изобрести и что он будет ездить!

На этом этапе мне пришлось детально изучить работу libdc1394 на основе ее исходников. И в какой–то момент я обратил внимание то ли на размер пакетов, получаемых от камеры, то ли я вглядывался в содержимое получаемого изображения в шестнадцетиричном редакторе и что–то заподозрил и обратился к размерам пакетов. Оказалось, что камера, кроме данных самой картинки, отправляет еще 40 дополнительных байтов. В этот момент все стало ясно. Перед тем как отправить кадр пользователю необходимо пройтись по пакетам, из которых состоит кадр, удалить лишние 40 байт из каждого пакета и собрать все воедино. В результате получаем изображение.
правильное изображение с инфракрасной камеры

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

К сожалению разработчики библиотеки libdc1394 не хотят поддерживать камеры, не отвечающие полностью спецификации. Мои предложения добавить изменения к официальному коду были проигнорированы. А это значит, что при выходе новой версии библиотеки, может сильно измениться ее интерфейс и поддержку камеры придется вносить заново.

В завершении хочется выразить «фи» компаниям производителям, которые не следуют спецификациям и стандартам. А также желаю удачи всем, кто столкнется с трудностями при работе с видео в линуксе. Помните, что если ваша камера «не может быть найдена», то возможно вы все–таки сможете с ней работать после внесения изменений в библиотеку libdc1394.

UPD. Перенес в «Linux для всех».

UPD 1. Надежный Швейцарский хостинг Origo приказал долго жить. К сожалению оригинальная вики–страница не сохранилась, но на гитхаб выложен сам пачт libdc1394-flir
Tags:
Hubs:
Total votes 54: ↑48 and ↓6+42
Comments15

Articles