まるもさんの日記の動きベクトルについてが非常に分かりやすい。
ffmpegとx264を調べたところ以下の動きベクトル算出法が見つかった。
- full motion estimation – full search(alias ‘esa’ – exhaustive search algorithm)
- EPZS motion estimation (alias ‘dia’ – diamond search)
- tesa motion estimation – transformed exhaustive search algorithm
- log motion estimation
- phods motion estimation – parallel hierarchical one-dimensional search algorithm
- hex motion estimation – hexagonal search
- umh motion estimation – uneven multi-hexagon search
- iter motion estimaion – iterative search
ffmpegで通常使われるのはEPZSというアルゴリズムだが、このアルゴリズムはdiamond search→MVFAST→PMVFAST→EPZSと改善に改善の論文を重ねて作られている。ffmpegではdiamond searchのエイリアスでEPZSが選択される。
full searchやumhについてはffmpegの中には入っておらず、x264のソースコード内にて発見した。
SIMD化されたCPUで上手く動作するのだろうか、気になった。アセンブリで書かれているのはiDCTとDSPの部分をMMX, SSE化しているものが多かった。ffmpeg、x264ともにマルチスレッドや64ビット化には対応しており、ベンチマークしている方々がいらっしゃる。x264のcell化は無理だったのか、と、ふと思う。
このコード群をJAVAやRubyにしたら面白いかなーと思いつつ、別に面白くないやと思う今日の午後。