« Theora の MMX の IDCT その2 | メイン | 逆量子化 と ジグザグ »

2007年11月27日

動画再生エンジン開発日誌:: Theora の MMX その他

    

動き補償の部分を動かすと、ここもおかしかったので修正。
バイトオーダーで、どちらが上位でどちらが下位でというのをよく勘違いしてしまう。

デブロッキングフィルタ の部分は…… 通らない?
フィルタリングレベルを上げても通らない。
と言うことで、放置していたんだけど、違う Full HD サイズの動画を再生すると画像がおかしいことに気付いた。
確かめると、デブロッキングフィルタ の部分を通っている。
どうやら、動画のフレームによって通ったりと通らなかったりするようだ。
垂直方向は問題ないようで、水平方向がおかしいようだ。
水平方向は IDCT の転置と同じような処理が入るので、その辺りが怪しいが、まだ直していない。

ベータ版の間は libtheora の中に手を入れるのはよそうと思っていたんだけど、触り始めてしまった。
MMX の部分のソースは長く触れられていないようだったので、やることにしたんだけど…… オリジナルのソース変わりませんように。
まあ、インラインアセンブラからイントリンシックに書き換えたことで、SSE2 化もやりやすくなったんだけど。
後、インラインアセンブラの cpuid 部分も イントリンシック の __cpuid に書き換えた。
これは VC 用だけど GCC にも相当する関数あるのかな?
まあ、なければインラインアセンブラのままでも GCC なら通るのでいいといえばいいんだけど。

水平方向のデブロッキングフィルタ がまだおかしいとはいえ、すべてのソースが VC でコンパイルできるようになった。
これでプロファイルをとる時、すべての関数を対象と出来るし、全体的な最適化も期待できる。

ちなみに インラインアセンブラ版と速度を比較すると Athlon 64 X2 3800 だと 3% ぐらい遅くなってしまうが、Core 2 Duo E6750 だと 2% ぐらい速くなった。
プロファイルをとって最適化するのを通せばもう少し結果は変わるかな?
まあ、それほど速度差がないようで一安心。
IDCT の部分はアセンブリソースと比べると、かなりコンパイラの最適化だよりな実装になっているので少し気になっていたんだけど。

追記:
MMX の部分変わっていないと思っていたけど 11 / 15 に変わってる……



投稿者 Takenori : 2007年11月27日 17:02




comments powered by Disqus
Total : Today : Yesterday : なかのひと