« 標準ビデオレンダラの接続 | メイン | キーフレームを入れる »

2005年10月31日

吉里吉里 ムービー拡張日誌2:: 再生開始シーケンスが違う?

    

レイヤー描画でMPEG Iを再生させようとしたらエラーが発生して再生できなかった。
原因は、WMVの画像が出るようになったで行ったBufferRendererへの改変のようだ。

この修正では、アロケーターが持つメディアサンプルにバックバッファのアドレスを設定しているが、この時にはまだアロケーターのメディアサンプルがNULLのためアクセス違反が発生していた。
なぜNULL?
と言うことで、少し追ってみた。(自分で書いたコードだけど……)
アロケーターのメディアサンプルは、Allocがコールされた時に設定される。
Allocは、Commit内でコールされる。
今回作っているWMソースフィルタでは、DecideBufferSize内でCommitをコールしていた。
つまり、接続が確立された時点でメディアサンプルには値が設定されていた。
が、MPEG IのデコーダーはDecideBufferSize内ではまだCommitしていないようだ。
CBaseOutputPinの実装を見るとActive内でCommitがコールされている。
Activeは再生が開始された瞬間にコールされる。
つまり、再生が開始される時までメモリの確保は行われないわけだ。
たぶん、MPEG Iのデコーダーもこのような実装になっているのだろう。
だから、顕在化しなかったのか。
そこで、WMソースフィルタでもこれに習い、DecideBufferSize内でのCommitはやめた。

DecideBufferSize内でCommitを呼んでいたのは、TheoraなどのDShowフィルタのソースを参考にしたからなんだけど…… あんまり当てにしないほうが良いかも。



投稿者 Takenori : 2005年10月31日 00:00




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