Выпуск библиотеки libjpeg-turbo 1.4.0

09.01.2015 19:09

Анонсирован выпуск проекта libjpeg-turbo 1.4.0, в рамках которого развивается высокопроизводительная библиотека кодирования и декодирования изображений в формате JPEG. Libjpeg-turbo представляет собой совместимый на уровне API/ABI форк классической библиотеки libjpeg, нацеленный на обеспечение максимальной скорости кодирования и декодирования. В свою очередь, от libjpeg-turbo ответвилась библиотека mozjpeg, которая движется в сторону оптимизации размера результирующих изображений.

Благодаря использованию инструкций SIMD (MMX, SSE2, NEON) на архитектурах x86, x86-64 и ARM, libjpeg-turbo позволяет добиться ускорения операций кодирования и декодирования JPEG в 2-4 раза, по сравнению с libjpeg. На других архитектурах ускорение не столь значительное, но за счёт применения оптимизированных функций кодирования Хаффмана библиотека всё равно заметно быстрее libjpeg и близка по своим показателям к высококачественным проприетарным кодекам JPEG. Кроме стандартного libjpeg API библиотека также предоставляет расширенный TurboJPEG API и ряд расширений с моделями представления цвета, дающих возможность сжимать изображения в 32-разрядные пиксельные буферы (RGBX, XBGR) или декодировать из них.

Основные новшества:

  • Для ускорения на платформах MIPS задействованы DSPr2-совместимые SIMD-инструкции, что на 70-80% ускорило сжатие полноцветных JPEG и на 25-35% ускорило декодирование;
  • В коде кодирования Хаффмана для подсчёта битов на платформах ARM и ARM64 задействованы инструкции clz и bsr, что позволило на 64 Кб сократить потребление памяти. На двух протестированных Android-устройствах наблюдался рост производительности на 10-20%, при этом ещё на двух наблюдалось падение производительности на 3-4% при использовании кода ARMv6 и рост производительности на 3-4% для кода ARMv7. Добавлено использование 64-разрядных SIMD-инструкций ARM для ускорения преобразования цветов YCC-to-RGB и применения алгоритмов IDCT;
  • Для закодированных с использованием таблиц Хаффмана JPEG-изображений добавлена возможность подстановки таблиц по умолчанию, если данные таблицы отсутствуют в заголовке файла с изображением. Например, для экономии места в видео в формате Motion JPEG кадры часто не содержат подобных таблиц;
  • Улучшена точность и производительность реализации алгоритма инвертирования DCT с плавающей точкой, не применяющего SIMD-инструкции.
  • В libjpeg API добавлена поддержка цветовой модели JCS_RGB565, что позволяет декодировать изображения JPEG в пиксельный формат RGB565 (16-bit).
  • Расширен TurboJPEG API: добавлена поддержка CMYK, поддержка операции масштабирования в функции decompress-to-YUV, поддержка задания произвольного заполнения строк при генерации плоских YUV-изображений (YUV planar), возможность сжатия JPEG-изображений на основе исходного YUV-изображения, поддержка цветовой субдискретизации 4:1:1. Значительно переработан Java API для работы с YUV-изображениями, добавлена поддержка кодирования YUV-изображения из произвольной позиции в буфере;
  • Удалены устаревшие возможности, такие как поддержка не-ANSI компиляторов и модель памяти MS-DOS;
  • Возобновлена поддержка JPEG с 12-ю битами на компонент (при сборке необходимо указать --with-12bit), при включении которой будут отключены все специфичные libjpeg-turbo оптимизации и станет недоступен TurboJPEG API (но останутся доступны расширения, такие как модели представления цвета);
  • Пакет для OS X теперь собирается с использованием pkgbuild и productbuild вместо PackageMaker.