ConditionalFilter

ConditionalFilter(clip "testclip", clip "source1", clip "source2", string "filter", string "operator", string "value", bool "show")

ConditionalFilter gibt source1 zurück, wenn die Bedingung, die durch filter+operator+value angegeben ist, zutrifft. Andernfalls wird source2 zurückgegeben. Wenn filter nicht ausdrücklich auf einen Clip angewendet wird, so wird der auf den testclip angewendet. Der Ton wird source1 entnommen. Am Beispiel:

Es werden Frames von "vid_blur" genommen, wenn der durchschnittliche Helligkeitswert eines Frames unter 20 ist. Ansonsten wird der Original-Frame "vid" genommen. Wenn man am Ende "true" hinzufügt, wird der aktuelle Wert angezeigt:

vid = AviSource("Dateiname.avi")
vid_blur = vid.Blur(1.5)
ConditionalFilter(vid, vid_blur, vid, "AverageLuma()", "lessthan", "20")

filter kann jeder interner Filter sein, aber auch einige vordefinierte Funktionen (siehe unten).
Für operator kann man "equals", "morethan" oder "lessthan" wählen. Oder natürlich stellvertretend "=", ">" oder "<".

Die internen Funktionen sind (bis jetzt):
AverageLuma(clip)
AverageChromaU(clip)
AverageChromaV(clip)
Dies gibt den durchschnittlichen Wert des Pixels einer Ebene (Kanal) zurück. (Erfordert YV12 und ISSE).

RGBDifference(clip1, clip2)
LumaDifference(clip1, clip2)
ChromaUDifference(clip1, clip2)
ChromaUDifference(clip1, clip2)
Diese Funktionen geben als Dezimalzahl zwischen 0 und 255 die absolute Differenz zweier Ebenen (Kanäle) zurück. (Erfordert YV12, ISSE)

Diese Funktionen beziehen sich immer auf "last". Da man diesen Parameter nicht spezifizieren braucht, wurde er durch den Testclip ersetzt.

Andere interne Funktionen sind:
RGBDifferenceFromPrevious(clip)
YDifferenceFromPrevious(clip)
UDifferenceFromPrevious(clip)
VDifferenceFromPrevious(clip)
RGBDifferenceToNext(clip)
YDifferenceToNext(clip)
UDifferenceToNext(clip)
VDifferenceToNext(clip)

Diese Funktionen sollte recht nett sein, wenn man Szenenwechsel erkennen will:

Beispiel:

Es wird der letzte Frame vor einem Szenenwechsel durch den ersten Frame nach dem Szenenwechsel ersetzt:
ConditionalFilter(last, last, last.trim(1,0), "YDifferenceToNext()", ">", "10", true)

Weitere interne Funktionen:
YPlaneMax(clip, float threshold)
UPlaneMax(clip, float threshold)
VPlaneMax(clip, float threshold)
YPlaneMin(clip, float threshold)
UPlaneMin(clip, float threshold)
VPlaneMin(clip, float threshold)
YPlaneMedian(clip)
UPlaneMedian(clip)
VPlaneMedian(clip)
YPlaneMinMaxDifference(clip, float threshold)
UPlaneMinMaxDifference(clip, float threshold)
VPlaneMinMaxDifference(clip, float threshold)

Threshold ist das Verhältnis, wieviel Prozent an Pixeln über oder unter dem Minimum erlaubt sind. Der Schwellenwert ist optional und standardmäßig 0.



ScriptClip


ScriptClip(clip "clip", string "function", bool "show")

ScriptClip gibt den Clip zurück, der von der Funktion für jeden Frame ausgewählt wurde.

Beispiele:

Dies zeigt den Unterschied gegenüber dem vorherigen Frame im aktuellen Frame an:
clip = AviSource("C:\Dateiname.avi")
ScriptClip(clip, "Subtitle(String(YDifferenceFromPrevious))")

Hier wird Blur auf jeden Frame angewendet entsprechend dem Unterschied zum vorherigen Frame.
Außerdem zeigt es, wie Fehler angezeigt werden bei manchen Frames :)
clip = AviSource("C:\Dateiname.avi")
ScriptClip(clip, "Blur(YDifferenceFromPrevious/20.0)")

Dies wendet TemporalSoften in sehr ruhigen Szenen und Blur mit variablen Parametern in bewegten Szenen an. Wir weisen auch eine Variable zu, weshalb es einen Zeilensprung gibt:
function fmin(float "f1", float "f2") {
  return (f1<f2) ? f1 : f2
}
clip = AviSource("C:\Dateiname.avi")
ScriptClip(clip, "diff = YDifferenceToNext()"+chr(13)+"diff > 2.5 ? Blur(fmin(diff/20,1.5)) : TemporalSoften(2,7,7,3,2)")

Beschränkungen: Das Ergebnis des Skriptes MUSS exakt die gleichen Eigenschaften (Farbraum, Breite und Höhe) haben wie der Clip, den ScriptClip bekommen hat. Das Ergebnis kann eine andere Länge haben, aber mindestens die des Quellclips. Der Ton eines Clips wird unverändert durchgeschleift. Bei zwei unterschiedlichen Quellen (z.B. Mpeg2Dec3 und AviSource) kann es zu Problemen mit dem Farbräumen kommen - ein beliebter Fehler.



FrameEvaluate


FrameEvaluate(clip clip, script function, bool "after_frame")

Ähnlich wie ScriptClip, außer dass das Ergebnis des Filters ignoriert wird. Kann dazu genutzt werden, um Variablen usw. zuzuweisen. Die Frames werden direkt durchgeschleift.
Mit after_frame=true/false bestimmt man, ob das Skriptpt bevor (Standard) oder nachdem der Frame vom Filter davor geholt wurde ausgewertet werden soll.