« WideCharBufSizeのサイズ | メイン | 暗号化 »

2005年03月22日

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

    

CBaseRenderer::m_pPosition を使い、CRendererPosPassThru::GetMediaTime をコールし時間を取得してみるが、結果は同じ。
再生速度が反映されていない。
レンダーフィルタに接続されているデコーダーの出力ピンからIMediaSeekingインターフェイスを取得し、そこから時間を取得してみるが、0しか返ってこない。
困った。
いろいろやるがよくわからない。
フィルタ内でグラフが持っているのと同じ時間を得ることは出来ないのだろうか?

とりあえず、利用者となるtTJSNI_VideoOverlayのWndProcメソッドでGetFrameを使い、描画時にフレーム番号を得て、メッセージとして飛んできたフレーム番号と2フレーム以上違いがある場合は、GetFrameの方を使うようにした。
十分に高速であれば、等速再生時はメッセージのフレーム番号とGetFrameのフレーム番号は同じになる。
ほとんどの場合、これで問題ないはず。
問題になるケースは・・・ 厳密なフレーム番号での制御が必要な場合だが、等速の場合はほぼ大丈夫なはず。(内部の時間の持ち方の関係上誤差が生じる可能性はある)

そもそもメッセージのフレーム番号は、描画されるイメージの本来のフレーム番号をさしているべきなのだが、そうなっていない。と言うか、レンダーフィルタ内でイメージのフレーム番号が得られないので出来ない。
でも、何かおかしいよなぁ。
何か方法があっても良さそうなものだが。
でも、タイムスタンプの説明に次のようにある。

すべての MPEG サンプルにタイム スタンプがあるわけではない。MPEG フィルタ グラフでは、タイム スタンプはデコーダから出力されるまで、各フレームには適用されない。
サンプルを受け取ると、レンダリング フィルタはタイム スタンプに基づいてレンダリングをスケジュールする。サンプルの到着が遅れたり、タイム スタンプがない場合、フィルタは即座にそのサンプルのレンダリングを開始する。それ以外の場合、フィルタはサンプルの開始タイムまで待ってからそのサンプルのレンダリングを開始する。

つまりはタイム スタンプがない可能性もある。と言うか、実際はまったくないんですけどね。
そういえば、ソースはキャプチャデータの可能性もあるので、通しフレーム番号などと言う物が常に存在するわけではないのか。

あれ、でも待てよ。
レンダーフィルタは、バッファのスワップが出来たら、EC_UPDATEを送り、EC_UPDATEを受けた側はそれを元にレイヤー画像のアサインを行う。
レンダーフィルタがレンダリングしろと言われた時間と受けた側が入れ替えを行う時間の差はほとんどないんじゃないか?
なら、グラフが持っているのと同じ時間を得ると言うのは、実質どちらでやっても同じ?
時間としては、ポインタすげ替えは無視できる時間なので、イベントが処理される時間とほぼ等価だろう。
やっぱり十分高速なら・・・ となるか。
なんか、どっちでもいいんじゃないの?って気になってきた。
イベント処理が待たされるぐらい重くなっている状況下では正確なフレームで処理することなど出来ないので、十分高速な状況でほぼ正確なフレームに処理出来るなら問題ないだろう。
なら、イベントにフレーム番号を含める意味って・・・ 多分、初期の頃にサンプルのフレーム番号は得られる物だと思っていたからそのようにしたのだろう。
読み返せばわかるだろうけど、面倒だからいいや。
とにかく、今回適用した修正で実用下では問題ないだろう。



投稿者 Takenori : 2005年03月22日 21:54




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