« 空のフィルタを作る | メイン | E_NOTIMPLTが返ってくる »

2005年08月23日

吉里吉里 ムービー拡張日誌2:: 出力形式を変更できない?

    

WMVのリーダーからメディアタイプを取得するには、まずリーダーでIStreamを開き、IWMReader::GetOutputPropsでIWMOutputMediaPropsを取得して、そのIWMOutputMediaProps::GetMediaTypeでメディアタイプを取得する。
で、何もしない状態だと、ビデオはWMMEDIASUBTYPE_RGB24形式で出力されるようになっているようだ。(必ずそうなっているかどうかは知らない。Codecなどによって違いがありそう。)
だけど、バッファービデオレンダーが受け取る形式はRGB32。
そこで、上で取得したIWMOutputMediaPropsのSetMediaTypeをコールしてRGB32形式で出力されるようにしてみたが、うまくいかない。
SetMediaType自体はS_OKを返すし、その後GetMediaTypeで取得した情報はRGB32形式になっている。
でも、OnSampleでくるバッファの中身はRGB24形式。
IWMReader::SetOutputPropsで、独自のIWMOutputMediaPropsを渡さないとダメなのだろうか?
だとしたら、また面倒だな。

OnSample内では、ビデオレンダーが用意したバッファへコピーする作業が発生する。
だからそこでRGB24からRGB32へ変換しながらコピーしてしまってもいいかもしれない。
という事で、そうやってみたらRGB32で描画できた。
ま、当然か。

よく考えたら、ヘルプをあんまり読んでいない。
長い上に英語だからなぁ。
少し読んでみたが、出力形式を変更する方法は見当たらない。
DirectShowでも説明はなかった気がする。
インターフェイスの説明読みながらいろいろ試して何とかなったって感じだったはず。

書いていて気付いたが、WMF用のアロケーターをDirectShowのアロケーターをラップして作った方が良いかもしれない。
そうすれば、ダイレクトにビデオレンダーが用意したバッファへ書き込まれ、メモリコピー回数が減ってパフォーマンスがあがるはず。
でも、それはしばらく先だな。
出力形式の指定が出来ないと意味ないし。

とりあえずは、OnSample内で自分で変換しながらコピーする実装にしよう。



投稿者 Takenori : 2005年08月23日 23:36




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