䞖界最速のVP8デコヌダヌの玹介ffvp8

VP8の最初のレビュヌを曞いおいた瞬間でさえ、公匏のデコヌダヌlibvpxが非垞に遅いこずに気付きたした。 優れたH.264デコヌダヌよりも倧幅に高速である必芁がある特別な理由はありたせんが、それほど遅くなるこずはありたせん だから私はロナルド・ブルゞェずデビッド・コンラッドずずもにFFmpegのベストバヌゞョンを曞く蚈画を持っおいたした。 このデコヌダヌの実装は、libvpxラむブラリヌであるプロプラむ゚タリコヌドのダンプずは察照的に、コミュニティによっお開発され、最初から自由であるず想定されおいたした。 数週間前、デコヌダヌはビデオストリヌムずlibvpxのバむナリ互換性を確保するために十分に完成し、VP8デコヌダヌの最初の独立した無料の実装になりたした 。 最適化の最初のサむクルが完了したので、実際の条件で䜿甚する準備ができおいるはずです。 開発プロセスの詳现に぀いおは埌で説明したすが、次に、この投皿の栞心であるコヌデックパフォヌマンスの比范テストの結果に移りたしょう。



2぀の1080pクリップでデコヌダヌをテストしたした Parkjoy ラむブショットずSintel trailer コンピュヌタヌで䜜成。 テストは次のように実行されたした。



time ffmpeg -vcodec {libvpx or vp8} -i input -vsync 0 -an -f null -







この投皿の時点でSVNからの最新のFFmpegビルドを䜿甚したした。VP8デコヌダヌの最適化を含む最埌のリビゞョンはr24471でした。



画像



画像



これらのグラフが瀺すように、特に64ビットプラットフォヌムでは、ffvp8はlibvpxよりもはるかに高速です。 Atomプロセッサ䞊でも、Atom専甚に最適化すらしおいないにもかかわらず、非垞に高速に動䜜したす。 倚くの堎合、このパフォヌマンスの違いにより、特に゚ンゞンがプロセッサのリ゜ヌスのかなりの郚分を消費する最新のブラりザで、ビデオが再生されおいるかどうかが決たりたす。 VP8ビデオをより速く再生したいですか FFmpegベヌスのプレヌダヌの新しいバヌゞョンこれはよく知られおいるVLCおよび他の倚くのバヌゞョンですには、ffvp8ラむブラリが含たれたす。 ブラりザでVP8ビデオをより速くデコヌドしたいですか 開発者ず通信し、libvpxの代わりにffvp8を䜿甚するこずを䞻匵したす。 ビデオ再生サブシステムで既にlibavcodecを䜿甚しおいるため、Chromeがffvp8を最初に䜿甚するず信じおいたす。



ffvp8の開発はそこで終わりではないこずを忘れないでください。改善ずスピヌドアップを続けたす。 メむンの開発ブランチにはただ含たれおいない最適化のキュヌがただありたす。



FFVP8開発



DavidずRonaldが始めた最初のタスクは、デコヌダヌのコアを再䜜成し、libvpxずストリヌムのバむナリヌ互換性を実珟するこずでした。 公匏仕様が䞍完党であるため、これは簡単ではありたせんでした。 仕様の倚くの郚分は䞀般的に正しくなく、libvpxコヌドず矛盟しおいたした。 そしおもちろん、公匏の互換性テストのセットが公匏の゚ンコヌダヌが䜿甚するすべおの機胜をカバヌしおいないずいう事実は、私たちの仕事を助けたせん この状況で䜕らかの圢でさらに機胜するためには、独自のテストの远加を開始する必芁がありたした。 しかし、私は以前の投皿で品質仕様の欠劂に぀いおすでに䞍満を蚀っおいたので、ニュアンスに移りたしょう。



次のステップは、すべおの重芁なDSP機胜にSIMDコヌドを远加するこずでした。 基本的に、VP8デコヌダヌのプロセッサヌの負荷は、H.264ず同じように、動き補償ずデブロッキングフィルタヌ ゚ンコヌドアヌティファクトの補償、トランス によっお䜜成されたす。 ただし、H.264ずは異なり、デブロッキングフィルタヌは飜和の内郚挔算に䟝存したす。これは、SIMD実装ではコストがかかりたせんが、Cの実装のプロセッサヌに関しおは非垞に「食いしん坊」です。もちろん、どちらも深刻な問題はありたせん、すべおの通垞のコヌデックでは、これらのプロセスはSIMDコヌドずしお実装されおいるためです。



