LibRaw 0.14.0 (Release)

После двух недель тестирования, LibRaw 0.14 получила статус Release и рекомендована к использованию вместо старых версий.

В этой версии одно принципиальное изменение, влекущее за собой множество мелких:

Разрешены повторные вызовы постобработки (LibRaw::dcraw_process) без переоткрытия файла парой вызовов open()/unpack(). При этом, постобработку можно повторять меняя любые параметры обработки (за исключением выбора кадра через shot_select).

  • Новый пример samples/multirender_test.cpp показывает как использовать новые возможности.
  • Необработанные RAW-данные сохраняются в отдельном буфере (2 байта на пиксель для Байеровских изображений, 8 байт на пиксель для Foveon, sRAW и других полноцветных RAW). Как следствие, для байеровских изображений LibRaw требует на 25% больше памяти чем ранее.
  • Новый вызов LibRaw::raw2image() преобразует RAW-данные в старый формат imgdata.image Если вы используете LibRaw::dcraw_process или LibRaw::document_mode_processing(), вызывать raw2image() не нужно (и даже вредно), все будет сделано внутри функции постпроцессинга.
  • Новый вызов LibRaw::get_decoder_info() позволяет определить формат хранения RAW-данных (если вам нужен к ним доступ). См. samples/unprocessed_raw.cpp как пример использования.
  • LibRaw::adjust_sizes_info_only() может вызываться произвольное количество раз, втч. и вместе с dcraw_process()
  • Новый вызов LibRaw::free_image() Освобождает память, выделенную для imgdata.image. Может быть использован в случае, если обработанный битмэп более не нужен вызывающему приложению, однако время для уничтожения или recycle() объекта LibRaw еще не наступило, например может повторно быть вызвана функция постобработки dcraw_process()
  • Новые вызовы добавлены в C-API: libraw_raw2image() - аналог LibRaw::raw2image() libraw_free_image() - аналог LibRaw::free_image() libraw_get_decoder_info() - аналог LibRaw::get_decoder_info()
Если ваша программа использует обычный порядок вызовов open()/unpack()/dcraw_process(), то можно в ней ничего не менять и все будет работать как раньше. Однако для интерактивных программ, где параметры обработки меняются пользователем, можно пропустить вызовы open()/unpack() при повторной отрисовке и показать пользователю результат гораздо быстрее.

Если ваш код использует RAW-данные (open()+unpack(), а обработка своя), то вам нужно или переключиться на новый формат данных, или использовать вызов LibRaw::raw2image() для конверсии из нового формата в старый.

Если ваш код использовал доступ к маскированной ("черной") рамке, то вам нужно использовать новый RAW-буфер. См. samples/unprocessed_raw.cpp в качестве примера.

Прочие изменения:

  • Импортирована dcraw 9.10 (1.444), добавлена поддержка для камер: ARRIRAW, Canon SX30 IS, Leica D-LUX 5 и V-LUX2, Olympus E-P3, Panasonic G3 и GF3, Sony NEX-C3 и SLT-A35
  • Исправлена ошибка: green_matching несовместим (и не имеет смысла) с вейвлет-фильтрацией, коррекцией аберраций и прочими случаями уменьшения выходного изображения вдвое.
  • Поддержка цифровых кинокамер RedOne (формат R3D). Для использования этой поддержки вам надо:
    • Установить библиотеку libjasper для раскодирования JPEG2000
    • компилировать LibRaw с ключом компилятора -DUSE_JASPER (./configure сделает это сама)
    • Если вы используюете свой LibRaw_datastream, вы должны имплементировать там вызов make_jas_stream(), который вернет указатель на "поток" libjasper. Примеры реализаций этого вызова для потоков LibRaw можно найти в файле src/libraw_datastream.cpp
  • Оптимизация постпроцессинга, особенно для обрезанных (cropped) изображений.
  • Минимальные косметические изменения в описании интерфейса LibRaw_file_datastream
  • OpenMP-ускорение постпроцессинга (до 50% для режима half_size на 4-ядерном CPU)
  • Кроппинг работает и для сенсоров FujiCCD. По ряду причин, позиция верхнего левого угла области кроппинга округляется до ближайшего меньшего целого числа кратного 4.
  • Новый пример samples/postprocessing_benchmark.cpp
    Позволяет оценить скорость этапа постпроцессинга. Поддерживает разные варианты интерполяции, кроппинг, averaged white balance, медианный фильтр, wavelet-фильтрацию и highlight recovery.
  • Отдельных буферов под черную (маскированную) рамку более не существует. Байеровские данные хранятся в буфере вместе с рамкой, а для остальных (полноцветных) форматов данных рамка несущественна. Как следствие, нет больше и отвратительного вызова LibRaw::add_masked_border_to_bitmap()
  • Параметра, управлявшего фильтрацией RAW-данных (params.filtering_mode) тоже больше нет с нами. Тоновая кривая RAW применяется всегда (для тех форматов, где она есть) на стадии распаковки, нулевые пикселы затираются усредненными соседними данными на стадии постпроцессинга (тоже, только для тех форматов, где есть проблема нулевых пикселов).
  • Удален вызов LibRaw::rotate_fuji_raw() и соответствующий ему вызов С API.
  • Примеры unprocessed_raw и 4colors используют новые форматы хранения RAW и новый вызов raw2image.
  • Новые макросы проверки версий:

    LIBRAW_RUNTIME_CHECK_VERSION_EXACT() - рантайм проверка, что версия библиотеки (DLL, .SO) в точности та же, что была на компиляции приложения.

    LIBRAW_RUNTIME_CHECK_VERSION_NOTLESS() - рантайм проверка, что версия не меньше той, что была на компиляции.

    LIBRAW_COMPILE_CHECK_VERSION_EXACT(major,minor) - Проверка на компиляции, что версия в точности major.minor

    LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(major,minor) - Проверка на шаге компиляции, что версия не меньше чем major.minor

  • Удалены поля данных imgdata.sizes.bottom_margin и right_margin. Если размеры этих полей интересны, используйте для их вычисления raw_width - width - left_margin (и аналогично для нижнего поля).
  • Косметические изменения в ./configure
  • Обновлены файлы для Qmake и проектные файлы Visual Studio.
  • Большинство исходных текстов методов LibRaw*datastream перемещено в отдельный файл с исходными текстами, дабы не захламлять libraw_datastream.h
  • Класс LibRaw_windows_datastream (работа под Win32 с memory-mapped файлами) включен в "основную" библиотеку.
  • Структуры данных изменены, требуется перекомпиляция всех приложений.