AviUtl ExEdit2
昨年夏,突如 AviUtl2 こと AviUtl ExEdit2 がリリースされ,AviUtl ユーザーたちを驚かせました.いまだベータ版ながら,アクティブなプラグイン等は次々に移植され,基本的な機能は十分使えるものとなりました.個人的には,無印版の 320000 フレーム制限撤廃が一番うれしいです.
さて,この記事ではプラグイン/スクリプト制作者として,気付いた変更点をまとめます.
全般
プラグイン / スクリプトのインストール先が,aviutl.exe の設置フォルダから,%ProgramData%/aviutl2 (または AviUtl ExEdit2 で指定した data フォルダ) に変更されました.このフォルダのパスは,config2.h にある CONFIG_HANDLE::app_data_path で取得できます.プラグインはこの下の Plugin 以下,スクリプトは Script 以下に配置します.
スクリプト
文字コードが Windows-31J から UTF-8 に変更され,改行コードも LF だけでも動くようになりました.拡張子が末尾に 2 を付加したものとなり,無印用のスクリプトと区別されます.
トラックバー等の設定項目の記法が変更され,項目数の制限も (少なくとも現実的な範囲では) なくなり,--dialog を使わずに多数の設定項目を使えるようになりました.新しいチェックボックス項目 --check の値が boolean になり,わかりやすくなりました.
obj.getpixeldata("alloc") がなくなりました.obj.putpixeldata(data) は obj.putpixeldata("object", data, w, h) と書かなければならなくなりました.デフォルトのデータフォーマットが BGRA から RGBA の順に変更されました.
スクリプトフォルダ以下のサブフォルダが名前空間を作らなくなり,本体付属のエフェクトや,他スクリプトとの名前衝突を回避しなければならなくなりました.
スクリプト用 DLL
スクリプト用 DLL を,拡張子 mod2 のプラグインとして作れるようになりました.DLL 側は module2.h により,AviUtl ExEdit2 を介して間接的に Lua にアクセスする形となり,Lua ライブラリを直接リンクする必要がなくなりました.このプラグインは,新しく追加された obj.module(mod_name) によってロードし,従来のスクリプト用 DLL と同様に扱えます.この拡張子 mod2 のプラグインをスクリプトモジュールとよび,Plugin フォルダではなく,Script フォルダにインストールします.
Lua 用関数の型が int (*)(lua_State*) から void (*)(SCRIPT_MODULE_PARAM*) に変更されました.引数は lua_touserdata などの代わりに,SCRIPT_MODULE_PARAM::get_param_data などで受け取りますが,このときの n 個の引数に対応する番号が,lua_touserdata などは 1~n だったのに対し,SCRIPT_MODULE_PARAM::get_param_data などでは 0~n-1 となっているので注意が必要です.返り値は SCRIPT_MODULE_PARAM::push_result_int などを呼び出して設定し,AviUtl ExEdit2 側で数をカウントしてくれるものと思われます.
前述の通り,obj.getpixeldata,obj.putpixeldata のデフォルトフォーマットが BGRA から RGBA に変更されましたが,フォーマット引数として "bgra" を渡すことで,従来のフォーマットで授受することもできます.単純に obj.getpixeldata("object") して DLL 関数に渡し,結果を obj.putpixeldata するだけの場合,新しいフィルタープラグインのインターフェースがほぼ同等なため,フィルタープラグインで実装したほうがよいです.
dllexport する関数は,int luaopen_DLLNAME(lua_State*) から SCRIPT_MODULE_TABLE* GetScriptModuleTable() となりました.luaL_register を呼び出す代わりに,返り値に関数名とポインタを並べた配列を設定した構造体へのポインタを返します.その他,bool InitializePlugin(DWORD version) など,dllexport すると AviUtl ExEdit2 から呼んでくれる関数が module2.h のコメントに書かれています.
フィルタープラグイン
フィルタープラグインのインターフェースが大きく変わりました.無印では FILTER_PROC_INFO::ycp_edit, FILTER_PROC_INFO::ypc_temp から PIXEL_YC フォーマットのビットマップデータにアクセスできていたのに対し,自分で領域を確保したうえで FILTER_PROC_VIDEO::get_image_data で画像データを読み出し,加工してから FILTER_PROC_VIDEO::set_image_data で書き出す方式になりました.これは,スクリプトと DLL の橋渡しに obj.getpixeldata と obj.putpixeldata を使うのと同等です.このインターフェースを使う場合,RGBA32bit のフォーマットとなり,無印の YC48 フォーマットとは異なります.これとは別に FILTER_PROC_VIDEO::get_image_texture2d が用意されていますが,ID3D11Texture2D がわからないので説明できません.
トラックバー等の設定項目は種別ごとの構造体が用意され,nullptr 終端の配列で全項目を設定する形式となり,無印版よりスマートになりました.
出力プラグイン
OUTPUT_INFO::func_get_video では同じ RGB24bit の DIB データが得られるため,メイン処理については同じコードがそのまま動きます.
OUTPUT_PLUGIN_TABLE::func_init, OUTPUT_PLUGIN_TABLE::func_exit にそれぞれ相当する関数は,InitializePlugin, UninitializePlugin として dllexport する方式に変わりました.(initialize に対応するのは uninitialize じゃなくて finalize だろという気がするが) OUTPUT_PLUGIN_TABLE::func_config_get, OUTPUT_PLUGIN_TABLE::func_config_set はなくなり,dllexport する InitializeConfig でファイルパスを指定してロード,OUTPUT_PLUGIN_TABLE::func_config の中でダイアログを閉じたあとに自前でファイルパスを指定してセーブする形式になりました.
その他
その他のプラグインは,私は作っていないのでわかりません.プラグイン全般について,文字コードが Windows-31J からワイド文字列指定に変わったため,プラグインのソースコードは UTF-8 とし,プレフィックス L をつけたワイド文字列を使えば良くなり,少なくとも典型的なダメ文字問題からは解放されています.