« ブログコメントに関する設定変更 | メイン | CRCチェック スルー »

2005年12月11日

動画再生エンジン開発日誌:: libtheora-mmx

    

昨日のプレーヤーは絵が出なくて楽しくなかったので、Overlayを使って絵が出るようにした。

mmxtheora.zip
※これを使用したことによって発生するいかなる問題に対しても私は責任を負いません。自己責任で使ってください。

使用上の注意
ビデオカードがオーバーレイとオーバーレイでのYV12をサポートしていないと再生できない。(例外投げっぱなしなので、いきなり落ちると思われます)
再生するファイルは、同一フォルダに置かれた"test.ogg"のみ。
昨日同様SSEオプション付きなので、PenIII or Athlon XP以降でのみ動作。
DirectXが必要。
デバイスをロストしてもリセットしないので、タスクマネージャは事前に出しておいたほうが良い。

後、ついでに表示する時間も待つようにしたので、ほぼキチンとした時間で描画されているはず。
ただし、timeGetTimeで時間を取得しているために1ms単位になっているせいか、プレゼンテーション時間をms単位でぶった切っているせいか、バッファリングしていないせいか、たまにカクカクする気がする。

libtheora-mmxは、VCでビルドできなかったので、インラインアセンブラで書かれているところはMinGWでコンパイルした。
MinGWでコンパイルしたのをVCのライブラリアンで固め、そのライブラリをリンクした。
大丈夫なのかなぁ? と思ったが、いけた。(っぽい)

で、実際の効果だが…… 気持ち軽くなった気がするようなしないような。
解凍して出来るovplayermmx.exeがlibtheora-mmxを使ったもので、ovplayer.exeは使っていない。

VBRで圧縮した時、クオリティを高く(80%程度)するとかなり重くなるようだ。
640*480*30fpsをAthlon XP 1600で再生したら、かなり動きの激しいシーンでドロップフレームが発生した。(P4 3GHzでは余裕)
60%程度にしたらギリギリ落ちていなさそうだった。
テストパターンがそれほど多くないのではっきりとは言えないが、どうも高速にスクロールする場面で負荷がかなり高くなるようだ。


RGBへの変換なし(YV12のまま)での出力&音のデコードを行っていない状態でこれとは……
現状のままだとしても、音が入ることを考えると2GHzぐらいは欲しいだろうか。
しかも、オーバーレイでのYV12サポートがあるとして。
激しいシーンがいきなり現れない&続かなければ、バッファリングすることによって何とかなるかもしれないけど。。。
さて、どうしたものか。
libtheora本体にも手を加えていかないとダメかなぁ。



投稿者 Takenori : 2005年12月11日 05:52



コメント

37.27秒 800x600、video 2800Kbps, audio 90kbps のストリームでテストしました。

ううむ、ウチでも再生は所どころガクガクしますね。タスクマネージャをみていると、ウチの環境 (Athlon64 X2 dual core processor 4800+ 2.4GHz) だと普段は10~20%をさまよっていますが(ただしデュアルコアなのでシングルコア換算だと20~40%)、再生がガクガクしているところでCPU使用率が3~5%に落ちてしまいます。

あと、

http://www.kaede-software.com/2005/12/theora_3.html

にあったバイナリの実行時間は 32.131 秒かかっていました。37.27秒のストリームを31.131秒でデコードしたと言うことは、これはシングルスレッドでの動作ですから、 CPU 1個分を 84% ほど喰ってることになります。

ちなみにそのSamplePlayerをlibtheora-mmx-1.0alpha5 (mingw) でコンパイルしたところ、26.796秒かかっていました。これでもCPU使用率は72%の計算です。

同じストリームをmplayerで再生すると、ビデオを出力してさらに音声もデコードしているのに、CPU使用率は(mplayerの表示では)ビデオで35%、オーディオで9%ほどです。タスクマネージャで見られるCPU使用率もだいたいそのような感じです。

この差がどこにあるのかはわかりませんでしたが、何かおかしな感じを受けます。

投稿者 W.Dee : 2005年12月11日 12:25

theora-expでやってみました

theora-expの中にある(libtheoraの中にもありますが)dump_video中のビデオをファイルに書き出している部分をコメントアウトし、SamplePlayerと同じようなことをやるように改造しました (SamplePlayerはtheora-expではコンパイルできなかったので)

theora-exp のコンパイルオプションなし(最適化なし)
64.624秒

theora-exp -O2 -march=athlon-xp -fomit-frame-pointer -frename-registers
29.687秒

theora-exp -O2 -march=athlon-xp -fomit-frame-pointer -frename-registers -DOC_X86ASM (アセンブラ使用)
21.203秒

アセンブリルーチンを使用するとかなり速くなるようですね。

投稿者 W.Dee : 2005年12月11日 13:40

theora-expを使うとだいぶ速くなるようですね。
そちらに差し替えてみます。
ただ、それでもまだmplayerに届いていないのがなんとも。

W.Deeさんの結果を見るとボトルネックがなんとなくわかったような気がします。
liboggが足を引張っていそうです。
なぜか4KBずつストリームから読んで、liboggの方へ書き込むような処理があるのですが、データレートが高くなるとここに時間を取られている気がします。
ただ、packかsegmentか名前忘れましたが、liboggの最小単位のサイズが4KBぐらいとか仕様に書かれていた記憶があるので、4KBずつつなげていく処理は必要かもしれません。(ある程度幅があったのですが、4KBが推奨値とかになっていた気がします)
でも、他にもなんか変な気がする処理があるので、liboggの部分は作らないとなと思っていました。
この部分に手を入れてtheora-expを使えば、それなりの速度になるかもしれませんね。
それでも重そうですが。
YV12からRGBへの変換が入るともっと重くなりますし。
でも、WMV程度の負荷にはなりそうな予感がします。

投稿者 Takenori : 2005年12月11日 17:34


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