Mon, 28 Jun 2004

CIFF parser

Митко Миладинов преди време се сдоби с Canon Powershot G3 и не след дълго по сензорите на апарата се появиха мъртви пиксели. Проблемът има чисто софтуерно решение като се интерполира стойността на мъртвия сензор от околните му събратя по цвят. Това беше и една от функциите на програмата dcraw.c на Дейв Кофин. Неприятното е, че на изхода си dcraw винаги дава PPM-файл, а ние си искахме CRW (оригиналният недокументиран суров формат, използван във фотоапаратите Canon), само че със замаскирани мъртви пиксели. В началото на годината с Митко чоплихме този проблем няколко дни, но без резултат.

Тази вечер захраних тялото и душата си с ракия, цаца и сладки приказки. Настаних се удобно пред компютъра и се гмурнах в дебрите на CRW. Прекарах в упорито четене на изходния код на libraw. Няколко пъти криввах по грешна посока и губех доста време, докато се върна на правия път. Все пак CIFF-структурите, изграждащи CRW не са чак толкова сложно нещо, но поне малко документация да имаше... Бе то било същото като TIFF, с тия особености, че вътре наподобява директорийна структура с разни оптимизации по нея. Представете си например такава файлова система, в която за по-кратко съдържанието на файла може да се запази върху самия директориен запис, ако дължината на файла не надвишава 8 байта. Примерно. (В TIFF ограничението е 4 байта.)

С учебна цел пренаписах и сглобих на Питон нещо средно между parse.c и libraw (само в частта им за Канон). Първите лъчи на слънцето завариха новородения парсер на CIFF. Задача номер едно е изпълнена -- изчитам целия CRW в структури от данни. (Да живее модула struct!) Като страничен ефект моят парсер генерира XML-файл представящ всички CIFF-структури. Не беше нарочно -- просто след няколко часа пред конзолата не намерих по-ефективен начин за dump на вложени структури. (Да, не ползвам дебъгер и искам да виждам структурите си черно на бяло.)

Следващите задачи са:

- разкомпресиране на суровото изображение

- интерполиране на мъртвите пиксели

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

- сериализация на структурите обратно в CRW

Чакат ме вълнуващи моменти! :-)

След няколко часа ще дойдат моите колеги за да започнем да мятаме нашия проект. А аз дотогава ще взема да ударя наколко остри кафета в главата си...