Кодирование и декодирование изображений AVIF с помощью программного обеспечения и библиотек с открытым исходным кодом


Одной из новых функций Android 12 является поддержка формата файлов AVIF, который обеспечивает файлы гораздо меньшего размера при том же уровне качества. Джейк Арчибальд проделал огромную работу по сравнению формата AVIF с JPEG, WebP и другими форматами неподвижных изображений, и результаты действительно впечатляют.

Помимо Android 12, AVIF уже поддерживается в браузере Chrome и будет включен по умолчанию в Firefox 86, но здесь мы рассмотрим некоторые программы и библиотеки с открытым исходным кодом, которые позволяют вам управлять изображениями AVIF.

С помощью библиотеки libavif, AOMedia опубликовала эталонную реализацию на C вместе с инструментами avifenc и avifdec, которые полагаются на различные кодеки, но, похоже, rav1e рекомендуется для кодирования изображения AVIF, а dav1d — лучший выбор для декодирования AVIF.

libavif не будет автоматически создавать кодек, и их необходимо включить в CMakeLists.txt

option(AVIF_CODEC_AOM "Use the AOM codec for encoding/decoding (see AVIF_CODEC_AOM_DECODE/AVIF_CODEC_AOM_ENCODE)" OFF)
option(AVIF_CODEC_DAV1D "Use the dav1d codec for decoding" ON)
option(AVIF_CODEC_LIBGAV1 "Use the libgav1 codec for decoding" OFF)
option(AVIF_CODEC_RAV1E "Use the rav1e codec for encoding" ON)
option(AVIF_CODEC_SVT "Use the SVT-AV1 codec for encoding" OFF)

а также определить путь для выбранного кодека.

Библиотека кодирования rav1e AVIF и инструмент cavif-rs

Давайте создадим rav1e в Ubuntu 20.04:

git clone https://github.com/xiph/rav1e
cd rav1e
sudo apt install cargo nasm
cargo build --release

Мы сделали это на ноутбуке AMD Ryzen, но rav1e оптимизирован как для Arm, так и для x86:

  • asm – по умолчанию включен. Когда этот параметр включен, сборка создается для поддерживающих его платформ.
    • x86_64: запрашивает nasm.
    • aarch64
      • запрашивает gas
      • Альтернатива: используйте ассемблер clang установив CC=clang

ПРИМЕЧАНИЕ. SSE2 всегда включен на x86_64, neon всегда включен для aarch64, вы можете установить для переменной среды RAV1E_CPU_TARGET значение rust, чтобы отключить все оптимизированные для сборки процедуры во время выполнения.

rav1e основан на rust, но есть также библиотека C c файлом pkg-config для людей, желающих интегрировать rav1e в свои проекты C. Его можно сгенерировать следующим образом:

cargo install cargo-c
cargo cinstall --release

rav1e предназначен для кодирования необработанных видео, и, кстати, не существует образца для кодирования файла изображения AVIF, поэтому мы можем использовать libavif или cavif-rs для создания файла AVIF из файла PNG или JPG.

Вот как можно создать cavif-rs в Ubuntu 20.04:

git clone https://github.com/kornelski/cavif-rs
cd cavif-rs
cargo install cavif

Обратите внимание, что он будет компилировать rav1e в процессе, поэтому не нужно заранее создавать rav1e. Теперь мы можем запустить программу, чтобы проверить ее:

export PATH=$PATH:/home/jaufranc/.cargo/bin
time cavif cnxsoft-logo.png 
cnxsoft-logo.avif: 30KB (29221B color, 0B alpha, 188B HEIF)
 
real 0m4.753s
user 0m17.945s
sys 0m0.064s

На преобразование файла PNG в файл AVIF на процессоре AMD Ryzen 7 2700U потребовалось почти пять секунд, но теперь файл стал намного меньше:

ls cnxsoft-logo.* -l
-rw-rw-r-- 1 jaufranc jaufranc  29409 Feb 23 11:05 cnxsoft-logo.avif
-rw-r--r-- 1 jaufranc jaufranc 205216 Feb 23 11:03 cnxsoft-logo.png

Честно говоря, возможно это не оптимальный файл для формата PNG без потерь. Затем мы смогли открывать файлы в Chrome, и увидеть различия весьма сложно:

AVIF (слева) против PNG (справа)

Вы также можете проверить исходные файлы PNG и AVIF.

Библиотека декодирования dav1d AVIF и инструмент davif

Большинство встраиваемых систем, вероятно, будут использовать только декодирование/рендеринг AVIF, и для этого мы можем создать библиотеку dav1d C:

git clone https://code.videolan.org/videolan/dav1d
cd dav1d/
sudo apt install nasm meson ninja-build
mkdir build && cd build
meson ..
ninja

Как и rav1e, dav1d оптимизирован как для Arm, так и для x86. На момент работы кодек оптимизирован с помощью ассемблерного кода для 64-битных процессоров Arm с инструкциями NEON SIMD и чипов x86 с инструкциями AVX2 и SSSE3 + SIMD. Ведется работа над ARMv7 (32-разрядная версия) и менее распространенной архитектурой без PPC, SSE2 или AVX-512.

Затем вы можете использовать код для интеграции в свою программу, но если нам нужен пример кода, который будет декодировать/преобразовывать файл AVIF с помощью dav1d, инструмент davif  может преобразовать файл AVIF в PNG.

Вот как мы его собираем в Ubuntu 20.04:

git clone --recurse-submodules --recursive https://github.com/link-u/davif
cd davif
cmake .
make

Преобразование из AVIF в PNG происходит намного быстрее, чем наоборот, точнее, в 10 раз быстрее.

time ./davif -i cnxsoft-logo.avif -o cnxsoft-logo.png
[2021/02/23 11:51:15 INFO ] davif
[2021/02/23 11:51:15 DEBUG]  - dav1d ver: 0.8.0-34-g7424f8e
[2021/02/23 11:51:15 INFO ] Decoding: cnxsoft-logo.avif -> cnxsoft-logo.png
[2021/02/23 11:51:15 INFO ]  Decoded: cnxsoft-logo.avif -> cnxsoft-logo.png in 93 [ms]
 
real 0m0.392s
user 0m0.431s
sys 0m0.012s

Поскольку все написано на C и ассемблере, может быть проще переносить на встраиваемые системы с ограниченными ресурсами.

Следует отметить, что AVIF — не единственный новый формат изображения, поскольку в стадии разработки так же находится формат JPEG XL, но его интеграция в веб-браузеры может занять немного больше времени. Вы найдете эталонную реализацию JPEG XL на Gitlab. Разница между AVIF и JPEG XL обсуждается на форуме encode.su  и в блоге Cloudinary , где упоминается, что AVIF предлагает лучшее сжатие, но декодер JPEG XL и особенно кодировщик должны быть быстрее и поддерживать большие разрешения, тогда как AVIF ограничен до 3840 × 2160 что кажется странным. JPEG XL не требует лицензионных отчислений, и он остается совместимым с JPEG.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments