Skip to content

Latest commit

 

History

History
104 lines (66 loc) · 11.1 KB

File metadata and controls

104 lines (66 loc) · 11.1 KB

AviSynth — Convert Video

English | 简体中文 | 日本語

AviSynth — Convert Video は、AviSynthMinus の独立した動画変換・画像リサンプリングモジュールです。AviSynth なしでビルドでき、静的リンクでコアに組み込めます。通常の C 実装と Google Highway によるクロスプラットフォーム SIMD カーネルを提供します。

公開インターフェースは C の型と関数を使用し、内部実装は C++17 を使用します。AviSynth SDK、AvsCore、AvsSimd には依存しません。

動画変換を分離する理由

計算カーネルをフレームサーバーから分離することで、インターフェース、数値動作、テスト、性能を独立して保守できます。本モジュールは AviSynthMinus とともに開発され、通常はバージョンを固定した Git サブモジュールとして組み込まれます。

ホストはクリップ、スクリプト登録、フレーム割り当て、プロパティ、色空間の解釈、スケジューリングを担当します。ライブラリは明示的なバッファー、変換設定、行範囲を処理します。ホストがフィルターを構成するための演算を提供し、AviSynth フィルター自体は登録しません。

対応する処理

分類 機能
格納形式 packed BGR/BGRA と planar RGB/RGBA の相互変換、alpha 処理、YUY2 のパック・アンパック、輝度抽出と色差の中立化。
色変換行列 RGB/YUV・輝度演算、整数・浮動小数点処理、明示的なレンジと行列設定。
ビット深度 整数・浮動小数点変換、レンジ変換、丸め、飽和処理。
ディザ Bayer ordered ディザ、AviSynth 互換の蛇行走査 Floyd–Steinberg 誤差拡散。
リサンプリング 水平・垂直フィルタリング、クロップオフセット、明示的なサンプル中心、再利用可能な係数プラン。

格納型は U8、U16、F32 です。有効ビット深度とレイアウトの制限は演算ごとに異なり、公開ヘッダーに記載されています。リサンプリングは Point、Triangle、Bicubic、Lanczos、Blackman、Spline16/36/64、Gaussian、Sinc、SinPower、SincLin2、UserDefined2 に対応します。ホストがこれらを組み合わせ、色差サブサンプリング、packed 形式、完全なリサイズフィルターを構成します。

数値動作はレビュー済みの C 実装と回帰テストを基準とします。明確に修正された上流の不具合を互換性のために再現することはありません。同じスクリプト名でも、過去のすべての AviSynth バージョンとバイト単位で一致するとは限りません。

SIMD と CPU 制限

VC_TARGET_C は通常の C を選びます。VC_TARGET_NATIVE は利用可能なネイティブ実装を選び、必要に応じて C に戻ります。各演算の照会関数は、コンパイル済みで現在の CPU が対応する SIMD ターゲットを返します。利用できないターゲットの明示的な要求は失敗します。識別子には Highway のターゲットビット値を使用します。

選択はプランまたは関数テーブルに固定され、Highway のプロセス全体の制限を変更しません。AvsSimd はホストに残り、SetMaxCPU の制限とライブラリの利用可能ターゲットの共通部分を選びます。SetMaxCPU("none") は通常の C を選択します。非 x86 ホストでは none が C、それ以外が native 選択となります。

Floyd–Steinberg は意図的に通常の C 実装を使用し、AviSynth の変更された蛇行走査の重み、符号付き誤差、丸め規則を維持します。context は一つのフレーム・平面に属し、行範囲は順番に処理する必要があります。同じ context を同時実行できませんが、独立した context は並列に実行できます。

ビルドと組み込み

CMake 3.24 以降と C++17 対応コンパイラーが必要です。公開インターフェースは C 互換で、STL コンテナーや Highway ベクトル型を公開しません。C++ 例外は公開境界を越えません。更新時には対応するヘッダーとライブラリを組み合わせてください。異なるリリース間のバイナリー互換性は保証しません。

cmake -S . -B build/release -DCMAKE_BUILD_TYPE=Release -DVC_BUILD_TESTS=ON
cmake --build build/release --config Release --parallel
ctest --test-dir build/release -C Release --output-on-failure

ホストが GTest::gtest_main を提供しない場合、テストは GoogleTest 1.17.0 を取得します。ライブラリのみのビルドには -DVC_BUILD_TESTS=OFF を指定します。-DVC_SCALAR_ONLY=ON はテストだけでなく変換ライブラリ全体の SIMD 選択を無効にします。-DVC_BUILD_BENCHMARKS=ON で任意のベンチマークを有効にできます。上流比較用ターゲットには外部の参照ソースが必要な場合があります。

静的ライブラリ名は VideoConvert、CMake エイリアスは AviSynth::ConvertVideo です。サブモジュールとして追加した後、ターゲットを直接リンクします。

add_subdirectory(third_party/video_convert)
target_link_libraries(MyHost PRIVATE AviSynth::ConvertVideo)

