aom-rs

May 12, 2026 · View on GitHub

crates.io docs.rs License GitHub Actions Discord

About Shiguredo's open source software

We will not respond to PRs or issues that have not been discussed on Discord. Also, Discord is only available in Japanese.

Please read https://github.com/shiguredo/oss before use.

時雨堂のオープンソースソフトウェアについて

利用前に https://github.com/shiguredo/oss をお読みください。

概要

libaom を利用した AV1 エンコーダーおよびデコーダーの Rust バインディングです。

特徴

  • コーデック対応情報の照会 (supported_codecs())
  • AV1 エンコーダー / デコーダー
  • 複数の画像フォーマット対応 (I420, YV12, NV12, I422, I444, I42016, I42216, I44416)
  • libaom の aom_codec_enc_cfg_t フィールドに準拠したエンコーダー設定
  • libaom のエンコーダー制御パラメータ (aom_codec_control) に準拠した詳細設定
  • 複数のエンコーダーモード (GoodQuality, Realtime, AllIntra)
  • レート制御 (VBR, CBR, CQ, Q)
  • ロスレスエンコード
  • カラー情報 (Color Primaries, Transfer Characteristics, Matrix Coefficients, Color Range)
  • AV1 インループフィルター制御 (CDEF, リストレーション, ループフィルタ)
  • タイル分割 / 行マルチスレッド
  • スーパーレゾリューション / 動的リサイズ
  • S-Frame (スイッチフレーム) サポート
  • デノイズ / フィルムグレイン
  • per-frame のキーフレーム強制
  • シンボル書き換えによる他ライブラリとの衝突回避 (shiguredo_aom_ プレフィックス付与)
  • prebuilt バイナリによる高速ビルド (デフォルト)
  • ソースからのビルドも可能 (--features source-build)

動作要件

  • Ubuntu 24.04 x86_64
  • Ubuntu 24.04 arm64
  • Ubuntu 22.04 x86_64
  • Ubuntu 22.04 arm64
  • macOS 26 arm64
  • macOS 15 arm64
  • Windows 11 x86_64
  • Windows Server 2025 x86_64

ソースビルド時の追加要件

  • Git
  • C コンパイラ (build-essential 等)
  • NASM (libaom のアセンブリ最適化に必要)
# Ubuntu
sudo apt-get install -y build-essential nasm

# macOS
brew install nasm

# Windows
choco install nasm

ビルド

デフォルトでは GitHub Releases から prebuilt バイナリをダウンロードしてビルドします。

cargo build

ソースからビルド

libaom をソースからビルドする場合は source-build feature を有効にしてください。

cargo build --features source-build

docs.rs 向けビルド

libaom がない環境では、docs.rs 向けのドキュメント生成のみ可能です。

DOCS_RS=1 cargo doc --no-deps

使い方

コーデック対応情報の照会

use shiguredo_aom::supported_codecs;

let info = supported_codecs();

// デコード対応状況
println!("decoding supported: {}", info.decoding.supported);
println!("decoding hardware_accelerated: {}", info.decoding.hardware_accelerated);

// エンコード対応状況
println!("encoding supported: {}", info.encoding.supported);
println!("encoding hardware_accelerated: {}", info.encoding.hardware_accelerated);

// 対応プロファイル一覧
match &info.encoding.profiles {
    shiguredo_aom::EncodingProfiles::Av1(profiles) => {
        for profile in profiles {
            println!("profile: {:?}", profile);
        }
    }
    shiguredo_aom::EncodingProfiles::Unsupported => {}
}

エンコード

入力は ImageData 列挙型で画像フォーマットと各プレーンのデータを渡します。

use shiguredo_aom::{
    AomRational, EncodeOptions, Encoder, EncoderConfig,
    ImageData, ImageFormat, RateControlMode, Usage,
};

// 必須パラメータを指定して設定を生成
let mut config = EncoderConfig::new(
    1920,              // g_w
    1080,              // g_h
    ImageFormat::I420, // image_format
);

// 必要に応じてオプションパラメータを変更
config.g_usage = Usage::Realtime;
config.rc_end_usage = RateControlMode::Cbr;
config.rc_target_bitrate = 4000; // kbps
config.cpu_used = Some(8);
config.g_threads = Some(4);
config.g_timebase = AomRational { num: 1, den: 30 };

// エンコーダーを作成
let mut encoder = Encoder::new(config)?;

// I420 形式の YUV データをエンコード
let image = ImageData::I420 { y: &y_data, u: &u_data, v: &v_data };
encoder.encode(&image, &EncodeOptions { force_keyframe: false })?;

