久々に AviSynth+ のプラグインとスクリプトを見なおした結果……

Software
この記事は約19分で読めます。
スポンサーリンク

はじめに

 AviSynth+ で使用しているプラグインは物によって更新頻度が低く、何年も前の物を使っていたりなんて事もあったりする。
 また、スクリプト内のパラメータもその時々の気分で変わってきたりもする。
 そんなもんで年に 2~3 回くらいやっているプラグインとスクリプトの見なおした結果、罠に掛かっていたかのような事実が分かった。
 問題を解決した事により、x265 による HEVC エンコード速度が 1.8 倍になったお話しである。

プラグインの更新チェック

 AviSynth+ で筆者が使用しているプラグインと MTMode の動作設定は次の通り。
 一部テストで使った物はコメントアウトして残していたりする。

SetFilterMTMode("DEFAULT_MT_MODE",         MT_SERIALIZED)

SetFilterMTMode("D3DVP",                   MT_MULTI_INSTANCE)
SetFilterMTMode("Deblock",                 MT_NICE_FILTER)
SetFilterMTMode("EraseLOGO",               MT_MULTI_INSTANCE)
SetFilterMTMode("FFT3dGPU",                MT_SERIALIZED)
SetFilterMTMode("FluxSmoothST",            MT_SERIALIZED)
SetFilterMTMode("KNLMeansCL",              MT_MULTI_INSTANCE)
SetFilterMTMode("MPEG2Source",             MT_NICE_FILTER)
SetFilterMTMode("MipSmooth",               MT_SERIALIZED)
SetFilterMTMode("TDecimate",               MT_SERIALIZED)
SetFilterMTMode("TDeint",                  MT_MULTI_INSTANCE)
SetFilterMTMode("TFM",                     MT_MULTI_INSTANCE)
SetFilterMTMode("UnsharpMask",             MT_MULTI_INSTANCE)
SetFilterMTMode("aWarpSharp2",             MT_NICE_FILTER)
SetFilterMTMode("eedi3",                   MT_MULTI_INSTANCE)
SetFilterMTMode("neo_f3kdb",               MT_MULTI_INSTANCE)
SetFilterMTMode("nnedi3",                  MT_MULTI_INSTANCE)
SetFilterMTMode("warpsharp",               MT_MULTI_INSTANCE)
SetFilterMTMode("yadifmod2",               MT_NICE_FILTER)
 
#********** Initialization
PluginPath = "C:\AviSynth+\plugins64+\"
LoadPlugin(PluginPath + "MPEG2DecPlus64.dll")
LoadPlugin(PluginPath + "delogo.dll")
LoadPlugin(PluginPath + "Deblock.dll")
LoadPlugin(PluginPath + "nnedi3.dll")
LoadPlugin(PluginPath + "TIVTC.dll")
LoadPlugin(PluginPath + "KNLMeansCL.dll")
LoadPlugin(PluginPath + "neo-f3kdb.dll")
LoadPlugin(PluginPath + "warpsharp.dll")
LoadPlugin(PluginPath + "TDeint.dll")
#LoadPlugin(PluginPath + "FluxSmoothSSSE3.dll")
LoadPlugin(PluginPath + "yadifmod2.dll")
#LoadPlugin(PluginPath + "FFT3dGPU.dll")

 で、これらプラグインに更新された物が無いかチェックを行い、更新されていれば差し替えを行っていった。

Auto Load の罠

 プラグインは別に LoadPlugin で読み込まなくても Auto Load 対応の物であればスクリプト評価の後に自動で読み込まれる。
 今回、この Auto Load のせいで問題が発生していた。

 問題となっていた関数は MPEG2Source()BlindPP() の 2 つ。
 MPEG2Source() は DGIndex で demux した際に生成される d2v ファイルを指定することでソースとなる TS ファイルを読み込む。
 BlindPP() はブロックノイズを除去する為のフィルタ。

 まず MPEG2Source を使うために MPEG2DecPlus64.dll を Load していた。
 次に筆者は BlindPP も使いたかったが、昔使っていた DGDecode.dll に MPEG2Source と BlindPP が内蔵されていたからと、MPEG2DecPlus64.dll にも両者が内蔵されている物とばかり思っていた。これが大間違いだった。

 改めて現状の動作を見なおしたら次の様になっていた。

  • MPEG2DecPlus64.dll を Load して MPEG2Source を使ったつもりになっていた。
  • 実際にはスクリプト内にあった BlindPP を使うために Plugins64+ フォルダにあった DGDecode.dll ver. 1.5.8.0 が Auto Load されていた。
  • Auto Load で読み込まれた DGDecode.dll が優先されることになり、MPEG2Source の内容は古い 1.5.8.0 の物になっていた。
  • Auto Load で読み込まれた DGDecode.dll のお陰で BlindPP が使えていた。
  • つまり MPEG2DecPlus64.dll の Load は全く以て無意味だった。

 なんてちょっとややこしい事になっていたと分かった。

Auto Load に頼らない方法で解決

 原因が Auto Load にあるのなら、無効化して全てのプラグインを手動で Load すれば解決。
 その為には avs ファイル行頭に次の 1 行を追加してあげる必要がある。