単独ビルドでは同梱の Highway 1.4.0 を使用します。組み込み時は互換性のある既存の hwy ターゲットを再利用し、Audio、Video、ホストで一つのランタイムを共有できます。CMake が静的リンク依存関係を伝播するため、ホストがカーネルのソースを列挙する必要はありません。対応する組み込み方法は共同 CMake ビルドであり、インストール型バイナリー SDK パッケージではありません。

公開ヘッダーは include/video_convert にあります。stride は符号付きバイト数です。各 API の行起点、バッファー重複、寿命に関する契約に従ってください。多くのプランは不変で、重複しない出力行範囲への並列実行に対応します。状態を持つ Floyd–Steinberg context は例外です。リサンプリングでは、出力行範囲に必要な入力行範囲を照会できます。

テストと性能

独立したテストは係数、C/native の一致、修正された数値動作、格納形式、レンジ、量子化、端数サイズ、負の stride、行範囲、メモリー境界を検証します。C の利用側テストで公開インターフェースを確認し、AviSynthMinus では公開フィルターとメタデータを別途検証します。

CI は Windows x64/ARM64 の MSVC・clang-cl、Linux x64/ARM64、macOS x64/ARM64、C のみの構成、Linux ASan/UBSan を対象に設定されています。

Windows x64 Release 構成には、C インターフェーステストを含む 4,199 件のテストがあります。

全測定結果は PERFORMANCE.md にあります。522 件のフィルター条件584 行のカーネル比較108 行の長いカーネルの補足記録を含み、補足条件は主監査と重複します。下表は全測定分類です。新/上流の時間比で、1 未満が高速です。中央値は条件ごとの比率で、合計時間の高速化率ではありません。極小負荷は除外します。

分類 有効条件数 AVX2 中央値 AVX2 範囲 Native 中央値 Native 範囲
chroma 25 1.004 0.647–1.390 0.943 0.692–1.461
depth 132 1.141 0.908–1.506 0.994 0.837–1.204
depth-alpha 13 1.067 0.976–3.307 1.028 0.904–2.917
floyd 17 2.154 1.612–2.849 2.113 1.592–2.739
greyscale 21 0.940 0.293–1.297 0.962 0.291–1.304
interlaced 9 1.007 0.215–1.168 1.081 0.227–1.352
layout 23 0.955 0.126–1.820 1.083 0.108–1.854
luma 15 0.906 0.598–1.047 0.869 0.592–1.325
matrix-filter 54 1.056 0.730–1.834 0.974 0.610–1.460
ordered 16 1.151 0.735–1.705 0.967 0.630–1.323
resize 144 1.028 0.284–2.875 0.960 0.406–1.770
resize-composed 19 1.008 0.599–1.644 0.879 0.475–1.068
yuy2 11 0.894 0.249–1.250 0.891 0.224–1.222

Ryzen 9 7940H、Windows x64、clang-cl 22.1.3 Release、論理 CPU 12 固定です。上流は 5c82777b374bdef16e13007a11e77d735ac1e4eb で、native は利用可能な AVX512 を含み、本モジュールは Highway AVX3_ZEN4 を使用します。フィルター時間は GetFrame と出力割り当てを含みます。詳細表 に双方の時間、条件、版、出力一致の注意点を記載しています。測定した本モジュールの出力は C と一致し、一部の上流出力には数値差があります。

性能は形式、カーネル幅、CPU、コンパイラーによって変わります。長いカーネルを使う水平リサンプリングと Floyd–Steinberg には、一部の処理条件で上流実装との既知の性能差が残っています。

比較では入力、ビルド設定、CPU 制限、計測範囲をそろえてください。カーネル単体とフィルター全体は別の計測です。広い SIMD が常に高速とは限りません。性能報告には時間とともに出力比較を含めてください。

開発と貢献

メンテナーが技術方針、変更のレビュー、リリースを担当します。不具合報告、提案、貢献を歓迎します。数値動作、公開インターフェース、重要な設計変更については、実装前に目的と方針を相談してください。

本プロジェクトでは実装、テスト、レビューに AI を活用します。貢献には問題、方法、検証内容、AI の関与を記載してください。報告にはコミット、OS、CPU、コンパイラー、ビルド設定、入出力形式、最小再現例を含め、性能報告には画像サイズ、CPU ターゲット、計測方法も記載してください。

謝辞とライセンス

本モジュールは AviSynth、AviSynth+、AviSynthMinus とその貢献者の成果に基づき、SIMD に Google Highway を使用します。原作者と、テスト、報告、改善に協力する皆様に感謝します。

開発に使用する LLM サブスクリプションをご支援いただいた SB.SB に感謝します。

GPL バージョン 2 以降と、AviSynth から継承したリンク例外を原文・適用範囲のまま使用します。詳細は LICENSE を参照してください。ソースの著作権表示を維持し、第三者コンポーネントはそれぞれのライセンスに従います。新しい C インターフェースの提供によって既存の例外の範囲が広がることはありません。