Записки разработчика RAW-обработчика

bug3.jpg Поправил сегодня серьезную багу в LibRaw, что заставило меня призадуматься о жизни. Если в подробностях, то:

  • У некоторых мыльниц (ряд моделей Nikon, Pentax, Samsung, Casio) режим RAW включается через инженерное (скрытое) меню.
  • В этих RAW нет никаких метаданных, а только данные с сенсора, обычно просто дамп байтов в каком-то некомпрессированном формате.
  • Метаданные сохраняются в JPEG-файле с обычным снимком, который записывается рядом (с тем же именем файла и другим расширением или же с другим номером файла).
  • В dcraw, а оттуда и в LibRaw есть поддержка этого составного формата: вычисляется имя файла, открывается, загружается EXIF.

И вот эта вот поддержка - категорически не работала. Даже хуже: наличие JPEG с метаданными приводило к неправильной распаковке собственно RAW, а отсутствие этого файла - к падениям.

Эта ошибка была начиная с LibRaw 0.0 и до сегодняшнего дня. И ни одна зараза - не заметила. Несмотря на то, что LibRaw уже несколько месяцев используется в digiKam и Krita, а у этих программ должны быть десятки тысяч пользователей, если не больше.

Надо сказать, что нужность этого режима у меня всегда вызывала сомнения. С одной стороны, это нужно для нескольких десятков камер. С другой - камеры все какие-то старые (кроме Samsung S85). С третьей - мне так и не удалось найти ни одного примера такого файла, поэтому это место оставалось неоттестированным.

А оттестировал я его сделав синтетический пример - RAW-данные от одного кадра Optio S4, JPEG (с балансом белого и прочим) - от другого. Тут то оно и вылезло.

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

Comments

А нельзя ли туда поставить типа заглушки такой, что мол, "есть такая (экспериментальная) фича в полуработающем состоянии. Доводить до ума кажется нецелесообразным, но выбрасывать жалко, поэтому ежель кому действительно надо - обращайтесь, подумаем что можно сделать"?

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

в режиме чтения потока дисаблить эту фичу

Ну оно так примерно и делается в новой версии (текущая вообще умеет только filename принять): появляется объект типа LibRaw_abstract_datastream, у него метод capabilities(), который возвращает то, что данный поток умеет. И в зависимости от capabilities - поддерживается этот внешний JPEG и еще одно место в распаковке данных от Sony (там нужна другая капабилитя).

Но это - это такой софтверный овердевелопмент на пустом месте, если бы нужна была только одна капабилитя для Sony - я бы ее спрограммировал другим способом (и, наверное, так и сделаю чуть попозже...)

картинка с тараканами суперская! :-))

Две ноги лишние у обоих.

Это не ноги, это руки.

Всё равно лишние :-)

ну так: картинка с багой

нет, это фича

неуместный вопрос
уже существует какой-нибудь рабочий продукт использующий LibRaw?

Re: неуместный вопрос
digiKam, Krita и что-то еще в KDE

Вот тут более-менее полный список
http://blog.lexa.ru/2008/09/16/libraw_055_i_libraw_060_beta2.html

Re: неуместный вопрос
угу спасибо, посмотрю

Re: неуместный вопрос
Если тебя интересует качество процессинга, то смотреть туда смысла нет.

Re: неуместный вопрос
вот так сразу мордой оПстол ;)

Убрать, я считаю. Тем более оно всё равно не работало :-)

Или, как вариант, вынести в отдельную утилиту, склеивающую нужную информацию воедино: те люди, которые включают raw у мыльниц через инженерное меню, явно простых путей не ищут, и вариант "перед конвертацией необходимо приклеить exif к raw-файлу при помощи такой вот утилиты" должен быть воспринят в целом нормально.

Я так понимаю, что "те люди" используют raw2dng (или как-то так называющуюся утилиту) и имеют счастье.
Какого-то другого универсального формата RAW нету (DNG тоже не сахар, но хоть что-то)

Убрать когда только-что положил в это место душевные силы с целью починки - обидно как-то. Тем более, что оно уже поехало в KDE интегрироваться

Вот поэтому и жалоб не было. То есть те кто пробовали - убеждались что не работает, думали "не судьба" (официально-то такого формата вообще не существует) и шли проторенной дорожкой.

А есть ещё опасение, что поскольку фича довольно маргинальная, тестироваться будет редко, и <i>уже</i> вызывает потребность делать хитровывернутый код, через пару лет она опять сломается, просто потому что вот-тут-вот переписали заново, а про эту фишку забыли. И самое обидное - этого опять никто не заметит :-)

Ну в предшествующих версиях digiKam (которая внешнюю утилиту dcraw звала) - оно работало скорее всего.

Тут скорее дело в другом - несмотря на то, что это все мыльницы (и их, типа, много), реально использующих такие хаки крайне мало, потому я и примеров не смог найти.
С CHDK оно не так - примеров сколько хочешь, у меня почти под все нужные мне камеры есть (кроме Canon A600, но это уж больно старая машинка)

Но вообще, мнение понятное.
Я в районе версии 0.8 попрошу Жиля (который libkdcraw делает из LibRaw) по-дефолту фичу выключить и проверить реакцию народа :)

Эта ошибка была начиная с LibRaw 0.0 и до сегодняшнего дня. И ни одна зараза - не заметила. Несмотря на то, что LibRaw уже несколько месяцев используется в digiKam и Krita, а у этих программ должны быть десятки тысяч пользователей, если не больше.

Алексей, LibRaw используется только в нестабильных версиях digiKam, которыми кроме разработчиков практически никто не пользуется. На днях вышла rc1 версии 0.10.0, а финальная 0.10.0 ожидается только в марте. Вот раньше марта отзывов ждать и не стоит :)

Это так осенью было. С тех пор поменялось.
Сейчас LibRaw 0.6.x - в стабильных ветках KDE3 и KDE4, а вот 0.7-я версия - в девелоперских.

Во всяком случае, Жиль мне на анонсы в 0.6-й версии отвечает "backported to KDE3 and KDE4"

Могу сказать вам ка пользователь формата рав через стороннюю прошивку фотика - это очень полезная вещь! Те кто не сталкивался с этой проблемой - этого просто не поймут! Было бы просто замечательно, если бы вы сказали, как воспользоваться данной функцией в dcraw?
Спасибо

Так так и пользоваться - подавать dcraw этот файл и до кучи с ним jpeg

Если dcraw -i -v нормально показывает выдержку и прочие метаданные - значит все работает.

Any well documented bug becomes a feature (C).