Стал доступен релиз библиотеки для кодирования и декодирования JPEG-изображений libjpeg-turbo 3.0.0. Библиотека предлагает совместимый API, что даёт преимущества в скорости выполнения операций.
![](https://habrastorage.org/getpro/habr/upload_files/756/6d9/77d/7566d977d472592abf10cab4d62773a4.jpg)
Основные нововведения:
API TurboJPEG поддерживает субдискретизацию цветности 4:4:1 (транспонированное 4:1:1), что позволяет без потерь транспонировать или поворачивать изображения JPEG 4:1:1, а также распаковывать их в YUV;
устранены сбои сегментации и ошибка переполнения буфера (CVE-2023-2804), возникающие при попытке распаковать различные специально созданные искажённые изображения JPEG без потерь с разрешением 12 и 16 бит на компонент с использованием квантования цвета. Причина проблем заключалась в том, что алгоритмы квантования цвета и объединённые алгоритмы повышения дискретизации не учитывали декомпрессию без потерь. Поскольку libjpeg-turbo явно не поддерживает преобразование цвета при сжатии или распаковке изображений JPEG без потерь, для них не следовало включать объединённое повышение частоты дискретизации/преобразование цвета. Квантование цвета — это устаревшая функция, которая практически не используется для изображений JPEG без потерь, поэтому она также отключена при распаковке. Таким образом, теперь нельзя преобразовать изображение JPEG без потерь в изображение GIF;
исправлена ошибка в версии 1.4 beta1[8], которая вызывала различные сбои сегментации и переполнение буфера при попытке распаковать специально созданные искажённые изображения JPEG с 12-битным компонентом с включённым квантованием цвета и преобразованием цвета RGB565;
исправлена проблема, из-за которой функция jpeg_crop_scanline() иногда неверно рассчитывала ширину субдискретизации для компонентов с коэффициентами субдискретизации 4x2 или 2x4, если было включено масштабирование декомпрессии. Это приводило к неполной передискретизации компонентов, из-за чего преобразователь цвета считывал данные из неинициализированной памяти. При 12-разрядной точности данных это приводило к ошибкам буфера памяти, если значение выборки находилось за пределами допустимого диапазона;
исправлена проблема, из-за которой функция tj3Transform() при использовании с операцией преобразования TJXOP_TRANSPOSE, TJXOP_TRANSVERSE, TJXOP_ROT90 или TJXOP_ROT270 и без автоматического (пере)распределения целевого буфера JPEG или обрезки без потерь вычисляла размер преобразованного изображения JPEG на основе размеров исходного, а не преобразованного изображения. Эту проблему можно обойти, установив TJXOPT_COPYNONE. При этом tj3Transform() не может надёжно преобразовывать исходные изображения JPEG, которые содержат большое количество метаданных, если только не используется автоматическое (пере)распределение целевого буфера JPEG или не установлен параметр TJXOPT_COPYNONE;
исправлена проблема, появившаяся в версии 3.0 beta2[6], из-за которой параметр djpeg -map не работал при распаковке 12-битных изображений JPEG с потерями на компонент;
исправлена проблема, из-за которой кодировщик Хаффмана C (который не используется по умолчанию в процессорах x86 и Arm) считывал данные из неинициализированной памяти при попытке преобразовать специально созданное искажённое исходное изображение JPEG с арифметическим кодированием в базовое целевое изображение JPEG с кодировкой Хаффмана.
Автор проекта libjpeg-turbo теперь будет выпускать только обновления с исправлениями ошибок. Он не начнёт развивать ветку 3.1, пока не найдёт финансирование.