ClearAutoloadDirs()

 あとは Auto Load に頼っていた部分にエラーが出るので、LoadPlugin で改めてプラグインを指定して読み込ませた。
 そして今までは MPEG2Source() の使用に MPEG2DecPlus64.dll を読み込ませていたつもりで DGDecode.dll 1.5.8.0 を使ってしまっていたが、DGDecode.dll オリジナルが約 11 年ぶりに更新され、Ver. 2.0.0.5 になっていたから入れ替えを行った。

DGMPGDec MPEG1/2 Decoder and Frame Server

 しかしまぁ、この最新版では内蔵されていた BlindPP が無効化されており、使用出来ないという事に。
 代わりに Deblock() を使用する事となった。

調整の後エンコード速度

 DGDecode.dll が 2.0.0.5 になったことでここまでエンコード速度が変わる物なのかと驚いたもんで。

 調整前にエンコードした時のエンコード速度は 39.55fps だった。
 これが調整後には 71.46fps にまで 1.8 倍の伸びを見せてくれた。
 共にソースは同一の 24:00 アニメで、相違点は MPEG2Source に使用する dll ファイルの違いとブロックノイズ除去フィルタを BlindPP から Deblock へ変更の 2 点のみ。

 BlindPP から Deblock にフィルタを変えたことが原因なのかもと思ったが、DGDecode.dll 1.5.8.0 の MPEG2Source + Deblock に変えても元通り遅くなったので DGDecode.dll 2.0.0.5 の MPEG2Source が速いという事になるのかなと。

おわりに

 今回の問題に何年気付かずにいたのかなー!!? と自分を責めたい気分になってくるのだが、自分で気付いたしまぁ良いかなと。
 それにしても MPEG2Source という動画ソースの読み込みに使う dll を入れ替えただけでここまで速くなるとは思いもよらず、結果としては良い物が得られたかなと思う。

筆者 avs ファイルをドーンとペタり

 変数 editmode で解像度や画質の選択、変数 chNo で配列 ch からロゴ消しの局名を選択するタイプのスクリプト。

SetMemoryMax(8192)
ClearAutoloadDirs()

SetFilterMTMode("DEFAULT_MT_MODE",         MT_SERIALIZED)

SetFilterMTMode("D3DVP",                   MT_MULTI_INSTANCE)
SetFilterMTMode("Deblock",                 MT_NICE_FILTER)
SetFilterMTMode("EraseLOGO",               MT_MULTI_INSTANCE)
SetFilterMTMode("FFT3dGPU",                MT_SERIALIZED)
SetFilterMTMode("FluxSmoothST",            MT_SERIALIZED)
SetFilterMTMode("KNLMeansCL",              MT_MULTI_INSTANCE)
SetFilterMTMode("MPEG2Source",             MT_NICE_FILTER)
SetFilterMTMode("MipSmooth",               MT_SERIALIZED)
SetFilterMTMode("TDecimate",               MT_SERIALIZED)
SetFilterMTMode("TDeint",                  MT_MULTI_INSTANCE)
SetFilterMTMode("TFM",                     MT_MULTI_INSTANCE)
SetFilterMTMode("UnsharpMask",             MT_MULTI_INSTANCE)
SetFilterMTMode("aWarpSharp2",             MT_NICE_FILTER)
SetFilterMTMode("eedi3",                   MT_MULTI_INSTANCE)
SetFilterMTMode("neo_f3kdb",               MT_MULTI_INSTANCE)
SetFilterMTMode("nnedi3",                  MT_MULTI_INSTANCE)
SetFilterMTMode("warpsharp",               MT_MULTI_INSTANCE)
SetFilterMTMode("yadifmod2",               MT_NICE_FILTER)
 
#********** Initialization
PluginPath = "C:\AviSynth+\plugins64+\"
#LoadPlugin(PluginPath + "MPEG2DecPlus64.dll")
LoadPlugin(PluginPath + "DGDecode_2.0.0.5.dll")
#LoadPlugin(PluginPath + "DGDecode_1.5.8.0.dll")
LoadPlugin(PluginPath + "delogo.dll")
LoadPlugin(PluginPath + "Deblock.dll")
LoadPlugin(PluginPath + "nnedi3.dll")
LoadPlugin(PluginPath + "TIVTC.dll")
LoadPlugin(PluginPath + "KNLMeansCL.dll")
LoadPlugin(PluginPath + "neo-f3kdb.dll")
LoadPlugin(PluginPath + "warpsharp.dll")
LoadPlugin(PluginPath + "TDeint.dll")
#LoadPlugin(PluginPath + "FluxSmoothSSSE3.dll")
LoadPlugin(PluginPath + "yadifmod2.dll")
#LoadPlugin(PluginPath + "FFT3dGPU.dll")
#********** Loading 
MPEG2Source("demux.d2v")
AudioDub(last, WavSource("faw.wav"))

# *****************************************************
# *** 編集が終わったら 1~3 にして保存する (De-interlace / 24fps ON/OFF) ***
# 0 = Edit Mode, 1 = 720p, 2 = 1080p, 3 = 720p Low.Quality, 5 = debug
editmode = 0

