LibRaw+RawSpeed=LibRaw :)

RawSpeed - это такая библиотека раскодирования RAW, которая:
  1. Очень быстрая (к примеру, 21-мегапиксельный файл от Canon 5D2 распаковывается на моей машине за 230мс, а код на основе dcraw делает это за 750мс. Притом, это сильно улучшенный мной код, до улучшений было больше секунды, насколько я помню).
  2. Поддерживает мало форматов, правда все они популярные (свежие камеры Canon, Nikon, Olympus, Panasonic, Pentax, Samsung и DNG-файлы).
Авторы darktable давно просекли эту фишку и используют LibRaw как fallback на неизвестных камерах, а как основную библиотеку для открытия RAW - используют RawSpeed.

В то же время, RawSpeed распаковывает данные в буфер с очень похожим (но немного разным) форматом, поэтому использовать RawSpeed в качестве читалки файлов изнутри LibRaw (но иметь при этом единый API, единый постпроцессинг и т.п.) - было делом техники. И эта техника - применена в LibRaw 0.15-Alpha4.

Что получилось

  • LibRaw::open_file()+LibRaw::unpack() /т.е. распаковка/ - в ~3 раза быстрее на CR2, в ~2-2.5 раза быстрее на NEF, в 1.5-2 раза быстрее на прочих поддерживаемых форматах. Реально это заметно на больших NEF и CR2 (выигрыш в 400-500 миллисекунд на моей i7-2600K @4.5Ghz), соньки и раньше распаковывались быстро, а у остальных форматов редко бывают совсем уж большие файлы.
  • dcraw_emu -h ..список из 182 файлов.. - без RawSpeed было 150 секунд, стало 100 секунд. Разница "не в 2-3 раза" потому что постпроцессинг не изменился (хотя с -h он и так быстрый)

В чем разница

Выяснилось, что распаковка у RawSpeed - другая. Т.е. в комбинации распаковка+постпроцессинг побитовая разница получилась у 11 файлов (из 182), а если смотреть на RAW-данные без постпроцессинга, то разница будет еще и у кадров с Sony.

Значимой визуальной разницы (после постпроцессинга) увидеть не удалось, но это не означает, что ее вовсе нет, я просмотрел не все.

Разница заключается в:

  • Для форматов Sony: тоновая кривая построена так, что сразу умножает на 4 (давая "14-битный" диапазон).
  • Для форматов с тоновыми кривыми: тоновые кривые по коэффициентам строятся немного иначе (float/double и разное округление), что может давать дельту в младших битах.
Детали будут хорошо видны когда выйдет RawDigger с RawSpeed, там и разберемся.

Как использовать

  1. Надо собрать RawSpeed. Самостоятельно :). В поставке LibRaw есть три моих патча к этой библиотеке (подсчет процессоров на Unix, __declspec(..) для Windows-DLL, .pro-файлы для qmake) и README.RawSpeed, где чуть подробнее написано что, как и почему.
  2. LibRaw надо собирать с C-дефайном USE_RAWSPEED.
  3. Дальше все работает само (и если RawSpeed не шмогла что-то распаковать - делает fallback на LibRaw).
  4. Отключить на рантайме можно путем imgdata.params.use_rawspeed=0

Фидбеку мне, фидбеку!

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

Особенно интересны случаи всяких глюков, естественно.

Comments

а выложите сборку - а то нечем собирать

Я подумаю, но вообще альфы я в бинарном виде не выкладываю. Лови их потом по всему интернету....

Я новенький, правил не видел, простите, если что не так. Вопрос имеется. Беру сигнал с CCD матрицы от охранной видео-камеры , матрица SONY ICX405ak с CMYK фильтром, оцифровываю и пересылаю в компьютер. Подскажите, чем и как можно посмотреть этот снимок? Никакого заголовка нет (но могу приклеить), разрешение 500 на 582, 8 разрядов.

В теории, надо приклеить заголовок от DNG. С CMYK-фильтром, нежатое.
Adobe DNG SDK в руки и вперед...

Более простого способа я не знаю