« キーフレームを入れる | メイン | Commitのタイミング »

2005年10月31日

吉里吉里 ムービー拡張日誌2:: 動的フォーマット変更

    

動的フォーマット変更はサポートしないつもりだったが、そうも行かない様子。
DirectShowのヘルプには次のように書かれている。

DirectShow フィルタを作成する場合、動的フォーマット変更の機構を知っておく必要がある。フィルタがそのような変更をサポートしない場合でも、他のフィルタが新しいフォーマットを要求した場合、正しく応答しなければならない。

サポートしないと他の再生にも支障をきたすようだ。

動的フォーマット変更をサポートするには、IPin::QueryAcceptで変更可能なフォーマットがきた時にS_OKを返す。(不可の場合はS_FALSE)
ダウンストリームへサンプルを渡す時に、アロケーターから得たIMediaSampleでフォーマットが変更されているかどうか確認。
変更されていた場合は、出力するフォーマットを変更する。
と言ったことが必要。

じゃ、QueryAcceptで常にS_FALSE返せばと思い、そうしたらVMRでも再生できず。
以前、サンプルのサイズが縦×横×1などと言うことを書いたが、これが起因しているようだ。
接続確立時はサンプルのサイズは縦×横×1でもいいが、再生が開始された瞬間に縦×横×1.5を要求してくる。
ここでS_FALSEを返したら、メモリが足りませんと言うエラーで再生が出来ない。
Commitは再生が開始された瞬間に行って、そこでアロケーターを確定するのと同じように、メディアタイプも再生が開始された瞬間に確定するようだ。
じゃ、いったい何のために面倒な接続プロセスがあるんだろう? って話なんだが……
ま、そんなことを言っても仕方がないので、実装するしかない。

VMRでは、16の倍数でない幅を持ったムービーを渡すと16の倍数への変更を要求されるようだ。
オーバーレイの場合は、RGB32からYV12への変更を要求される。
メディアタイプの変更は、IWMSyncReader::SetOutputPropsで行うが、実際にやってみるとS_FALSEが返ってくる。
WMF SDKのヘルプにはいつでも変更できるとあるのだが……
ただし、FAILEDマクロでチェックするとS_FALSEは失敗ではないという扱いになっている。
そこで、S_FALSEでも気にしないことにしたら、再生は継続された。
S_FALSEでもいいようだ。

これで、16の倍数でない幅を持つムービーの再生やオーバーレイにつなぐことが出来た…… かと思いきや、Athlonマシンで再生できなくなった。
Athlonマシンは、Win2kで、Media Playerのバージョンは9なので、開発用のマシンとは少し環境が違う。
でも、再生できるはずなのだが……



投稿者 Takenori : 2005年10月31日 19:43




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