Доступна библиотека libjpeg-turbo 1.5.0

После полутора лет разработки представлен выпуск libjpeg-turbo 1.5.0, высокопроизводительной библиотеки для кодирования и декодирования изображений в формате JPEG. Libjpeg-turbo представляет собой совместимый на уровне API/ABI форк классической библиотеки libjpeg, нацеленный на обеспечение максимальной скорости кодирования и декодирования. Кроме стандартного libjpeg API библиотека предоставляет собственный TurboJPEG API и ряд расширений с моделями представления цвета, дающих возможность сжимать изображения в 32-разрядные пиксельные буферы (RGBX, XBGR) или декодировать из них. Код распространяется под тремя BSD-подобными лицензиями IJG, модифицированой BSD и zlib, бинарные сборки подготовлены для Linux (rpm, deb), OS X и Windows.

По сравнению с libjpeg библиотека libjpeg-turbo позволяет добиться ускорения операций кодирования и декодирования JPEG в 2–4 раза, благодаря использованию инструкций SIMD (MMX, SSE2, NEON) на архитектурах x86, x86–64, PowerPC и ARM. На других архитектурах ускорение не столь значительное, но за счёт применения оптимизированных функций кодирования Хаффмана библиотека всё равно заметно быстрее libjpeg и близка по своим показателям к высококачественным проприетарным кодекам JPEG. Отдельно развивается mozjpeg, форк libjpeg-turbo, который движется в сторону оптимизации размера результирующих изображений.

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

  • Для архитектуры PowerPC реализована поддержка полноценного ускорения с использованием инструкций AltiVec VMX (128-разрядный SIMD), что позволило увеличить производительность кодирования в 3–4 раза и декодирования в 2–2.5 раза;
  • Добавлены две новые функции libjpeg API: jpeg_skip_scanlines () и jpeg_crop_scanline () для частичного декодирования изображений JPEG;
  • В классах TJCompressor и TJDecompressor, представленных в TurboJPEG Java API, реализован интерфейс Closeable, что позволяет использовать данные классы в выражениях try-with-resources;
  • Буферы с частями исходного изображения теперь передаются в функции TurboJPEG C API и в jpeg_mem_src () в режиме только для чтения, не допускающем внесение изменений;
  • Добавлена переменная окружения JSIMD_FORCENONE позволяющая во время работы отключить применение оптимизаций SIMD для архитектуры x86–64;
  • В TJBench добавлена опция »-nowrite» запрещающая вывод изображений в процессе измерения производительности (позволяет минимизировать влияние задержек при дисковой записи);
  • На SSE2-совместимых платформах x86 и x86–64, а также на NEON-совместимых 32- и 64-разрядных платформах ARM реализовано SIMD-ускорение кодирования Хаффмана, которое позволило увеличить скорость кодирования полноцветных JPEG на 10–15% для современных процессоров Intel и AMD, на 30% для iPhone 4S и CPU Cortex-A9, на 6–8% для Nexus 5X, CPU Cortex-A53 и Cortex-A57, на 40% для iPhone 5S, и Apple A7;
  • На 64-разрядных процессорах ARM (ARMv8) задействованы инструкции NEON для ускорения типовых алгоритмов сжатия и распаковки, что позволило ускорить операции сжатия полноцветных JPEG в среднем на 73% на CPU Cavium ThunderX и в 2–2.5 раза на CPU Cortex-A53 и Cortex-A57. Скорость распаковки увеличилась в 2 раза на CPU Cavium ThunderX и на 15% на CPU Cortex-A53.

© OpenNet