作り方と、つまずいた点をメモ。
・VCM は普通の DLL と同じ作り方。 ・すべての命令は DriverProc を経由して呼ばれる。 ・ICM_GETINFO で FOURCC や名前などの情報を引き渡す。 ・ICM_OPEN / ICM_CLOSE でメモリ領域の確保/解放を行う。 エンコード ・ICM_COMPRESS_* を処理するだけでいい。 ・QUERY は入出力の対応/非対応を調べるメソッド。FOURCC, biCompression などで判定する。 ・QUERY は出力側が NULL で呼ばれることがあるので注意。その場合は入力のみ判定。 ・GET_SIZE は親側で圧縮バッファを確保するため、親に圧縮後の最大のサイズを知らせるのに使われる。 ・GET_FORMAT で書き込まれるデータのヘッダを生成。BITMAPINFOHEADER 構造体の biCompression などを書き換える。 ・ヘッダの後ろに拡張情報をつけることが出来る。その場合は biSize を適宜大きくする。 ・GET_FORMAT は必要となるヘッダ格納バッファのサイズを知るために最初は NULL で呼ばれる。その場合は必要となるバッファサイズを教える。 ・ICM_COMPRESS は入力と出力を1フレームずつ渡してくる。 デコード ・ICM_DECOMPRESS_* を処理する。 ・QUERY はエンコードと同じく。注意点も変わらず。 ・GET_FORMAT も出力データのヘッダ。詳細はエンコードと同じ。 ・ICM_DECOMPRESS も、エンコードと同じように1枚ずつデータが来る。
全部 I で圧縮/保存するような VCM が完成。
現在圧縮中...
VCM だと細かいことは VFW がやってくれるし、音の同期もやってくれて楽々。
これでぐっと動画っぽくなりますな。というか .avi に格納されるからまんま動画圧縮。
ついにここまできましたかぁ〜〜〜。
今度は動き補償フレームもつかえるようにゴソゴソと改造を加えねば。
とりあえず現状でお試しエンコード中…