« オーバーレイでの動作確認 | メイン | BCBのコードをVCでデバッグしたい »

2004年10月03日

吉里吉里2/KAG3ムービー拡張日誌:: セグメントループのテスト&デバッグ

    

だいぶ前に組み込んでおきながら今更動作確認。
いきなりTJSで引っかかる。
オブジェクト型を期待しているところに(int)0がきているとかどうとかでる。
初めKAGの方がおかしいのかと思ったが、コーンソールの表示を見るとMovie.tjsに問題がある様子。
オーバーライドしておきながら、親クラスのメソッドではなく、自分のを呼んでしまっている様子。
初めはよくわからなかったので、いろいろと調べていろいろと直す。(実はTJSについてあんまり知らなかったり)
そして、動いたと思ったら、今度はDLL側に問題があり、セグメントループがうまく動かず、調べる。
IMediaSeeking::SetPositions の使い方を勘違いしていたと思い直すが直らず、再度よく見るとそれは勘違いで元のがあっていたようなので、元に戻すと、なぜかうまく動くようになる。謎謎謎・・・
ビルドを忘れていたりしたのだろうか?
よくわからん。
でも、DirectShowは時々こういうことがあるような気がする。いったい何なんだろうか?

残っている問題
最終フレーム付近でセグメントループを使おうとしたら、シークさせるよりも先に再生が終了してしまい、うまくループさせられない。
これは、ダブルバッファリングしているので、内部処理よりも描画は1フレーム遅れている上に、内部的に数フレーム処理が進んでいることがあるようで、さらに先に進んでしまっているんが原因。
フレームを移動させた後、フィルタグラフの状態が再生中かどうかを確認して、再生中じゃない場合は、再度Playをコールした方が良さそう。
かと思ったが、どうやらそこが問題ではない様子。
上述の謎謎謎の部分がやっぱりおかしいようだ。
終了フレーム付近ではない位置でIMediaSeeking::SetPositions をコールして0位置へ移動した時、S_FALSEを返すが、なぜか位置移動は成功している。
なんだこれは?
自分でフレームから100ナノ秒単位に変換している部分がおかしいのだろうか?

IMediaSeeking::ConvertTimeFormat は例のごとく実装されていませんと返ってくる。
やはり期待できないヤツだ。

S_FALSEを返すかどうかはさして重要ではないようだ。
S_FALSEを返しても、シークはきちんと行われている。
最終フレーム付近でうまくいかないのは、SetFrameがコールされていないのが原因のようだ。
つまり、より上位の問題だ。
と言うことは、Builder側のソースなのだが・・・
Builder側のソースへOutputDebugStringを入れて、VCで拾ってみる。
ちょっと不安だったがうまく拾えた。
これで少しデバッグがやりやすくなるかも。



投稿者 Takenori : 2004年10月03日 09:59




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