/*---------------------本ソフトウェアについて---------------------*/

avsやdefを自動で書くソフトは既にありますが、独自にやりたい事も
あったのでいろいろ機能を加えながら新規に作成していくことにしました。

本ソフトではマニュアルプルダウン解除の方をメインにやっていこうと
思っているのでTFMやTDecimateの出力ログファイルには対応せず、
DoubleWeaveクリップのコーミングログのみを使用します。
ただしそのログを使って全て自動関数に置き換える事も可能です。

ログを作るにあたってDoubleWeaveしなければならない理由は主に
24pと30pの区別をつけるためなのですが、詳しくは後述します。

/*---------------------解除方法について---------------------*/

以下はマニュアルプルダウン解除に使用する全パターンです。
基本的な選択方法は、DoubleWeave10フレーム(以下dw10)を1パケットとして判定し、
最も長いパケット数を解除可能な方法が選択されます。
他にはスキップ数の少なさ・前Trim末端との重複選択を回避する必要がある場合など
で優先順位が変化します。

(1)24fps
①2-3プルダウン、2-3-3-2プルダウンに使用
DoubleWeave().PullDown(0,2)
DoubleWeave().PullDown(0,3)
DoubleWeave().PullDown(1,3)
DoubleWeave().PullDown(1,4)
DoubleWeave().PullDown(2,4)

②2-3-3-2プルダウン、縞無し24pに使用
SelectEvery(5,0,1,2,4)
SelectEvery(5,0,1,3,4)
SelectEvery(5,0,2,3,4)
SelectEvery(5,1,2,3,4)
SelectEvery(5,0,1,2,3)

③縞無し24p、2-3プルダウン、2-3-3-2プルダウンに使用
DoubleWeave().SelectEvery(10,0,2,4,7)
DoubleWeave().SelectEvery(10,0,2,5,8)
DoubleWeave().SelectEvery(10,0,3,6,8)
DoubleWeave().SelectEvery(10,1,4,6,8)
DoubleWeave().SelectEvery(10,2,4,6,9)

縞無し24pの判定には30pとの区別が可能な③の5パターンを使います。
まず③を使って判定を行い、同じ範囲を②でも処理できるようなら②を
当てる場合もあります。
判定自体を②で行ってしまうと30pとの判別がつきません。

逆に周期上は30pであっても動きが無ければ縞無し24pと判定する他ありません。
その場合厳密に言えば1フレームあたりの表示時間が変わりますが、まぁなにしろ
あまり動いてないのですからさほど問題無い気がします。

また③の選択方法は一応、2-3プルダウンの解除にも使えるため、条件次第では
2-3プルダウン区間に③が使われる場合もあります。

(2)30fps①

通常のいわゆる30p。
基本的に何もしませんので、"-30A 1" にしておくのも良いかもしれません。
5コマ全て動いてなければ30pとは判定されません。

(3)30fps②
DoubleWeave().SelectOdd()

あまり使わないのでデフォルトではオフです。

(4)12fps
Doubleweave.SelectEvery(10,2,7)

"-DUP 1"の時に使用されます。
Doubleweave.SelectEvery(10,2,7)のみを使用するのは、対応する各組み合わせで共通して
使えるのがこの位置だからです。

ログを作る際はAuto_VFR("log",IsDup=true)とする必要があります。
このモードではコーミング検出に加えてモーション検出も行い、動きの無い
シーンを見つけて同じ絵をカットしようと試みます。

(5)6/3/2fps
SelectEvery(5,1)
SelectEvery(10,1)
SelectEvery(15,1)
(※Itsのコマンドでは前でDobuleWeaveされるため、表記の数字は倍になる)

"-6F 1"の時に6fpsが、更に"-3F 1"なら3/2fpsが使用されます。
dw10フレームの中の2フレーム目が必ず選択される理由は、12fpsと判定を兼用してたりとか
EasyVFRの時はDoubleWeaveせずにSelectEveryだけで記述したかったとか、とにかくそんな
わけで2です。

(6)判定不能なケース
(1)～(5)で対応できない場合はiniで設定した関数を使用します。
普通に考えれば60iの場合がこのケースです。
あとはノイズが出てるとかクロコン縞やらポケモンやらのせいで判定が
上手くできない場合など、原因は多々あります。

このケースの場合、使用FRのオンオフによって当てる関数が異なります。

60○の場合はFunc_60fpsで設定した関数を使います。
60×/30○の場合ですが、あまり使いそうもないのでHELPには載せてませんが
"-30B"というコマンドがあって、"1"ならば30fps関数、"0"(デフォルト)なら
24fps関数を使います。
60×/30×の場合はFunc_24fpsで設定した関数を使います。

またいずれの場合であっても"-REF 1"ならばFunc_6to2で設定した関数への
置き換えを試みます。

(7)それ以外のFR
120fps精度で使用可能なFRは他にもありますが、5(dw10)フレームを1パケットとして
処理する仕様上、対応がちょっと面倒なので今のところ使いません。

/*---------------------Trim末端処理について---------------------*/

EasyVFRモードでavsに出力させる場合、全区間を5(dw10)フレーム単位で扱う
仕様上、一部のTrim末端において変則的な記述を行う場合があります。

たとえば5フレームの縞がIPPPIな場合(5,1,4)か(5,2,4)で解除可能ですが、この
区間をTrimすると、通しでは解除されていたはずの末端フレームが再び縞になって
しまう場合があります。
これはdw10フレームの最後のフレームは次の11フレーム目のフィールドを使用しており、
そこでTrimしてしまうとフィールドの取得ができなくなって代わりに前のフィールドを
使って補うためです。

これに対処するため、こういった区間ではTrimの末尾を1フレーム増やします。
この場合、(5,2,4)の時はTrimが5の倍数の時と返されるフレーム数が同じなので
問題ありません。(5,1,4)ではフレームが1枚増えてしまうので

fc=framecount()
Trim(10000,15000).DoubleWeave().PullDown(1,4).Loop(0,fc,0)

とLoop()を追加して末尾のフレームを1枚カットします。
ここでのfcはTrim＆プルダウン解除後のフレーム数ではなく、元々のクリップ全体の
総フレーム数が代入されていますが、実在のフレーム数より多い数字を入れる分には
問題無いので、取り得る最大値である総フレーム数を入れてます。

正しく書くならば
Trim(10000,15000).DoubleWeave().PullDown(1,4).Loop(0,4000,0)

となりますが、これは後で編集したりする際に間違えやすかったり何かと面倒なので。

この辺のとこ、もうちょっと簡潔に記述できる代案があれば教えて欲しいところです(*_*)

Itsのコマンドではこういった問題は起きないようなので通常通りの記述です。

Copyright (C) 2011 by putin