Date

レンダラフィルタを作成するときCBaseRendererCBaseVideoRendererを継承して作成する。これらのクラスはフィルタグラフがポーズ(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