■ 技術情報


開発手順メモ

ここでは僕が実際にプラグインを開発の手順を説明しています。
たまにしか作らないので、自分自身よく忘れるので^^;

(2006/0/30追記)
コンパイラを変えたので、いろいろ追加。詳細は他のページでやる予定。

(2008/10/05追記)
こっちでやる事にした。


step.01 開発環境
僕の持ってるコンパイラは、VC6++STDなので、SDKは5.5がメイン。
SDK5.5は、ここにある。もうサポート対象外になっているが、 VCの新しい奴は買う余裕ないので、しばらくはこれでT_T

(2006/0/30追記)
Visual Studio 2005 Standard Edition買いました(安かった)
SDKのバージョンを6.5へ上げました(7はまだメインに使ってないので^^;)
SDK6.5は、ここ、SDK7は、ここにある。
step.02 SDKのインストール
普通にインストール。デフォルトではProgram Filesなので、適当なディレクトリに入れる。
SDKのフォルダ内のExamples\Effectフォルダがエフェクトプラグインのソース等がある。

なお、リソースコンパイルに使うPiPLtool.exeは、msvcr71.dllが必要。 エラーログでは表示されないので、苦労した^^;
なんかXPのデフォルトではSYSTEM32へインストールされないので注意。msvcr71.dllは、C:\Program Files\Adobeの中を検索するといっぱいあるので、 特にインターネットで探す必要はない。C:\Program Files\Adobe\After Effects 6.5\Support Files\にあるのでExamples\ResourcesかSYSTEM32へコピーすればいい。
step.03 スケルトン
Effectフォルダのサンプルソースを適当に弄ればプラグインはできる。
でも、コンパイルオプションとかいちいち変更するのが面倒なので、使いやすいスケルトンを作成しておいて それを元に作成する。僕が使っているスケルトンはここにある。
これを展開すると「F's PluginSkeleton65」フォルダができるので、Examples\Effectフォルダに入れておく。
このスケルトンはSDK6.5をターゲットにしてる。SDK7はコンパイルできるか確認してません。
一応VC++6用のプロジェクトファイルも残してあります(なんかVC++6でもSDK6.5でコンパイルできるようになってしまった^^; VS2005はエラーログがわかりやすいので)

スケルトンから新規プロジェクトを作るのは本来VSのテンプレート作ればいいらしいのだが、全然作り方がわかりません(もしかしたらSTDエディションでは駄目かも?)
仕方ないのでDelphiで作ったAE_Create.exeで新規プロジェクトを作成してます。
スケルトンのアーカイブにソースと一緒に入れてあります。

(2008/10/10追記)
こっちにあるスケルトンの方が最新版です。

step.04 ソース
プロジェクト名を"foo"とすると以下のソースファイルがあります。
foo.c main関数があるソース。主なコードはここ
foo.h foo.c用のヘッダーファイル
fooPiPL.r リソースのソース
Win\foo.dsp VC++6用のプロジェクトファイル
.\Win\foo.dsw VC++6用のワークスペースファイル
.\Win\foo.sln Visual Stusio 2005用のソリューションファイル
.\Win\foo.vcproj Visual Stusio 2005用のプロジェクトファイル
FsUtil.h 使いまわし用の関数を入れたファイルです。
FsUtil.h FsUtil.cのヘッダー
step.05 コーディング時の注意点
後は必要なところをコーディング。以下は注意点。

◎foo.hでバージョンの指定を行ったら、忘れずにfooPiPL.rのAE_Effect_Versionもあわせる。
◎GlobalSetupでOut_flagの指定を行ったら、忘れずにAE_Effect_Global_OutFlagsもあわせる。
 本当はマクロとかのコンパイラの機能で出来そうだが、よくわからないので、AE_Utils.exeで計算してあわせる(スケルトンアーカイブ内にあります)

◎SDK6.5からPF_WorldがPF_EffectWorldに変更されているので、注意!。
◎PF_ADD_FIXEDマクロが変わって "1000L <<16"って感じに固定小数に変換しなくてもいい様に変更されていた。
 マクロ自体が(PF_Fixed)((VALID_MIN) * 65536.0)に変わっていた。
◎その他のマクロも結構変更されている。固定小数を扱うところはすべて見直す必要あり。
step.06 固定小数の計算
PF_Fixedは実際は32Bit整数型。上16Bitが整数部、下16Bitは小数部とした固定小数値。

固定小数同士の加算・減算は特に問題なし。 (例) c = a + b; c = a - b;
乗算や除算の場合は、結果を16 シフトしなければいけない。(例) c = a * b >> 16; c = a / b << 16;

通常の longとの計算時は、上16Bitが整数部になっている事に注意。AE_Macros.hで定義されている以下のマクロを使えば良い。
#define FIX2INT(X) ((long)(X) >> 16)
#define INT2FIX(X) ((long)(X) << 16)

step.06 デバッグ
後で。

AfterEffects6.5/7対応プラグインを作るときの注意。

忘れない為のメモ。

AfterEffectsはEffectsプラグインを呼び出すとき、inputとoutputという二つの画像構造体を用意する。
inputはエフェクトをかける画像。outputはエフェクトをかけ終わった画像って感じで、inputの画像イメージにエフェクトをかけてoutputの画像イメージに書き込みます(実際にはもっと複雑)

AfterEffects5.5までは、inputとoutputは、全く同じものであったが、6.0以降それが変わってしまった(7ではもっと複雑に)
その中で一番重要なものは「rowbytes」、画像の横幅のバイト数。
SDK5以前は、input->widthやoutput_widthの値が実際の画像イメージと違っていたので、
w_pixel = input->rowbytes/sizeof(PF_Pixel);
って感じに横幅のピクセル数を求めていた。
こんな感じに得た横幅(ピクセル)は、AE5.5まではinputとoutputが同じ数値でしたが、 AE6.5以降では、inputとoutputでは一致しないようです(多分OpenGL対応の影響)

PF_EffectWorld *input = & params[MY_INPUT]->u.ld;//入力画像のアドレス。outputは引数にある。

width  = input->width;
height = input->height; // heightは今のところ問題がない。
offsetInWidth  = input->rowbytes/sizeof(PF_Pixel)  - input->width;
offsetOutWidth = output->rowbytes/sizeof(PF_Pixel) - input->width;
//offsetInWidthやoffsetOutWidthhが負数になったらエラー処理。

targetSrc=0;
targetDst=0;
for (j=0; j < height; j++) {
  for (i=0; i < width; i++) {
    output->data[targetDst] = input->data[targetSrc];
    targetSrc++;
    targetDst++;
  }
targetSrc+=offsetInWidth;
targetDst+=offsetOutWidth;
}
以上のようにinput/outputでアドレスの補正を行えば大丈夫です。
SDKサンプルでは、PF_ITERATEマクロでコールバック関数を呼び出してスキャンラインごとに処理を行っているので、 バージョンごとのrowbytesの違いは問題になっていないのですが、僕みたいに直接画像イメージ扱うと以上のアドレス補正が必要になります。
じゃあ、それ使えば解決なんですがコーディングがめちゃ面倒になります。またプラグイン内部でちょうどいいサイズの画像イメージ(PF_EffectWorld)作っても 解決できますが、なんかメモリがもったいない。

その他


-index-