レンダラフィルタを作成するときCBaseRenderer
やCBaseVideoRenderer
を継承して作成する。これらのクラスはフィルタグラフがポーズ(Paused)状態に遷移したとき、レンダリングを行うメソッドCBaseRenderer::DoRenderSample
を呼ばない。
これはビデオを扱ってるときに少々問題になるかもしれない。例えばグラフをポーズ状態にし、その後SetCurrentPosition
で再生位置を変更しても画面上のフレームは更新されない。別の例として、フィルタグラフ構築直後に停止状態(Stopped)からポーズ状態(Paused)に遷移したとき1番目のフレームが表示されない。
一般的なアプリケーションの実装としてオーディオとビデオでシーク後の動作として次のような違いがある。
オーディオ | シーク後のレンダリングはしない。 |
---|---|
ビデオ | シーク先のフレームを表示するためにレンダリングする。 |
CBaseRenderer
クラスではシーク後のレンダリングにDoRenderSample
ではなくOnReceiveFirstSample
を呼ぶ。つまり、上の表のような動作をするにはこのメソッドを実装する。
SDK付属のtexture3Dサンプルを見てみるこのサンプルではOnReceiveFirstSample
の実装が無いのでグラフをポーズ状態にするとテクスチャの更新が行われない。それを解消するために次のコードを追加する。
1 2 3 4 5 6 7 8 9 | class CTextureRenderer : public CBaseVideoRenderer
{
public:
...
void OnReceiveFirstSample(IMediaSample *pMediaSample) {
DoRenderSample(pMediaSample);
}
...
};
|
Comments
comments powered by Disqus