※このブログ記事は古いので、何か間違ったことを書いているかもしれません。ご注意ください。


 AviUtlのフィルタ「間引ける1/2縮小」というのを作ったのでそれに関する薀蓄です。
 フィルタはいつものページにアップしてあります。

 AviUtl プラグイン フィルタ by うえぽん

 このフィルタはセガサターンのエミュレータ「SSF」の動画を編集するために作りました。セガサターンの画面モードは320x224~704x480と幅広くあります。704x224なんてパターンもあったりします。しかしSSFでは画面モードが320x224の時でも二倍の640x448で表示していたりします(遊ぶだけならその方が良いのですが)。しかし、動画にする場合は本来の320x224の方が容量の節約になります。
 そこでこのフィルタを作ってみました。この程度のことは既存のフィルタでも同じことができるかもしれません。

●SSFの画面は縦方向に補間されている?
 下の画像はSSFの同じ場面をキャプしたものです。左はPrintScreenでキャプ、右はSSFのスナップショットでキャプしたものです。

SSFより


 よく見ると左側の方が少しぼやけています。どうやら縦方向にだけ補間されているようです。おそらくWindowsのAPIか何かで縦に引き伸ばしているのだと思います。ディスプレイドライバーが親切に補間しているようです。Bilinear FilteringをOFFにしても変化はなく同じ状態です。
 これをそのまま縮小してしまうとさらにぼやけた映像になります。だからと言ってラインを間引いて縮小しても右側と同じになりません。
 もしくっきりした映像が欲しいなら、スキャンラインをONにしてキャプし、当フィルタで加工すると良いと思います。

●インタレース解除にも使える?
 バーチャファイター2のフレームは下のようにブレブレしてます。テレビのNTSC方式が奇数ラインと偶数ラインを交互に表示しているのを利用して、解像度を上げつつ処理を半分にするためだったと思います。

VF2スナップ1


 この動画をキャプするには、間引いて1/2に縮小すればいいようです。下の画像が単純に間引いたものです。

VF2スナップ2


 しかしテロップのWのあたりなどがギザギザしています。これはテロップが704x448なのに単純に間引いてしまったからです。そこで横方向だけはブレンドして縮小することにします。

VF2スナップ3


 これでだいぶマシになりました。よく見るとギザギザしている部分もありますが、動画にしてしまえばあまり気にならないかと思います。

●ベンチマーク
 「間引ける1/2縮小」には簡単なベンチマーク機能がついてます。マルチスレッドの効果があるのか調べるために付けてみました。
 私が使っている環境はAthlon X2 4200+(AM2)、2.2GHzを約2.4GHzにオーバークロック、メモリはDDR2で約800MHz動作です。これで1280x720の画像を縮小した際の結果は以下の通りです。
-マルチスレッドシングルスレッド上昇率
間引き1.23 sec1.44 sec14.6%
横ブレンド1.24 sec1.65 sec24.8%
縦ブレンド1.96 sec2.24 sec12.5%
4ドットブレンド1.96 sec2.40 sec18.3%
 興味深いのは、縦ブレンドと横ブレンドは同じ計算量なのに横ブレンドの方が処理時間が短いことです。おそらく横ドット同士の方が連続したメモリなのでCPUの内部キャッシュにヒットしやすいためだと思います。メモリ転送量も減っているはずです。
 マルチスレッドで12%~25%ぐらい速度アップしてます。Athlon X2のL2キャッシュは非共有なのでマルチスレッドにすると都合L2キャッシュが2倍になるため、それによる速度アップがほとんどではと考えています。つまり計算速度が倍になったことによる速度アップはそれほど無いと推測しています。L2キャッシュが大きいCPUだとマルチスレッドによる速度アップ率は少ないのではないでしょうか。
 あとマルチスレッドにしても処理時間が同じになってしまうのは、もしかしたらメモリ転送量の壁があるのかもしれません。

●マイナス時の四捨五入
 四捨五入は0.5して小数点以下切捨てという処理が一般的です。しかし-2.5のようにマイナス時が厄介です。これは-2.0にしても-3.0でも良いようですが、YUVの場合、-2.0の方に丸めてしまうと全体的に色が偏ってしまいます。あまり気にならないレベルですが、そういう計算をしているフィルタがいくつも重なっていくと誤差が蓄積していき気になるレベルになるかもしれません。
 当フィルタではマイナスの値をとらない輝度情報は四捨五入、色情報はマイナスもあるので単純に切り捨てるようにしています。