« 仕様や進捗 | メイン | 未実装のプロパティ系を実装 »

2004年09月13日

吉里吉里2/KAG3ムービー拡張日誌:: 現在のフレーム番号の取得

    

様々な場所でIMediaSampleからメディアタイムを得ようとするが、得ることは出来ず。
やはりデコーダーはメディアタイムを設定していないようだ。
ということは、レンダーは即座にレンダリングすることになる。
しかし、CBaseRenderer::Receiveがコールされてから実際にレンダリングされるまでには、一度イベント待ちがある。
つまり、このイベント待ちの直後の時間が、そのフレームの時間に近い。
そして、CBaseRendererでは、イベント待ちの後にOnWaitEnd がコールされるようになっているので、これをオーバーライドすれば、目的の時間に最も近い時間が得られるはずだ。
また、OnWaitStartと言うメソッドもある。
何となく、気になったので、この2つのメソッドを通過する時間をOutputDebugString でデバッガへ出力。すると、明らかにイベント待ちをしたような時間差がある。
イベントってレンダラー自身がIMediaSampleからメディアタイムを得て、IReferenceClock::AdviseTimeを使用し、そこからイベントが送られてくるのを待つんじゃなかったっけ?
調べると、やはりCBaseRenderer::ScheduleSample でスケジューリングされていた。
その中では、GetSampleTimesがコールされていて、そこから得た時間を元にスケジューリングしているようだ。
しかし、GetSampleTimesの中では、IMediaSample::GetTimeを使って時間を得ている。
以前、IMediaSample::GetTimeを直接コールしても、時間を得ることが出来なかったのだが・・・ なぜか出来ている。
あれ?っと思い、GetSampleTimes をコールしたら、時間を取得できた。
さらに、ありぃ?と思い、IMediaSample::GetTimeを直接コールしてみたら、またしても時間を取得できた。
なぜ?
私は幻を見たのだろうか? そんなことはないはずだが・・・
でも、100nsec単位の時間が返ってきている。確か、ビデオではフレーム番号がメディアタイムのはずだが。
GetSampleTimes はタイム スタンプを取得するとある。
って、あああぁぁぁぁぁぁぁぁ。
IMediaSample::GetTimeとIMediaSample::GetMediaTimeって、メソッド違うじゃないか!
IMediaSample::GetMediaTimeにしたら、やっぱり取得できなかった。
と言うことは、IMediaSample::GetTimeからフレーム番号に変換すれば何とかなりそうだ。
ここは意外と盲点かも。って、俺がアホなだけかな。

ちなみに、IMediaSeeking::SetTimeFormat( &TIME_FORMAT_FRAME )と設定しても、IMediaSample::GetMediaTimeでメディアタイムを得ることは出来なかった。



投稿者 Takenori : 2004年09月13日 10:55




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