asfのmux

いまDirectShowを使ったアプリを作ってんだけど、DirectShowって便利なんだけど結構めんどい。
特に僕が作ってるのはC#ベースのアプリケーション。で、DirectShowってのは基本C++というかCOMの技術。
その辺のマーシャリングがとってもメンドウ。
DirectShowLibってのを使ってるからかなりラクはできてるんだけど、でもそれだけじゃ足りないし。


んで今困ってるのがMediaType.asfで作ったマルチプレクサでファイルを出力するってところ。
ファイル出力自体はできてて、muxのプロパティページを表示させて設定を変えるものできてる。
つうかasfのプロパティページ見にくすぎ。もうちょっとましなものでもよさそうなのに。


んで何に困ってるかというと、なぜか出力した動画がすべて320×240のサイズにリサイズされてしまうということ。
自前のトランスフォームフィルタがソースフィルタとmuxフィルタの間に挟まってるから出力するサイズ指定はアプリケーションで自由自在。
実際aviに吐き出す場合は問題なく指定したサイズ通りになる。


これはおかしいといろいろと調べたんだけど、資料の少なさに泣けてくる。
日本語のページなんてはなっから期待してないけど、英語のページもほとんど見つけられない。
msdnはいつものようにわかりにくい。
といっても参考になるのがmsdnとちらほらと見つけたコードの断片しかないからしょうがない。


そしてわかったことがなにやら自前でasfのプロパティの設定、プロファイルというらしいのだがそれを設定すればできそうだということ。
と言ってもそれをおこなうのはすべてCOMオブジェクト。
そして僕はC#でアプリケーションの開発中。
つまり、必要なCOMオブジェクトのComImportを書いてあげないといけない。
結局最後はヘッダファイルをじかに参照しながらガリガリと手のお仕事に。


もちろん探せばそれらのC#の定義は見つかりそうな気もするが、探すのも面倒くさい。
つうかさ、msdnのCOMインタフェースに定義されてる関数一覧って実際にヘッダに書いてあるインタフェース定義内にあるvirtualな関数定義の順番と違うみたいだね。
ということはmsdnの関数一覧を基にしてComImportは書けないってこと?
確かC#ってComImportのあるInterfaceの関数定義の順番でC++のvfptr作るんじゃなかったけ?
この辺の仕組みをまだちゃんと理解できてないからあまり適当なことは書けないのでこのぐらいにしておこう。


なんやかんやで必要な定義を書いて、テスト代わりにmuxのプロパティページで設定したプロファイルを出力してみた。


……やっぱり最終的なサイズが320×240になるような指定がされている。たぶんだけど。
ということでそこを修正して再びプロファイルを設定という流れでできそうかな。


というところまで確認して今日は終わり。
思わぬところで躓いてしまった。