// キーフレームを強制する場合
encoder.encode(&image, &EncodeOptions { force_keyframe: true })?;

// エンコード済みフレームを取得
while let Some(frame) = encoder.next_frame() {
    let data = frame.data();
    let is_key = frame.is_keyframe();
    println!("encoded: {} bytes, keyframe: {}", data.len(), is_key);
}

// 残りのフレームをフラッシュ
encoder.finish()?;
while let Some(frame) = encoder.next_frame() {
    // ...
}

デコード

use shiguredo_aom::{Decoder, DecoderConfig};

// デコーダーを作成
let mut decoder = Decoder::new(DecoderConfig::default())?;

// 圧縮データをデコード
decoder.decode(&compressed_data)?;

// デコード済みフレームを取得
while let Some(frame) = decoder.next_frame() {
    let y = frame.y_plane();
    let u = frame.u_plane();
    let v = frame.v_plane();
    let is_high_depth = frame.is_high_depth();
    println!("{}x{} high_depth={}", frame.width(), frame.height(), is_high_depth);
}

// 残りのフレームをフラッシュ
decoder.finish()?;
while let Some(frame) = decoder.next_frame() {
    // ...
}

設定

CodecInfo

フィールド説明
codecVideoCodecTypeコーデック種別
decodingDecodingInfoデコード情報
encodingEncodingInfoエンコード情報

VideoCodecType

バリアント説明
Av1AV1

DecodingInfo

フィールド説明
supportedboolデコードに対応しているか
hardware_acceleratedboolハードウェアアクセラレーションに対応しているか

EncodingInfo

フィールド説明
supportedboolエンコードに対応しているか
hardware_acceleratedboolハードウェアアクセラレーションに対応しているか
profilesEncodingProfilesコーデック固有のプロファイル情報

EncodingProfiles

バリアント説明
Av1(Vec<Av1EncodingProfile>)AV1 プロファイル一覧
Unsupportedプロファイル情報なし

Av1EncodingProfile

バリアント説明
Profile08/10-bit 4:2:0
Profile18/10-bit 4:4:4
Profile28/10/12-bit 4:2:0, 4:2:2, 4:4:4

EncoderConfig

フィールド名は libaom の aom_codec_enc_cfg_t および aom_codec_control の制御パラメータに準拠しています。#[non_exhaustive] が付与されているため、構造体は EncoderConfig::new() 経由で生成してください。

基本設定

フィールド説明
image_formatImageFormat入力画像フォーマット
g_usageUsageエンコーダーの利用モード
g_threadsOption<u32>スレッド数 (0 は 1 と同等)
g_profileu32ビットストリームプロファイル (0, 1, 2)
g_wu32フレームの幅
g_hu32フレームの高さ
g_limitOption<u32>エンコードする最大フレーム数
g_forced_max_frame_widthOption<u32>強制最大フレーム幅
g_forced_max_frame_heightOption<u32>強制最大フレーム高さ
g_bit_depthOption<u32>コーデックのビット深度 (8, 10, 12)
g_input_bit_depthOption<u32>入力フレームのビット深度
g_timebaseAomRationalタイムベース (例: 30fps なら num=1, den=30)
g_error_resilientboolエラー耐性モード
g_passOption<EncodingPass>マルチパスエンコーディングモード
g_lag_in_framesOption<u32>先読みフレーム数

レート制御

フィールド説明
rc_end_usageRateControlModeレート制御モード
rc_target_bitrateu32ターゲットビットレート (kbps)
rc_min_quantizeru32最小量子化値
rc_max_quantizeru32最大量子化値
rc_undershoot_pctOption<u32>VBR アンダーシュート許容率 (0-100)
rc_overshoot_pctOption<u32>VBR オーバーシュート許容率 (0-100)
rc_buf_szOption<u32>デコーダーバッファサイズ (ms)
rc_buf_initial_szOption<u32>デコーダーバッファ初期サイズ (ms)
rc_buf_optimal_szOption<u32>デコーダーバッファ最適サイズ (ms)
rc_dropframe_threshOption<u32>フレームドロップ閾値 (0-100)
rc_2pass_vbr_bias_pctOption<u32>2 パス CBR/VBR バイアス (0-100)
rc_2pass_vbr_minsection_pctOption<u32>2 パス GOP 最小ビットレート (%)
rc_2pass_vbr_maxsection_pctOption<u32>2 パス GOP 最大ビットレート (%)

リサイズ / スーパーレゾリューション

