AOMediaCodec/libavif
GitHub: AOMediaCodec/libavif
libavif 是一个用 C99 编写的可移植库,提供 AVIF 图像格式的完整编码与解码能力,并附带命令行工具和丰富的编解码器后端选择。
Stars: 2140 | Forks: 297
# libavif
本库旨在成为 AV1 图像文件格式的一个友好、可移植的 C 语言实现,具体描述如下:
它可以编码和解码所有 AV1 支持的 YUV 格式和位深(包含 alpha 通道)。除了库之外,还提供了编码器和解码器命令行工具(`avifenc` 和 `avifdec`)。
建议您查看或使用
[已标记的发布版本](https://github.com/AOMediaCodec/libavif/releases),而不是
仅仅使用 main 分支。随着错误修复和新功能的添加,我们会定期创建新版本。
## 命令行工具用法
```
avifenc -q 75 input.[jpg|png|y4m] output.avif
avifdec output.avif decoded.png
```
有关所有选项,请参阅 `avifenc --help`。
## API 用法
请查看 "examples" 目录中的示例。如果您已经在构建
`libavif`,请启用 CMake 选项 `AVIF_BUILD_EXAMPLES`,以便同时构建和
运行这些示例。
## 安装说明
`libavif` 是大多数主要操作系统中的一个软件包。
### Windows
```
vcpkg install libavif
```
您还可以在
[发布](https://github.com/AOMediaCodec/libavif/releases)页面下载官方的 Windows 二进制文件。
### macOS
Homebrew:
```
brew install libavif
```
MacPorts:
```
sudo port install libavif
```
### Linux
基于 Debian 的发行版:
```
sudo apt install libavif-dev
```
基于 Red Hat 的发行版:
```
sudo yum -y install libavif
```
### MinGW
对于“默认”的 MSYS2 UCRT64 环境:
```
pacman -S mingw-w64-ucrt-x86_64-libavif
```
## 构建说明
构建 libavif 需要 [CMake](https://cmake.org/)。
有关示例命令行,请参阅下文的[构建命令行](#build-command-lines)。
### 控制依赖项
像 `AVIF_CODEC_AOM`、`AVIF_LIBYUV` 等 CMake 标志允许启用或
禁用依赖项。它们可以采用三个可能的值:
* `OFF`:禁用该依赖项。
* `SYSTEM`:期望该依赖项已安装在系统上。
* `LOCAL`:在本地构建该依赖项。在大多数情况下,CMake 可以
自动下载并构建它。对于某些依赖项,您需要自行
运行 `ext/` 子目录中的相关脚本。在
CMake 负责下载依赖项的情况下,如果您
想使用不同版本的依赖项(例如通过
修改脚本)或对其进行自定义代码更改,您仍然可以调用
`ext/` 中的脚本。
如果 `ext/` 目录中存在与该依赖项同名的目录,CMake 将
使用它,而不是下载新的副本。
### 编解码器依赖项
默认情况下不启用任何 AV1 编解码器。您应该通过
将以下任意 CMake 选项设置为 `LOCAL` 或 `SYSTEM` 来至少启用其中一个,具体取决于
您是想使用本地构建的版本还是系统安装的版本
(例如 `-DAVIF_CODEC_AOM=LOCAL`):
* `AVIF_CODEC_AOM` 对应 [libaom](https://aomedia.googlesource.com/aom/)(编码器
和解码器)
* `AVIF_CODEC_DAV1D` 对应 [dav1d](https://code.videolan.org/videolan/dav1d)
(解码器)
* `AVIF_CODEC_LIBGAV1` 对应
[libgav1](https://chromium.googlesource.com/codecs/libgav1/)(解码器)
* `AVIF_CODEC_RAV1E` 对应 [rav1e](https://github.com/xiph/rav1e)(编码器)
* `AVIF_CODEC_SVT` 对应 [SVT-AV1](https://gitlab.com/AOMediaCodec/SVT-AV1)
(编码器)
当设置为 `SYSTEM` 时,这些库(以其 C API 形式)必须在外部
可用(可通过 CMake 的 `FIND_LIBRARY` 发现)才能使用它们,或者如果 libavif
是一个子 CMake 项目,则在执行 libavif 的 CMake 脚本时,
必须已经存在相应的 CMake target。
### Libyuv 依赖项
Libyuv 是一个可选但强烈推荐的依赖项,它可以加速
色彩空间转换。默认情况下它被启用并设为 `SYSTEM`,
因此预期它已安装在系统上。也可以通过
使用 `-DAVIF_LIBYUV=LOCAL` 在本地构建它,或者使用
`-DAVIF_LIBYUV=OFF` 将其禁用。
### 测试
通过启用 `AVIF_BUILD_TESTS` CMake 选项,可以构建一些用 C 语言编写的测试。
其余的测试需要 [GoogleTest](https://github.com/google/googletest),
可以通过启用 `AVIF_BUILD_TESTS` 并将 `AVIF_GTEST` 设置为
`SYSTEM` 或 `LOCAL` 来构建。
此外,模糊测试需要 [fuzztest](https://github.com/google/fuzztest),
另请参阅 `ext/oss-fuzz/README.md` 中的模糊测试说明。
可以通过启用 `AVIF_ENABLE_COVERAGE` 然后构建
`avif_coverage` target(例如 `make avif_coverage -j`)来获取代码覆盖率。这需要
使用 clang 进行编译(`-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++`),
并且系统上必须安装有 LLVM。
### 构建命令行
以下说明可用于构建 libavif 库以及
`avifenc` 和 `avifdec` 工具。
#### 使用已安装的依赖项进行构建
链接已安装的 `aom`、`libjpeg`、`libpng` 和 `libyuv` 依赖
库(推荐):
```
git clone -b v1.2.1 https://github.com/AOMediaCodec/libavif.git
cmake -S libavif -B libavif/build -DAVIF_CODEC_AOM=SYSTEM -DAVIF_BUILD_APPS=ON
cmake --build libavif/build --config Release --parallel
```
#### 从零开始构建所有内容
用于开发和调试目的:
```
git clone -b v1.2.1 https://github.com/AOMediaCodec/libavif.git
cmake -S libavif -B libavif/build -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=OFF -DAVIF_CODEC_AOM=LOCAL -DAVIF_LIBYUV=LOCAL -DAVIF_LIBSHARPYUV=LOCAL -DAVIF_JPEG=LOCAL -DAVIF_ZLIBPNG=LOCAL -DAVIF_BUILD_APPS=ON
cmake --build libavif/build --config Debug --parallel
```
## 预构建的二进制文件 (Windows)
静态链接的 `avifenc.exe` 和 `avifdec.exe` 可以从
[Releases](https://github.com/AOMediaCodec/libavif/releases)页面下载。
## 开发说明
请查阅 [wiki](https://github.com/AOMediaCodec/libavif/wiki) 获取关于 libavif 的额外
资源,例如发布检查清单。
libavif 库使用 C99 编写。大多数测试使用 C++14 编写。
### 格式化
从顶层文件夹使用 [clang-format](https://clang.llvm.org/docs/ClangFormat.html) 格式化
源代码(首选 `clang-format-19`):
```
clang-format -style=file -i \
apps/*.c apps/*/*.c apps/*/*.cc apps/*/*.h examples/*.c \
include/avif/*.h src/*.c src/*.cc \
tests/*.c tests/*/*.cc tests/*/*.h
```
从顶层文件夹使用 [cmake-format](https://github.com/cheshirekow/cmake_format) 格式化
CMakeLists.txt 文件:
```
cmake-format -i \
CMakeLists.txt \
tests/CMakeLists.txt \
cmake/Modules/*.cmake \
contrib/CMakeLists.txt \
contrib/gdk-pixbuf/CMakeLists.txt \
android_jni/avifandroidjni/src/main/jni/CMakeLists.txt
```
## 许可证
在 BSD 许可证下发布。
```
Copyright 2019 Joe Drago. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
```
标签:AVIF, Bash脚本, C/C++, SOC Prime, 事务性I/O, 图像处理, 多媒体处理, 客户端加密, 开发工具, 编解码库