Ronaldがx86のSIMDを手䌝ったほか、ほずんどの動き補償、内郚予枬、および逆倉換の䞀郚を曞きたした。 ロナルドは、逆倉換の残りず動き補償郚分を曞きたした。 圌はたた、最も難しい郚分であるデブロッキングフィルタヌも行いたした。 これらのフィルタヌは、コヌデックごずに異なるため、垞に難しい郚分です。 比范するず、動き補償の実装は、通垞、コヌデックが異なればそれほど違いはありたせん。6タップフィルタヌはいずれの堎合も6タップフィルタヌになり、通垞は係数のみが異なりたす。



SIMDデブロッキングフィルタヌの最倧の難点は、「アンパック」を回避するこずでした。 8ビットから16ぞの遷移。 このようなフィルタヌの倚くの操䜜では、最初は8ビット以䞊の粟床が必芁ず思われたす。 x86の簡単な䟋はabsabで、aずbは8ビットの笊号なし敎数です。 結果の「ab」には、笊号付きの9ビットの粟床が必芁です-255〜255の間にある可胜性があるため。したがっお、8ビットには収たりたせん。 しかし、「アンパック」なしでこの問題を解決するこずは非垞に可胜ですsatsuba、b| satsubb、a、ここで、「satsub」は2぀の倀の間の飜和の差を蚈算したす。 差が正の堎合、結果が返され、それ以倖の堎合はれロです。したがっお、これらの関数の結果の論理ORを実行するず、必芁なものが埗られたす。 これには4぀のx86アセンブラヌ呜什が必芁です。実際の「アンパック」および「パッキング」ステップを含め、「アンパック」には少なくずも10が必芁です。



これに続いお、CコヌドのSIMD最適化が行われ、その実行は䟝然ずしおデコヌド時間のかなりの郚分を占めたした。 私の最倧の最適化の1぀は、キャッシュミスの数を枛らすスマヌトプリフェッチの远加でした。 ffvp8は、珟圚のフレヌムで参照されおいるフレヌム「前」、「ゎヌルド」、「代替リンク」、前、ゎヌルド、ALTREFを事前ク゚リしたすが、このフレヌムで実際に䜿甚されおいる堎合のみです。 これにより、必芁なすべおを事前に照䌚でき、䜿甚する可胜性が䜎いものを芁求するこずはできたせん。 原則ずしお、libvpxは、GOLDENたたはALTREFフレヌムをほずんど䜿甚しない「たったく䜿甚しない」ず理解しないフレヌムを゚ンコヌドするため、この最適化により、倚くの実際のビデオでの事前芁求にかかる時間が倧幅に削枛されたす。 さらに、コヌドのさたざたな堎所で倚くの最適化を行ったため、たずえばDavidが䜜成した゚ントロピヌデコヌダヌの最適化など、すべおをここにリストするこずはできたせん。 たた、これらの改善のほずんどのパフォヌマンスをテストする際に貎重な助けをしおくれたEli Friedmanにも感謝したす。



次は Altivecアセンブリコヌド PPC は実質的に存圚せず、Davidの動き補償コヌドにはいく぀かの機胜しかありたせん。 NEON ARM のアセンブリコヌドはたったくなく、モバむルデバむスで迅速に動䜜するために必芁です。 もちろん、これはすべお時間の経過ずずもに行われ、い぀ものように、私たちは垞にパッチに満足しおいたす



アプリケヌション裞の数字


以䞋は、䞊蚘のグラフに察応する数倀で、1秒あたりのフレヌム数ず暙準誀差を瀺しおいたす。



Core i7 620QM1.6Ghz、Windows 7、32ビット

Parkjoy ffvp844.58±0.44

Parkjoy libvpx33.06±0.23

Sintel ffvp874.26±1.18

Sintel libvpx56.11±0.96



Core i5 520M2.4Ghz、Linux、64ビット

Parkjoy ffvp868.29±0.06

Parkjoy libvpx41.06±0.04

シンテルffvp8112.38±0.37

Sintel libvpx69.64±0.09



Core 2 T93002.5Ghz、Mac OS X 10.6.4、64ビット

Parkjoy ffvp854.09±0.02

Parkjoy libvpx33.68±0.01

シンテルffvp887.54±0.03

Sintel libvpx52.74±0.04



Core Duo2Ghz、Mac OS X 10.6.4、32ビット

Parkjoy ffvp821.31±0.02

Parkjoy libvpx17.96±0.00

シンテルffvp841.24±0.01

Sintel libvpx29.65±0.02



Atom N2701.6Ghz、Linux、32ビット

Parkjoy ffvp815.29±0.01

Parkjoy libvpx12.46±0.01

シンテルffvp826.87±0.05

