というわけでぐだぐだと言っていましたがdsexfilterの0.02を公開しました。
これの一つ前の記事からわかると思いますが、WebMのサポートを追加したものです。ちょっとVP8のライセンス料問題が怖いですが・・・。
OggTheoraとWebMの対応でHTML5の動画フォーマットの大半に対応したことになるのである意味目的達成です。
組み込む時に違う意味でかなり苦労しました。その点をいくつか紹介。
結局libwebmはうまく使えなさそうだったのでwebmdshowに含まれている2つのフィルタのコードを借りることに
そもそも最終結果がDirectShowで使う、とわかっているのにうまく動かなくなる可能性のあるコードを組むのもどうかと思いました。
自前でwebmを使う可能性があるなら組み込む価値はありそうですが、自前のADVシステムにはすでにOggTheoraと独自フォーマットがあるのであまり意味はなさそうだな、と。
Vorbisのデコード処理はデコードフィルタを実装することで解決
デコード処理自体はOggTheoraの実装で動作がわかっていたのでそれほど難しくはなかったのですが、フィルタとして使う時に
- フォーマット情報はどのように渡されるのだろうか?
- libvorbisはoggpacketを受け付けるように書かれているが、それはどうしようか?
という問題はありましたが、デバッグで無理矢理情報の方法を取得したり、oggpacketを偽装したりして解決しました。
WindowsSDKに含まれるDirectShowのライブラリとwebmdshowに含まれるDirectShowのライブラリの名前が衝突している
WindowsSDKがなくてもコンパイルできるようにするためにwebmdshowには必要となるDirectShowの処理(CMediaTypeとかCMediaSampleとか)が実装されているわけですが、
そうなると名前が同じになるのは目に見えていますね・・・。とりあえずnamespaceを付け回って名前空間的に分離して解決しました。
おかげでライブラリサイズがかなり大きくなりましたが。
webmdshowとlibvpxは厳密には64bitのコンパイルに対応していない
「厳密には」であり、一部のコードを書き換えることでコンパイルはできます。あまり信用性がなくなりますが・・。
特にlibvpxには一部処理をアセンブラで記述しているのでその部分をちゃんとx86とx64でコンパイルし直さないと大変なことになります。
IGraphBuilder::RenderFileを使った時にWebMの読み込みがうまくいかないことがある
というよりは、WebMがMatroskaの拡張系になっているので、それに応答するフィルタがあると先に処理に割り込まれるような感じです。
一応SourceFilterからRenderを使うパターンでは正常に動くようになっています。それでもGUIDにはMatroskaのIDが現れているので強制的に対応させています。
ちなみに、この記事を書いた段階でこのプラグインのダウンロード数は一桁台でした。
更新してもあまり意味のないプログラムの実例かもしれません。
そろそろWindow Mode Patchの大規模な修正を行おうかと思っていますが、考えているのが
DirectDraw(1~7)の動作をすべてDirect3D9で乗っ取ってしまおうか
ということです。三次補間処理を使う時にPixelShaderが必要になってしまい、DirectDrawではどうしようもないので内部的にDirect3D9で行うようにしようかと思っています。
が、これはかなり難問で、つまりはDirectDrawのドライバを書くことに等しい作業です。(グラフィックボードメーカーのプログラマがやるような作業)
どうしようかな~。
ADVシステムを使う方の仕事は・・・。まあ、この業界の常と言うことで対象のプロジェクトの進行が遅れているため出番がありません。売り込みにでも行きましょうか・・・。
更新したシステムを出してから独自フォーマットの処理を追加して公開しようかと思っていましたが、今から公開してもいいかもしれません。使ってくれる人がいるなら、という条件付きで・・・