フィールド説明
rc_resize_modeOption<u32>空間リサンプリングモード (0-2)
rc_resize_denominatorOption<u32>リサイズ分母 (8-16)
rc_resize_kf_denominatorOption<u32>キーフレームリサイズ分母 (8-16)
rc_superres_modeOption<u32>スーパーレゾリューションモード (0-4)
rc_superres_denominatorOption<u32>スーパーレゾリューション分母 (8-16)
rc_superres_kf_denominatorOption<u32>キーフレームスーパーレゾリューション分母 (8-16)
rc_superres_qthreshOption<u32>スーパーレゾリューション Q 閾値 (1-63)
rc_superres_kf_qthreshOption<u32>キーフレームスーパーレゾリューション Q 閾値 (1-63)

キーフレーム / GOP

フィールド説明
kf_modeOption<KeyframeMode>キーフレーム配置モード
kf_min_distOption<u32>キーフレーム最小間隔
kf_max_distOption<u32>キーフレーム最大間隔
fwd_kf_enabledOption<bool>前方参照キーフレーム有効化
sframe_distOption<u32>S-Frame 間隔
sframe_modeOption<u32>S-Frame 挿入モード (1 or 2)

タイル設定

フィールド説明
tile_columnsOption<i32>タイル列数 (log2)
tile_rowsOption<i32>タイル行数 (log2)
tile_width_countOption<i32>明示的タイル幅の数
tile_height_countOption<i32>明示的タイル高さの数
tile_widthsOption<Vec<i32>>タイル幅の配列 (最大 64)
tile_heightsOption<Vec<i32>>タイル高さの配列 (最大 64)
large_scale_tileOption<bool>大規模タイルモード

エンコード速度 / 品質

フィールド説明
cpu_usedOption<i32>エンコード速度 (0-10, 大きいほど高速)
cq_levelOption<u32>CQ レベル
sharpnessOption<u32>シャープネス (0-7)
static_thresholdOption<u32>静止検出閾値
arnr_max_framesOption<u32>ARNR 最大フレーム数
arnr_strengthOption<u32>ARNR 強度
max_intra_bitrate_pctOption<u32>I フレーム最大ビットレート (%)
aq_modeOption<u32>適応的量子化モード (0-3)
deltaq_modeOption<u32>デルタ Q モード
losslessOption<bool>ロスレスモード
noise_sensitivityOption<u32>ノイズ感度
coeff_cost_upd_freqOption<u32>係数 RD コストの更新頻度 (0: SB ごと, 1: SB 行ごと, 2: タイルごと, 3: 無効)
mode_cost_upd_freqOption<u32>モード RD コストの更新頻度 (0: SB ごと, 1: SB 行ごと, 2: タイルごと, 3: 無効)
mv_cost_upd_freqOption<u32>MV RD コストの更新頻度 (0: SB ごと, 1: SB 行ごと, 2: タイルごと, 3: 無効)

フィルター制御

フィールド説明
enable_cdefOption<bool>CDEF 有効化
enable_restorationOption<bool>復元フィルタ有効化
loopfilter_controlOption<u32>ループフィルタ制御
enable_obmcOption<bool>OBMC 有効化
denoise_noise_levelOption<u32>デノイズノイズレベル
denoise_block_sizeOption<u32>デノイズブロックサイズ
film_grain_test_vectorOption<u32>フィルムグレインテストベクタ

モーション / 予測

フィールド説明
enable_global_motionOption<bool>グローバルモーション有効化
enable_warped_motionOption<bool>ワープモーション有効化
enable_tpl_modelOption<bool>TPL モデル有効化
enable_keyframe_filteringOption<u32>キーフレームフィルタリング (0-2)
enable_order_hintOption<bool>order hint ツール有効化 (sequence-level)
enable_ref_frame_mvsOption<bool>参照フレーム動きベクトル有効化 (enable_order_hintfalse のときは libaom 内部で silent に無効化される)
min_gf_intervalOption<u32>最小 GF 間隔
max_gf_intervalOption<u32>最大 GF 間隔
gf_max_pyramid_heightOption<u32>GF 最大ピラミッド高さ
max_reference_framesOption<u32>最大参照フレーム数

Intra 予測

フィールド説明
enable_filter_intraOption<bool>フィルタ Intra 有効化
enable_smooth_intraOption<bool>スムース Intra 有効化
enable_paeth_intraOption<bool>Paeth Intra 有効化
enable_cfl_intraOption<bool>CfL Intra 有効化
enable_paletteOption<bool>パレットモード有効化
enable_intrabcOption<bool>IntraBC 有効化
enable_angle_deltaOption<bool>角度デルタ Intra 有効化 (sequence-level)
intra_default_tx_onlyOption<bool>Intra ブロックの TX 探索をデフォルト変換のみに制限する (true で TX 探索を削減して realtime 向けに高速化)

