« デコーダーがダイレクトSurfaceに書き込み | メイン | DirectShowメーリングリスト »

2004年08月08日

吉里吉里2/KAG3ムービー拡張日誌:: デコーダーで上下反転

    

BITMAPINFOHEADERのbiHeightの項を見ると、
ビットマップの高さをピクセル単位で指定する。biHeight の値が正である場合、ビットマップはボトムアップ DIB であり、左下隅が原点となる。biHeight の値が負である場合、ビットマップはトップダウン DIB であり、左上隅が原点となる。
と書かれている。
つまり、VIDEOINFOHEADERのメンバ、bmiHeader.biHeightをマイナス値にすれば、上下反転は実現できそうだ。
でも、BITMAPINFOHEADERの説明の最初に『AVI RIFFファイルの・・・』とか書かれているが、気にしない。
とにかくやってみよう。

と書いたものの、どこでAM_MEDIA_TYPEを設定すればいいのかよくわからない。
レンダーのSetMediaTypeで指定してみるがうまくいかず。って、よく考えたら、レンダーは自前で用意しているんだから当然か。
他に、レンダーのCheckMediaTypeの中に入れてみたり、アロケーターのAllocでMediaSampleに設定してみたり、GetBufferの中でやってみたり、独自のMediaSampleを作ったりしたがどれもうまくいかない。
ネットでいろいろ検索するも有用な情報は得られない。
で、再度いろいろと考えてみる。
Allocの中やCheckMediaTypeの中で行われるのはおかしい。
接続時か、それより前に設定されるべきだ。
そうしないと使えるかどうかわからないはずだ。
そして、ピンのところを見ていると・・・Connectの引数にAM_MEDIA_TYPEを渡せるようになっている!これだ!

途中の試行錯誤は割愛して、手順を説明すると次のようになる。
まずは、普通に接続する。
CheckMediaTypeの時に渡されるMediaTypeで、OKを返した物のコピーを取っておく。
接続が完了したら、デコーダーとレンダラーの接続を切る。
コピーしておいたMediaTypeのVIDEOINFOHEADERのメンバ、bmiHeader.biHeightを *= -1;してマイナスにする。
そして、このMediaTypeを使い、Connectする。
すると、上下が反転された(画面上では反転していない)画像が出てくる。※普通のBMPは上下が逆に格納されている。つまり、上下反転したら反転していないBMPが得られる。

同じ箇所でrcTargetを使えば、拡大縮小なども出来るかと思ったが、うまくいかなかった。
このあたりはまだまだ調査が必要そうだ。もしかしたら、デコーダーでは出来ないかもしれない。でも、効率面を考えると出来るようにしてあってもおかしくないが・・・
まあ、とりあえずは上下反転できたのでよしとしよう。
次は複数ファイルの連続再生だな。
グラフを一から再構築すればすぐに出来そうだが、そうせずに出来ないかなぁ。
ま、いろいろ調べよう。



投稿者 Takenori : 2004年08月08日 02:03




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