プログラミング
FFmpeg 9.0 リリース
要約
FFmpeg 9.0 "Lei" がリリースされ、swscaleライブラリの全面的な書き換え、Vulkanバックエンドの追加、WebPアニメーションデコードのサポート、NVENCのAV1階層Bフレーム参照モード対応、RISC-V最適化などが含まれます。今回のメジャーリリースでは、7つの主要ライブラリのABIが変更され、コードベースの大幅なクリーンアップが行われました。
全文翻訳
04 AUG 2026 VIDEOLAN 13 min read FFmpeg 9.0 FFmpeg 9.0: swscale, Vulkan, WebP, asm and a big cleanup
FFmpeg 9.0 "Lei" がリリースされました。FFmpegはマルチメディアのあらゆる分野、あらゆるプレイヤーからあらゆるトランスコーディングワークフローまで、その中核を担う存在であり、VLCもlibavcodecとlibavformatを多用しています。FFmpegとVideoLANのコミュニティは常に緊密であり、FOSDEMやVDDでしばしば会合し、多くの開発者を共有しています。
FFmpeg 9.0 はメジャーリリースです。8.1 "Hoare" の4ヶ月半後にリリースされ、160人以上の著者から2200以上のコミットがあり、1781ファイルに触れ、約85000行を追加し、33000行以上を削除しました。7つのライブラリすべて(libavutil 61, libavcodec 63, libavformat 63, libavdevice 63, libavfilter 12, libswscale 10, libswresample 7)のメジャーバージョンが引き上げられたため、全体でABIの破壊が発生し、FFmpegがメジャーアップデートの際にのみ許容する大規模なクリーンアップが行われました。サブシステムごとに見ていきましょう。
swscale, 書き換え
今回のリリースで最も重要な長期的な作業は、機能リストには見えにくいものです。それは、Niklas Haasが主導したswscaleの数年にわたる書き換えで、このサイクルだけでlibswscaleに300以上のコミットがあり、Ramiro PollaもARM側でそれに続きました。古いswscaleは20年間の、フォーマット固有のカスタム変換コードでした。新しいアーキテクチャは完全に異なります。すべての変換は、基本的な操作(読み込み、スウィズル、線形変換、スケーリング、パッキング…)のリストに分解され、オプティマイザがそのリストを単純化・分割し、バックエンドがそれをカーネルのチェーンにコンパイルします。9.0では、これがユーザーにも見えるようになります。公開APIにSwsBackendセレクタが追加され、バックエンドにはテンプレートベースのCリファレンス、高速なmemcpyパス、チェーン化されたx86 SIMDカーネル、チェーン化されたAArch64 NEONカーネル、そして同じ操作リストをCPUまたはGPUで実行できるようにコンピュートシェーダーにコンパイルするVulkan SPIR-Vバックエンドが含まれるようになりました。また、古いフラグのスープの代わりに、スケーリングアルゴリズムを明示的に選択するための新しいSwsScaler列挙型も追加されました。
その下にある正確性のエンジニアリングが私が気に入っている部分です。すべての変換を駆動する定数計算は、浮動小数点ではなく正確に計算される新しい64ビット有理数型に移動され、一連のオーバーフローチェックが単純に削除されました。SWS_BITEXACTを要求すると、Vulkanバックエンドでさえ、線形算術にSPIR-V NoContractionを装飾してGPUが乗算・加算を融合できないようにします。これをオフにすると、より高速な行列乗算バリアントが得られます。また、オプティマイザは、操作リストをプレーンごと、およびリンクされたサブパスに分割できるようになり、プレーン変換は1つのモノリシックなループではなく、プレーンごとの独立したカーネルにコンパイルされます。新しいパスはまだSWS_UNSTABLEの背後にありますが、レガシーコードが安定したデフォルトとなっています。このサイクルでは、AVX2パスによるパレット読み込み、およびフォーマットネゴシエーションでのインターレースコンテンツの適切なモデリングとともに、新しいアーキテクチャにパレット(PAL8)サポートも追加されました。アーキテクチャは現在配置されています。このトピックに関する前回のVDDでのNiklasの講演を見るべきです。
libavcodec
libavcodecには700以上のコミットがありました。最も重要なもの:FFmpegはついにアニメーションWebPをネイティブにデコードできるようになり、それに伴うデマルチプレクサも追加されました。これは2015年にオープンされたチケット#4907をクローズするもので、「なぜFFmpegは最初のフレームしかデコードしないのか?」というスレッドの常連でした。パッチは Josef Zlomek によって開始され、Ramiro Polla が最終的に完成させました。RGBとYUVのケースが特に複雑でした。AACデコーダーは、DAB+デジタルラジオで使用される960サンプルフレームを処理できるようになりました。NVENCはAV1階層Bフレーム参照モード、Video Codec SDK 13.1との互換性を獲得し、12ビット入力フォーマット(10ビットに切り捨て)を受け入れます。クランク付きの小さな黄色いコンソールであるPlaydate用のビデオエンコーダーとミキサーがあります。デルタコーディングとzlib圧縮を使用して1ビット、400x240のビデオを生成します。重要ではありませんが、クールです。新しいデコードAPI、avcodec_receive_frame_flags() が追加され、フレームスレッディング遅延をバイパスし、可能な限り早く次のフレームを返すAV_CODEC_RECEIVE_FRAME_FLAG_SYNCHRONOUSフラグが導入されました。これは、それ以外の時間はスレッド化されたデコードを維持したい低遅延コンシューマーに役立ちます。
アセンブリとSIMD: x86, NEON and RISC-V
FFmpegは依然としてアセンブリを記述しており、このサイクルは多忙でした。x86ディレクトリには約200のコミット、ARMディレクトリには約100のコミットがありました。x86では、Andreas Rheinhardtがツリーの中で最も古いDSPコードを現代に引き上げる作業が多く行われました。ハーフペルモーション補償コード(hpeldspとfpel、MMX時代に遡る)はSSE2にポートされ、H.264イントラ予測はAVX2水平予測子を獲得し、pp7ポストプロセッシングDCTはMMXを置き去りにし、最後のMMX残骸はmpegvideoencから削除されました。モーション推定比較関数は、メディアンSADのSSSE3バージョンを獲得し、新しいswscale x86バックエンドはNASMマクロからSIMDカーネルを生成します。これには前述のAVX2パレット読み込みパスも含まれます。
ARMでは、NEON yuv2rgbパスが、パックRGB、プレーンGBR、16ビットRGB、yuva420p出力(ビッグエンディアン16ビットフォーマットを含む)を処理するために、一度に2ライン処理するように再設計されました。HEVCイントラ角度モード10と26はNEON実装を獲得し、AAC SBRとfloat DSPループは現代のパイプラインをより良く埋めるためにアンロールされました。しかし、最も興味深いARM作業はswscaleに隠されています。Ramiro Pollaは、命令レベルのIRとビルダーAPIを持つ小さなアセンブラフレームワークであるrasmの上に、新しいAArch64バックエンドを構築しました。これはビルド時にアセンブラテキストとしてチェーン化されたNEONカーネルを生成し、後で実行時コード生成を可能にするように設計されています。
RISC-Vは今回のFFmpegでは静かでしたが、hevc_add_resとpixelutils SADのRVV最適化、およびポータビリティ修正がありました。マルチメディアエコシステムにおけるRISC-Vベクトルのエネルギーの大部分は現在dav1dに注がれており、FFmpegはdav1dベースのAV1デコードを通じてそれを無料で利用しています。
カメラRAWとFFV1
今回のリリースのテーマの1つは、オープンソースでのカメラRAWビデオです。ネイティブProRes RAWデコーダー(8.0で導入)は、このサイクルでリファレンス実装と同期されました。ビットストリームから線形化カーネルを解析し、フレームクロッピングを設定し、新しいAV_FRAME_DATA_RAW_COLOR_PARAMSサイドデータを通じてRAW Bayerカラーパラメータをエクスポートします。これはARRIRAWがロードマップに明確に載っているため、コーデック固有のものとして設計されています。GPUアクセラレーションされたVulkanデコーダーが利用可能であり、Appleプラットフォームでの新しいVideoToolboxデコードも利用可能です。
パイプラインの反対側では、FFV1はBayerピクセルフォーマットのエンコードを学習しました。RAWセンサーモザイクを、デベイヤーリングせずにロスレスで圧縮します。Lynneはこれをネイティブコーデックで実装し、最適な可逆色変換係数のためのスライスごとの検索を行い、独立したGPUアクセラレーションされたVulkan FFV1エンコーダーおよびデコーダー(はい、FFmpegはGPU上でFFV1をエンコードおよびデコードできるようになりました)でも実装しました。検索は独自のコンピュートパスとして実行されます。作業の一部はSovereign Tech Fundによってスポンサーされました。Vulkanエンコーダーは、Rice-plus-remapコーディングモードを備えた32ビットfloat RGBパスも獲得し、RAW 16ビットfloatを読み取る際にデノーマルを保持するように注意しています。FFV1は保存マスターに広く使用されており、GPU速度でのカメラセンサーデータのロスレス圧縮は、デジタル保存のための新しい有用な機能です。
VulkanとGPU
Vulkanの作業は、コーデックおよびフィルターレイヤー全体で拡大し続けています。
新しいv360_vulkanフィルターは、コンピュートシェーダーで360°投影リマッピングを行い、ツリーの中で最もコストのかかるフィルターの1つをGPUアクセラレーションします。APV、Samsungのプロフェッショナルプロダクションコーデック(8.0で追加)は、Vulkan GPUアクセラレーションデコーダーを獲得しました。インフラストラクチャの重要な変更:ランタイムシェーダーコンパイルは廃止されました。すべてのVulkanシェーダーはビルド時にSPIR-Vにコンパイルされ、残りのフィルター(scale, nlmeans, blackdetect)もそれに応じてポートされました。スケールフィルターを実行するためにランタイムにGLSLコンパイラを配布する必要はなくなりました。swscaleのGLSLバックエンドは削除されました。