ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

VCM作成ちぅ



作り方と、つまずいた点をメモ。

・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 に格納されるからまんま動画圧縮。
ついにここまできましたかぁ〜〜〜。


今度は動き補償フレームもつかえるようにゴソゴソと改造を加えねば。
とりあえず現状でお試しエンコード中…