Last update: Saturday, 04-Jun-2011 17:29:01 JST |
_ わりと前から「aviutlの24fps化インターレース解除に外部プラグインを使うと動作がおかしい」現象があって気になっていたんだが、自分でダミーのインターレース解除プラグインを書いてみたら理由がはっきりした。
_ 上記は「何もしないで動作ログだけ出力する、ダミーのインターレース解除プラグイン」。ログ出力先は「c:\temp\ditest.log」に固定なので、自分で試したいときは注意。
_ で、適当な映像ファイルを読み込ませてから[フレームレートの変更]に[24fps←30fps]、[24fps←30fpsの間引きには自動24fpsの処理を使う]をOFFにして、[インターレースの解除]に[ditest]を選んでおく。これでインターレース解除・間引きともditestプラグインが呼び出されることになる。
_ そして、まずは標準のAVI出力機能を実行してみると、こんなログが出てくる。「func_is_saveframe()」が間引きするかどうかを判定するAPI、func_proc()が間引きを反映したうえで各フレームの画像を再構成して返すAPI。このダミープラグインは「全フレームを間引かず、フレーム画像は何も加工しないでそのまま返す」ので、素直に1フレーム判定しては1フレーム画像を返すということになっている。
======== func_save_start(): s=0, e=124 func_is_saveframe(): saveno=0, frame=0, fps=24, edit_flag=0, inter=0 func_proc(): frame=0 func_is_saveframe(): saveno=1, frame=1, fps=24, edit_flag=0, inter=0 func_proc(): frame=1 func_is_saveframe(): saveno=2, frame=2, fps=24, edit_flag=0, inter=0 func_proc(): frame=2 func_is_saveframe(): saveno=3, frame=3, fps=24, edit_flag=0, inter=0 func_proc(): frame=3 func_is_saveframe(): saveno=4, frame=4, fps=24, edit_flag=0, inter=0 func_proc(): frame=4 func_is_saveframe(): saveno=5, frame=5, fps=24, edit_flag=0, inter=0 func_proc(): frame=5 func_is_saveframe(): saveno=6, frame=6, fps=24, edit_flag=0, inter=0 func_proc(): frame=6 func_is_saveframe(): saveno=7, frame=7, fps=24, edit_flag=0, inter=0 func_proc(): frame=7 func_is_saveframe(): saveno=8, frame=8, fps=24, edit_flag=0, inter=0 func_proc(): frame=8 func_is_saveframe(): saveno=9, frame=9, fps=24, edit_flag=0, inter=0 func_proc(): frame=9 func_is_saveframe(): saveno=10, frame=10, fps=24, edit_flag=0, inter=0 func_proc(): frame=10 func_is_saveframe(): saveno=11, frame=11, fps=24, edit_flag=0, inter=0 func_proc(): frame=11 func_is_saveframe(): saveno=12, frame=12, fps=24, edit_flag=0, inter=0 func_proc(): frame=12 func_is_saveframe(): saveno=13, frame=13, fps=24, edit_flag=0, inter=0 func_proc(): frame=13 func_is_saveframe(): saveno=14, frame=14, fps=24, edit_flag=0, inter=0 func_proc(): frame=14 func_is_saveframe(): saveno=15, frame=15, fps=24, edit_flag=0, inter=0 func_proc(): frame=15 func_is_saveframe(): saveno=16, frame=16, fps=24, edit_flag=0, inter=0
_ さて、今度はプラグインで出力してみると、こんなログが出てくる。注目点は2つ。ひとつは「func_is_saveframe()」が変な順序で呼び出されていること、もうひとつはフレーム番号(frame)に4,9,14……の抜けがあること。
======== func_save_start(): s=0, e=124 func_is_saveframe(): saveno=0, frame=0, fps=24, edit_flag=0, inter=0 func_proc(): frame=0 func_is_saveframe(): saveno=0, frame=0, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=1, frame=1, fps=24, edit_flag=0, inter=0 func_proc(): frame=1 func_is_saveframe(): saveno=0, frame=0, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=1, frame=1, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=2, frame=2, fps=24, edit_flag=0, inter=0 func_proc(): frame=2 func_is_saveframe(): saveno=0, frame=0, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=1, frame=1, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=2, frame=2, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=3, frame=3, fps=24, edit_flag=0, inter=0 func_proc(): frame=3 func_is_saveframe(): saveno=5, frame=5, fps=24, edit_flag=0, inter=0 func_proc(): frame=5 func_is_saveframe(): saveno=5, frame=5, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=6, frame=6, fps=24, edit_flag=0, inter=0 func_proc(): frame=6 func_is_saveframe(): saveno=5, frame=5, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=6, frame=6, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=7, frame=7, fps=24, edit_flag=0, inter=0 func_proc(): frame=7 func_is_saveframe(): saveno=5, frame=5, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=6, frame=6, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=7, frame=7, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=8, frame=8, fps=24, edit_flag=0, inter=0 func_proc(): frame=8 func_is_saveframe(): saveno=10, frame=10, fps=24, edit_flag=0, inter=0 func_proc(): frame=10 func_is_saveframe(): saveno=10, frame=10, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=11, frame=11, fps=24, edit_flag=0, inter=0 func_proc(): frame=11 func_is_saveframe(): saveno=10, frame=10, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=11, frame=11, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=12, frame=12, fps=24, edit_flag=0, inter=0 func_proc(): frame=12 func_is_saveframe(): saveno=10, frame=10, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=11, frame=11, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=12, frame=12, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=13, frame=13, fps=24, edit_flag=0, inter=0 func_proc(): frame=13 func_is_saveframe(): saveno=15, frame=15, fps=24, edit_flag=0, inter=0 func_proc(): frame=15 func_is_saveframe(): saveno=15, frame=15, fps=24, edit_flag=0, inter=0 func_is_saveframe(): saveno=16, frame=16, fps=24, edit_flag=0, inter=0
_ このシーケンスには規則性がある。まずfunc_is_saveframe()が1回呼び出されてfunc_proc()、次は2回・3回・4回呼び出されたあとにfunc_proc()が呼ばれるようになった後、次のフレームがスキップされている。この動作に思い当たることといえば・・・これは「間引きのためにaviutlが行っているであろう演算処理」ではないかと。
_ つまりこういうことだ。間引きを外部プラグインに任せたつもりが実はaviutl内部で処理してしまっており、しかもその内部処理から更に間引きプラグインを呼び出してしまった上で、結局間引きは内部処理の値で行われてしまっていると。こりゃさっぱり正しくないわけである。
_ さらに調べたところ、プラグイン出力だけでなくVFAPIでフレーム出力しているときもこの誤動作が出ていることがわかった。つまり期待通りの動作をしているのは標準AVI出力のときだけで、他の出力動作のときは間違った間引きが行われていることになる。
_ ちうことで、aviutl作者にとりあえず報告メールを出しておいた。反応があるといいのだが。
_ 追記。2-3プルダウン映像*1を読ませて、「自動フィールドシフトVF」でコーミング解除*2、「ditestで24fps化」を指定してプラグイン出力やVFAPI出力をさせると、不思議なことに正しい逆プルダウンが行われてしまう。前述の通り、ditestは「間引きをしない」間引きプラグインなので、他の誰かが間引きをしてしまっているということになる。これは「間引きを外部プラグインに任せたつもりが実はaviutl内部で処理してしまっている」ことの証明となる。
*1: サンプルとしてpulldown.aviを用意してみた。読み込みにはHuffyuv 2.1.1が必要。ついでに2-3プルダウン加工する前のcount.aviも置いておく。各フレームが正しく処理されているかどうかの確認なんかに便利。
*2:
afs.aufではなくafsvf.aufのほうなので、間引きは行われない。
_
お返事来る。とても丁寧、しかもMDXerでした。
メールはこちらへ...[後藤浩昭 / Hiroaki GOTO / GORRY / gorry@hauN.org]