« DirecX VAが有効にならない? | メイン | WM同期リーダーでの負荷 »

2005年10月27日

吉里吉里 ムービー拡張日誌2:: WMのアロケーター

    

アロケーターの実装は、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
Total : Today : Yesterday : なかのひと