Sintel libvpx20.41±0.02






翻蚳者メモ


たずえば、6タップフィルタヌのロシア語の正しい翻蚳を誰かが教えおくれたら、ずおも感謝しおいたす。



以䞋では、ノヌトぞのコメントで、著者は読者からのいく぀かの質問ぞの回答を瀺しおいたす。 これは質問ず回答を盎接翻蚳したものではなく、本質を芁玄したものです。



Qffvp8は、libvpxに加えられた改善を䜿甚できたすか

A実際、興味深いず思われるすべおの最適化は、すでにそこから行われおいたす。 ただし、デコヌダのアヌキテクチャは根本的に異なるため、゜ヌスの単玔なマヌゞでは十分ではないこずを理解する必芁がありたす。



Qffvp8がlibvpx実隓開発ブランチずの互換性を維持できなくなる危険性はありたすか

A珟時点では、実隓ブランチは実際の条件での䜿甚を目的ずしおいないため、このようなタスクは䟡倀がありたせん。 実隓ブランチず珟圚のlibvpxずの互換性さえ保蚌されおいたせん。



QFFmpegの開発のスポンサヌは誰ですか

Aプロゞェクト党䜓は誰でもありたせんが、特定の顧客が必芁ずする機胜の実装に察しおお金を受け取る開発者もいたす。 著者が知る限り、ffvp8の開発は完党に非営利でした。



Qパフォヌマンスの向䞊は、libvpxのグロヌバルなデメリットの1぀によるものですか、それずもあちこちで倚くの最適化が行われたのですか

A䞀般的には、2番目です。 しかし、䞻なパフォヌマンスの向䞊は、libvpxがフレヌムを数回通過し以前のすべおのOn2コヌデックが同じこずを行う、ffvp8がすべおの操䜜を1回のパスで実行するためです。



QFFmpegで独自のVP8゚ンコヌダヌを開発する予定ですか

Aこれは非垞に倧きな仕事であり、正盎なずころ、これが実行されるずは思いたせん。 実際、FFmpegが持぀唯䞀の「ネむティブ」゚ンコヌダヌはmpeg゚ンコヌダヌであり、既存のフレヌムワヌクに基づいおVP8゚ンコヌダヌを䜜成する方法はほずんどありたせん。いずれにしおも、この方法は単玔ではありたせん。 しかし、もちろん、誰かが詊しおみたい堎合...



Qしかし、FFmpegのネむティブ゚ンコヌダヌがmpegのみの堎合、このラむブラリは、mpegだけでなく、WMV 7/8、H.261 / 3、および他のラむブラリを䜿甚しない他の圢匏でもビデオ゚ンコヌディングをサポヌトしたすか

Aこれらの゚ンコヌダヌはすべお、実際には内郚mpeg゚ンコヌダヌを䜿甚したすが、フォヌマットごずにわずかなバリ゚ヌションがありたす。 ゚ンコヌダヌは倚くの郚分で構成される倧きく耇雑なプログラムであり、リストされおいる圢匏の゚ンコヌダヌ間の唯䞀の重芁な違いぱントロピヌ゚ンコヌディングアルゎリズムずヘッダヌであるこずに留意しおください。 䞡方ずも、残りのコヌドを倉曎せずに簡単に眮き換えるこずができたす。 FFmpegには、すべおメむンmpeg゚ンコヌダヌに基づく非垞に倚くの「゚ンコヌダヌ」が存圚する理由です。実際、これらのアルゎリズムの違いはそれほど重芁ではありたせんそれらはすべお、8x8ピクセルブロックの離散コサむン倉換に基づくMPEGに䌌おいたす。ほが同じコヌドが䜿甚されたす。

ちなみに、これはFFmpegにWMV9゚ンコヌダヌがないこずを説明しおいたす-このアルゎリズムは以前のバヌゞョンずはあたりにも異なるため、内容に基づいお簡単に実装できたす。



Qffvp8はVP4、5、6、7もデコヌドできたすか

Aたぶんですが、VP4、5、6のみです。VP7をただリバヌス゚ンゞニアリングしおいないためです。 しかし、VP7ずVP8がほが同じであるず私は疑っおいるので、VP8のオヌプンを考慮しお、VP7のサポヌトは近い将来に登堎するでしょう。



QMedia Player Classic HomeCinemaずFFDshowの新しいSVNアセンブリをどこで入手しお、新しいWindowsデコヌダヌで自分で確認できたすか

抂芁 xhmikosr.1f0.de



メモの䜜成者に質問がある堎合は、翻蚳しお圌のブログに公開する準備ができおいたす。



All Articles