DirectShow経由でフィルタを組むことでとりあえず再生だけはできるようになりました。
vorbisのキャッシュ処理にちょっと手間取っちゃいましたけど・・・
まだシーク処理の実装ができていないのでそれを実装すればとりあえず第一段階が完了なのですが・・・。
予想以上に再生でCPUを使っているなあというのが第一感想。前に作った自作の動画フォーマットより処理を食っているのがびっくりでした。
libtheoraのライブラリ自体が悪いとはとても思えないので、考えられる問題点は
・デコードしたデータを一度メモリキューにキャッシュする構造なのでその部分のメモリコピーで時間を消費している
・YUV=>RGB変換のアルゴリズムがよくないために変換で無駄に時間を消費している
前者がかなり響いていると思われますが・・・。
後者はとりあえずSSE2を使った実装ですが、適当に考えたアルゴリズムなので変換にロスがある可能性があります。
この辺は最適化をしながら見ていくしかないですね。
今のところ実装で問題となった部分が
・vorbisのデコード処理がlibvorbisを直接呼ぶ形になっていて、サウンドバッファがかなり細切れで出てくるので結合作業がいる場合があり
・theoraのフレームに対してキーフレームの判定処理があいまい(キーフレームの判別ルーチンはあるが、フレーム番号との対応がとりづらい)
・theoraの出力は基本的にYV12のような各色成分の平面で出てくるのでサーフェイスなどで扱うときに色変換を自前でやる必要性が高い
というところでした。
もう少しちゃんと実装しないとまずいのかもしれませんね・・・。