FilterRangeEx関数

説明

FilterRangeの機能拡張版で、JavaScriptとwarpsharpプラグインを使って、複数の指定範囲にフィルタをかけることができます。

作者

kiraru2002

コード

test.avs

LoadPlugin("warpsharp.dll")
AVISource("foo.avi")
ws = WScript("test.js", "JAVAScript")
ws.WSInvoke("FilterRangeEx", last, "ColorYUV(off_u=255)", 10, 19, 30, 39, 50, 59)
return last

test.js

//************************************************************************************
//**   FilterRangeEx(clip clip, string filter, int s1, int e1, int s2, int s2, ...) **
//**                           ( must be 0 <= s1 <= e1 < s2 <= e2 < s3 <= e3 <... ) **
//************************************************************************************
function FilterRangeEx(clip, filter, avs_args)
{
    var start = new Array(), end = new Array();
    var parm_err = false;
    
    for (var i=2; i < FilterRangeEx.arguments.length; i+=2)
    {
        if (i+1 > FilterRangeEx.arguments.length
            || isNaN(FilterRangeEx.arguments[i])
            || isNaN(FilterRangeEx.arguments[i+1])
            || FilterRangeEx.arguments[i] > FilterRangeEx.arguments[i+1] )
        {
            parm_err = true; break;
        }
        else
        {
            start[start.length] = FilterRangeEx.arguments[i];
            end[end.length] = FilterRangeEx.arguments[i+1];
        }
    }
    for(i=1; i<start.length; i++)
    {
        if(start[i] <= end[i-1]) { parm_err=true; break; }
    }
    return parm_err ? AVS.MessageClip("parameter error") : FilterRange_exec(clip, filter, start, end);
}

function FilterRange_exec(clip, filter, start, end)
{
    AVS.last = clip;
    AVS.Eval("framecount = last.framecount()");
    var framecount = AVS.framecount;
    var range_first = (start[0]==0) ? "" : "Trim(0," + String(start[0]-1) + ") + ";
    for(var i=0; i<start.length; i++)
    {
        var range_in = "Trim(" + String(start[i]) + "," + String(end[i]) + ")." + filter;
        AVS.work = (i==0) ? AVS.Eval(range_first + range_in) : AVS.Eval("work + " + range_in);
        if(i+1<start.length)
        {
            if(end[i]+1 < start[i+1])
            {
                AVS.range_out = AVS.trim(clip, end[i]+1, start[i+1]-1);
                AVS.work = AVS.Eval("work + range_out");
            }
        }
    }
    if(end[end.length-1]+1 < framecount)
    {
        AVS.work = AVS.Eval("work + trim(" + String(end[end.length-1]+1) + ", last.framecount()-1)" );
    }
    return AVS.work;
}

動作に必要なプラグイン

使用例

上の「コード」を参照。

関連ページ

最終更新日時: 2014-03-11 (火) 03:47:50 (3927d)