amate / InputPipePlugin

L-SMASH_Works File Reader(lwinput.aui)を別プロセスで実行してあげることによって aviutlのメモリ使用量削減を目論む、aviutlの入力プラグインです
Other
130 stars 1 forks source link

InputPipePlugin            

■はじめに

このソフトは、L-SMASH_Works File Reader(lwinput.aui)を別プロセスで実行してあげることによって
aviutlのメモリ使用量削減を目論む、aviutlの入力プラグインです

ダウンロードはこちらから
https://github.com/amate/InputPipePlugin/releases/latest

■動作環境

・Windows 10 home 64bit バージョン 2004
・AviUtl 1.00 or 1.10
・拡張編集 0.92
※ 拡張編集 0.93rc1 はシーン周りに不具合があるので推奨しません
・L-SMASH Works r935 release2
・L-SMASH-Works_rev1096_Mr-Ojii_Mr-Ojii_AviUtl
上記の環境で動作を確認しています
XPではたぶん動きません(コンパイラが対応していないため)

■導入方法

https://github.com/amate/InputPipePlugin/releases/latest
上記リンクから"InputPipePlugin_1.x.zip"をダウンロードして、適当なフォルダに展開します

lwinput.aui が置いてあるフォルダ(aviutl.exeがあるフォルダ、もしくは "aviutl.exeがあるフォルダ\plugins\"に存在するはず)に、
InputPipePlugin.aui と InputPipeMain.exe をコピーするだけです

その後、aviutlのメインメニューから、[ファイル]->[環境設定]->[入力プラグイン優先度の設定]を選択し、
"InputPipePlugin"を"L-SMASH Works File Reader"より上にドラッグして移動してあげれば完了です

■導入の確認

拡張編集のウィンドウに適当に動画ファイルを放り込んで、"InputPipeMain.exe"のプロセスが立ち上がっていれば成功です

■InputPipeMain64.exe について

64bit版 L-SMASH_Works File Reader(lwinput64.aui)が InputPipePlugin.aui と同じフォルダ内に存在するとき、そちらを利用するようになります
リリース時に 64bit版L-SMASH_Works File Readerが存在しないので正常に動作するかは不明です

32bitと64bitでは INPUT_INFO や INPUT_HANDLE のサイズが異なりますが、InputPipeMain64.exeが内部で変換してからInputPipePlugin.auiへ伝えるので、lwinput64.aui側で特に何かする必要はありません

■設定

[ファイル]->[環境設定]->[入力プラグインの設定]->[InputPipePluginの設定]で プラグインの設定ができます

ぶっちゃけ外部プロセスなんて使わずに、これにチェック入れるだけでいいんじゃないかなって
実装した後に気づきました
でも、無駄にはなってないはずです…

※ハンドルキャッシュ有効時に、同一ファイル名の動画または音声ファイルが、同じフレームの違うレイヤーで使われている時に問題が発生する

別のレイヤーに同じファイルを配置した場合、1フレーム再生する毎に動画や音声のシークが起きて負荷の重い処理が走り、再生や出力がおかしくなる場合がある
上記の問題を回避するために、"Altキーを押しながら拡張編集のタイムラインウィンドウにメディアファイルをドラッグドロップする"操作によって、ハンドルキャッシュを有効にしていても、ドロップされたファイルのハンドルをキャッシュから使いまわさずに、新しいファイルとしてオープンするようにします
ファイル名の末尾に".[alt_XXXXXXXX]"などが付けば、それは別のファイルとして開かれたことを示します
この機能を使った場合、ドロップされたファイルがあるフォルダに、"ファイル名.[alt_XXXXXXXX].#junk"というゴミファイルができますが、AviUtl再起動時に、タイムラインに配置したオブジェクトが消えないようにするための処理です
動画が完成したら申し訳ありませんが、手動で消してください・・・

外部プロセスとの通信はコストがかかるので、重いと感じたらチェック外してください

設定の保存に失敗するので、AviUtlのフォルダを [C:\Program Files]や[C:\Program Files (x86)]フォルダ内に置かないでください

■プラグインを入れて不安定になった場合

■アンインストールの方法

AviUtlのフォルダにコピーした
InputPipePlugin.aui と
InputPipeMain.exe と
InputPipePluginConfig.ini を削除してください

■免責

作者(原著者&改変者)は、このソフトによって生じた如何なる損害にも、
修正や更新も、責任を負わないこととします。
使用にあたっては、自己責任でお願いします。

何かあれば下記のURLにあるメールフォームにお願いします。
https://ws.formzu.net/fgen/S37403840/

■著作権表示

Copyright (C) 2019-2023 amate

私が書いた部分のソースコードは、MIT License とします。

■謝辞

aviutlの作者様、L-SMASH Worksの作者様
あなた方の活躍のおかげで、素晴らしい動画がたくさん生まれていることに感謝いたします ありがとう!

■...

よろしければ、[ sm35585310 ] を親作品登録してくれると色々助かります

■誰かの役に立つかもしれない情報

コンテナを変更するだけでなぜ直るのかは謎

■ビルドについて

Visual Studio 2022 が必要です
ビルドには boost(1.70~)とWTL(10_9163) が必要なのでそれぞれ用意してください。

Boost::Logを使用しているので、事前にライブラリのビルドが必要になります

Boostライブラリのビルド方法
https://boostjp.github.io/howtobuild.html
//コマンドライン
b2.exe install -j 16 --prefix=lib toolset=msvc-14.2 runtime-link=static --with-log --with-filesystem

◆boost
http://www.boost.org/

◆WTL
http://sourceforge.net/projects/wtl/

■更新履歴


v2.0
・[add] InputPipeMain64.exeを追加 (64bit版 L-SMASH_Works File Reader(lwinput64.aui)が存在するときはそちらを利用するようにした)

v1.10
・[fix] 動画ファイルの幅、高さが4の倍数でないときに強制終了するバグを修正 #5

v1.9
・[update] 開発環境を Visual Studio 2022 に更新
・[fix] lwinput.auiに func_init、func_exitが実装されていれば、それぞれ呼ぶようにした (オリジナルはnullptrだったので呼んでいなかった)
・[change] 内部データ交換方式は、"共有メモリ"をデフォルトにした
・[fix] InputPipePlugin.aui から InputPipeMain.exe 実行時に、カレントディレクトリを設定するようにした (lsmash.iniを読み込めるようになったはず)

v1.8
・[add] 同一フレーム同一ファイル問題に対処、Altを押しながらのファイルドロップで、新規ファイルとして開く処理を追加

v1.7
・[fix] IPC有効時、プラグインの終了時にInputPipeMain.exeをまともに終了させるようにした
・[change] lwinput.auiの各種関数呼び出しにラッパーを噛ませた (例外も握り潰すようにしたので多少落ちなくなったはず)
・[add] 設定の保存に失敗した場合、メッセージボックスを表示するようにした (AviUtlフォルダを [Program Files]や[Program Files (x86)]フォルダ内に置かないでください)
・[fix] IPC有効時、名前付きパイプの準備やInputPipeMain.exeの起動に失敗した場合、IPCを無効化して動作させるようにした
・[fix] ConnectNamedPipeの呼び出しが、タイミングによって失敗することがあるのを修正 
・[fix] 音声が存在しない動画ファイル読み込み時、iip->audio_formatが無効なアドレスを指していたのを修正
・[misc] 使用していないソースコードの削除や INPUT_INFO周りの処理を共通化
・[change] 名前付きパイプのバッファサイズを増加させた (512->4096)

v1.6
・[change]設定で内部データの交換方式を選択できるようにした(デフォルトを名前付きパイプへ変更)
共有メモリだと落ちる場合があるらしいが、再現しないのでエラーが起こりそうな場所にメッセージボックスを埋め込んどいた
・[fix]InputPipeMain.exeがboost::logに依存しないようにした
アンチウィルスがうるさいらしいのでその対策

v1.5
・[fix] aviutl起動時に、InputPipePlugin.auiと同じフォルダに lwinput.aui が存在しない場合プロセスが強制終了するのを修正
・[add] aviutl起動時に、InputPipePlugin.auiと同じフォルダに lwinput.aui が存在しない場合メッセージボックスを表示するようにした
・[change] プロセス間通信有効時、画像と音声の転送に共有メモリを使用するようにした (6割ほど高速化した)
・[change] boostを1.72.0へ更新
・[chagen] std::filesystemからboost::filesystemへ使用ライブラリを変更

v1.4
・[change]プロセス間通信有効、func_read_videoで画像の取得に失敗した場合の処理をInputPipePlugin.auiではなく、InputPipeMain.exeで実行するようにした
・[add]プロセス間通信無効時でも、func_info_getでキャッシュ情報を返すようにした

v1.3
・[fix] func_read_videoで画像の取得に失敗した場合、一度前のフレームを取得してから目的のフレームを取得するようにした [緑の画面が出る対策](ワークアラウンドっぽいがとりあえず動く)

v1.2
・[fix] CreateNamedPipeでPIPE_TYPE_MESSAGEのままだったのを修正
・[add] NamedPipe::Read failed 時に、GetLastErrorの内容を書き込むようにした(上の修正でもう書き込まれないはず…)

v1.1
・[fix] IPC有効時、外部プロセスとの通信にコケるのを修正(マルチスレッドで各種関数が実行されることがあるようなので、排他制御を入れた)
・[change] 名前付きパイプの設定を、バイトストリームモードへ変更(上のバグのせいで変なことしてた)
・[fix] 外部プロセスにて、func_info_getが失敗することを考慮に入れてなかったのを修正
・[change] 名前付きパイプの名前をランダムに変更するようにした

v1.0
・完成