« DirecX VAが有効にならない? | メイン | WM同期リーダーでの負荷 »
2005年10月27日
吉里吉里 ムービー拡張日誌2:: WMのアロケーター
Tweet @jin1016をフォローアロケーターの実装は、IWMReaderAllocatorExはIMemAllocatorをwrapし、INSSBufferはIMediaSampleをwrapするだけで事足りそうだ。
IWMSyncReaderへのアロケーターの設定は、CBaseOutputPin::DecideAllocator後にIWMSyncReader2::SetAllocateForOutputで設定するだけで良さそう。
問題はアロケーターの内部のバッファ数が1個より多い時。
この場合にいかにしてWMVのデコーダーの出力先と、これからダウンストリームへ渡そうとしているバッファを同じものにするか。。。
DirectShow側のIMemAllocatorもカスタムアロケーターとして実装すれば問題なさそうだが、面倒だな。
CBaseOutputPin::DecideBufferSizeでは、バッファ数が1個になるようにしているので、ダウンストリームの提示するアロケーターが無理にバッファ数を増やそうとしない限り、1個より多くなる事はないだろう。
もし、1個より多くなった場合は、IWMSyncReaderへカスタムアロケーターを提示しないようにしよう。
自前のアロケーターのバッファかどうか確認する時は、実際に内部のバッファへのポインタを取得して、そのポインタで比較する。
たぶん、これが一番確実な方法だろう。
もし、異なっていた場合は素直にmemcpyでコピーすることにする。
投稿者 Takenori : 2005年10月27日 21:57
comments powered by Disqus