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

Анонсирован выпуск проекта 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.

© OpenNet