« BCC 用の libjpeg を作るメモ | メイン | 独自エンジンとその有用性 »

2007年10月27日

動画再生エンジン開発日誌:: Theora と MPEG I

    

ある程度再生できるようになったので、プレイヤーをムービー再生エンジン で公開。
でも、MPEG I はブロックノイズ出まくりです。
動き補償辺りが怪しげ。

Theora は、バッファリングの効果か、ベータ2のおかげか、以前のように CPU 負荷が急激に跳ね上がることは少なくなってます。
バッファリングの枚数は別に何枚でもいいんですが、とりあえず5枚にしています。

内部構造的には、スプリッタとデコーダーだけ別になっていて、ファイルの入力ストリームやレンダラーは共通です。
ただ、現状フォーマットはYV12限定ですが。
そのうち、YV12 -> RGB32 変換は対応すると思います。

再生速度は DirectShow と同じようにレンダラーが握っています。
レンダラーは、アロケーターを持っていて、アロケーターはアロケートできる枚数に制限をかけています ( これが上のバッファリング枚数 ) 。
デコーダーは、レンダラーのアロケーターから確保したバッファへデコードが出来ると、そのバッファをレンダラーへ渡します。
レンダラーは、渡されたバッファをキューイングし、バッファに記録されているプレゼンテーション時間になると、そのバッファを画面に表示し、開放します。
バッファが開放されると、そのバッファは再びアロケーターで使えるようになります。
つまり、デコーダーは、アロケーターからバッファが確保できなくなるまでデコードし、確保できなくなると、レンダラーがバッファを開放するまで待ちます。
この構造により、デコーダーはバッファとして作られた枚数まで先読みすることになり、CPU負荷はある程度均等化されます。ただ、再生開始直後は負荷が高くなります。

再生してみるとわかりますが、Theora は思ったほど高負荷ではなくなっています。
これぐらいなら普通に使えそうです。
WMV も対応しようかなぁと思っていましたが、意外と Theora があれば大丈夫かもしれません。

MPEG I はまだ全然ダメです。
BSD系のライセンスで使いやすいのがあればいいんですが……
まあ、綺麗に再生できるようにして、MMX や SSE に対応し、メモリコピー周りを見直せば、OS付属のものよりも速くなるだろうと思ってはいます。
OS付属の MPEG I デコーダーは、パックドタイプの YUV しかサポートしていないので、YV12 が使えません。
そのため、YUV -> RGB24 が入っていて、少し重いです。


Theora 再生できるようにしたら、Vorbis に対応して音を鳴らしたくなってきた。
音を鳴らして、シークも出来るようにすれば、それなりにエンジンとして使えるなぁと。
MPEG I はぼろぼろだけど。



投稿者 Takenori : 2007年10月27日 01:21




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