パーティション

フィールド説明
superblock_sizeOption<SuperblockSize>スーパーブロックサイズ
enable_rect_partitionsOption<bool>矩形パーティション有効化
enable_ab_partitionsOption<bool>AB パーティション有効化
enable_1to4_partitionsOption<bool>1:4 パーティション有効化

カラー情報

フィールド説明
color_primariesOption<u32>色域 (CICP)
transfer_characteristicsOption<u32>伝送特性 (CICP)
matrix_coefficientsOption<u32>行列係数 (CICP)
color_rangeOption<u32>色範囲 (0: スタジオ, 1: フル)
enable_chroma_deltaqOption<bool>クロマデルタ Q 有効化
enable_dual_filterOption<bool>デュアルフィルタ有効化

その他

フィールド説明
row_mtOption<bool>行マルチスレッド
tune_contentOption<ContentType>コンテンツタイプ最適化
monochromeOption<bool>モノクロモード
full_still_picture_hdrOption<bool>スティルピクチャ用フルヘッダ
save_as_annexbOption<bool>Annex-B 形式
use_fixed_qp_offsetsOption<bool>固定 QP オフセット使用
enable_superresOption<bool>スーパーレゾリューション有効化

Usage

バリアント説明
GoodQuality高品質 (品質と速度のバランス)
Realtimeリアルタイム (最も高速)
AllIntra全 I フレーム (キーフレームのみ)

RateControlMode

バリアント説明
VbrVariable Bitrate (可変ビットレート)
CbrConstant Bitrate (固定ビットレート)
CqConstrained Quality (制約付き品質)
QConstant Quality (固定品質)

ImageFormat

バリアント説明
I420YUV 4:2:0 planar (3 プレーン: Y, U, V)
Yv12YUV 4:2:0 planar (3 プレーン: Y, V, U)
Nv12YUV 4:2:0 semi-planar (2 プレーン: Y, UV interleaved)
I422YUV 4:2:2 planar (3 プレーン: Y, U, V)
I444YUV 4:4:4 planar (3 プレーン: Y, U, V)
I42016YUV 4:2:0 planar 16-bit (3 プレーン: Y, U, V)
I42216YUV 4:2:2 planar 16-bit (3 プレーン: Y, U, V)
I44416YUV 4:4:4 planar 16-bit (3 プレーン: Y, U, V)

ImageData

バリアント説明
I420 { y, u, v }I420 (3 プレーン: Y, U, V)
Yv12 { y, u, v }YV12 (3 プレーン: Y, V, U)
Nv12 { y, uv }NV12 (2 プレーン: Y, UV interleaved)
I422 { y, u, v }I422 (3 プレーン: Y, U, V)
I444 { y, u, v }I444 (3 プレーン: Y, U, V)
I42016 { y, u, v }I42016 (3 プレーン: Y, U, V / 16-bit)
I42216 { y, u, v }I42216 (3 プレーン: Y, U, V / 16-bit)
I44416 { y, u, v }I44416 (3 プレーン: Y, U, V / 16-bit)

SuperblockSize

バリアント説明
Size64x6464x64
Size128x128128x128
Dynamic動的選択

ContentType

バリアント説明
Default通常の映像
Screenスクリーン録画
Filmフィルム

KeyframeMode

#[non_exhaustive] が付与されているため、将来的なバリアント追加に備えてください。

バリアント説明
Disabledキーフレーム自動挿入を無効化する (AOM_KF_DISABLED)
FixedDisabled の deprecated エイリアス (libaom の AOM_KF_FIXEDAOM_KF_DISABLED と同値)
Auto自動配置 (AOM_KF_AUTO)

EncodingPass

バリアント説明
OnePassシングルパス
FirstPass1 パス目
SecondPass2 パス目
ThirdPass3 パス目

EncodeOptions

フィールドデフォルト説明
force_keyframeboolfalseキーフレームを強制する

DecoderConfig

フィールド説明
threadsOption<u32>スレッド数
wOption<u32>幅のヒント
hOption<u32>高さのヒント
allow_lowbitdepthOption<bool>低ビット深度パスの許可

環境変数

変数説明
LIBAOM_TARGETprebuilt バイナリのプラットフォーム名を明示的に指定する

libaom ライセンス

https://aomedia.googlesource.com/aom/+/refs/heads/main/LICENSE

Copyright (c) 2016, Alliance for Open Media. 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.

ライセンス

Apache License 2.0

Copyright 2026-2026, Shiguredo Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.