# *****************************************************

# *** 放送局によって EraseLogo のパラメータを変える ***
# chNo : 0 = TOKYO MX, 1 = TBS, 2 = TV TOKYO, 3 = FujiTV
chNo = 0
ch = ["mx", "tbs", "tx", "cx"]

#********** Edit *****************************************************
# Trimming
#Trim(491, 7383) ++ Trim(9183, 23327) ++ Trim(25127, 46494) ++ Trim(48294, 49041)

# DeLetter
#deletterl(29*2+1, 7896*2+1, "mx")
#deletterl(8301*2, 21412*2+1, "mx")
#deletterl(21517*2, 42780*2, "mx")
#deletterl(85471, 85560, "mx")
#deletterl(6114, 42408)

#********** DeLogo
if ( ch[chNo] == "mx" ) {
    # -- TOKYO MX1 --
    #EraseLOGO(logofile="S:\tsenc\Logo\20180710_TokyoMX1 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=0, fadein=0, fadeout=1, end=43965,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180710_TokyoMX1 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=0, fadein=0, fadeout=0, end=43064,interlaced=true)

}
else if ( ch[chNo] == "tbs" ) {
    # -- TBS --
    #EraseLOGO(logofile="S:\tsenc\Logo\20200404_TBS 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=0, fadein=0, fadeout=9, end=4490,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20200404_TBS 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=4503, fadein=9, fadeout=9, end=16448,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20200404_TBS 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=16461, fadein=9, fadeout=8, end=43149,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20200404_TBS 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=43165, fadein=9, fadeout=8, end=43898,interlaced=true)
}
else if ( ch[chNo] == "cx" ) {
    # -- FujiTV --
    #EraseLOGO(logofile="S:\tsenc\Logo\20141230_FujiTV 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0,start=0, fadein=0, fadeout=0, end=-1,interlaced=true)
}
else if ( ch[chNo] == "tx" ) {
    # -- TV Tokyo --
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=0, fadein=0, fadeout=0, end=-1,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=6, fadein=0, fadeout=0, end=2966,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=3003, fadein=0, fadeout=1, end=17802,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=17837, fadein=1, fadeout=0, end=32636,interlaced=true)
    #EraseLOGO(logofile="S:\tsenc\Logo\20180117_TVTokyo 1440x1080.lgd",pos_x=0, pos_y=0, depth=128,yc_y=0, yc_u=0, yc_v=0, start=32673, fadein=0, fadeout=0, end=43575,interlaced=true)
}

#********** Effects
if ( editmode >= 1 ) {
    #*** DeInterlace
    AssumeTFF()
    
    if ( editmode != 3 ) {
        TIVTC24P2()
    } else if ( editmode == 3 ) {
        Yadifmod2( mode=0, order=-1, field=-1, edeint=nnedi3() ).TDecimate( mode=1, hybrid=0 )
    }
    
    #*** Noise Reduction
    if ( editmode != 3 ) {
        KNLMeansCL( d = 1, a = 1, s = 4, h = 3 )                        # Tuned 2021.05.02
    }
}

#********** Resize & Deblock
if ( editmode == 1 ) {              # 720p
    Spline36Resize(960, 720)
    Deblock( quant=26, aOffset=0, bOffset=0, planes="yuv" )
} else if ( editmode == 2 ) {       # 1080p
    Spline36Resize(1440, 1080)
    Deblock( quant=26, aOffset=0, bOffset=0, planes="yuv", opt=0 )      # Tuned 2021.05.03 01:08
} else if ( editmode == 3 ) {       # 720p fast
    Spline36Resize(960, 720)
} else if ( editmode == 5 ) {       # 720p for debug
    Spline36Resize(1280, 720)
    Deblock( quant=26, aOffset=0, bOffset=0, planes="yuv", opt=0 )
} else {                            # 720p default
    BicubicResize(1280, 720)
}

#********** Effect ***************************************************
if ( editmode >= 1 ) {
    if ( editmode != 3 ) {
        UnsharpMask(18, 5, 10)
        #WarpSharp(64, 2, 80, -0.6)
        #aWarpSharp(depth=32.0, blurlevel=1, thresh=0.3, cm=0)
    
        #*** Debanding
        ConvertBits( bits = 10 )
        neo_f3kdb( output_depth = 10 )
    }
}

#********** END ******************************************************
Prefetch( threads = 8 )
return last

function TIVTC24P2(clip clip){
Deinted=clip.TDeint(order=-1,field=-1,edeint=clip.nnedi3(field=-1))
clip = clip.TFM(mode=6,order=-1,PP=7,slow=2,mChroma=true,clip2=Deinted)
clip = clip.TDecimate(mode=1)
return clip
}
スポンサーリンク
著者プロフィール
ぶっち

本格的に PC へ触れ始めてたのは 1990 年位から。
興味は PC 全般。OS は Windows と Linux などを嗜む。
プログラマやネットワークエンジニアを経てフリーに活動している 2 児の父なアラフォーのおじさんです。

ぶっちをフォローする
ぶっちろぐ

コメント

タイトルとURLをコピーしました