# These are the set of transition names from the ffmpeg xfade filter that we allow.
# This is mainly here to prevent someone putting in arbitrary strings and causing weird problems.
KNOWN_XFADE_TRANSITIONS=[
"fade",
"wipeleft",
"wiperight",
"wipeup",
"wipedown",
"slideleft",
"slideright",
"slideup",
"slidedown",
"circlecrop",
"rectcrop",
"distance",
"fadeblack",
"fadewhite",
"radial",
"smoothleft",
"smoothright",
"smoothup",
"smoothdown",
"circleopen",
"circleclose",
"vertopen",
"vertclose",
"horzopen",
"horzclose",
"dissolve",
"pixelize",
"diagtl",
"diagtr",
"diagbl",
"diagbr",
"hlslice",
"hrslice",
"vuslice",
"vdslice",
"hblur",
"fadegrays",
"wipetl",
"wipetr",
"wipebl",
"wipebr",
"squeezeh",
"squeezev",
"zoomin",
"fadefast",
"fadeslow",
"hlwind",
"hrwind",
"vuwind",
"vdwind",
"coverleft",
"coverright",
"coverup",
"coverdown",
"revealleft",
"revealright",
"revealup",
"revealdown",
]
# This is mainly here to prevent someone putting in arbitrary strings and causing weird problems,
# and to provide descriptions.
# See https://trac.ffmpeg.org/wiki/Xfade for examples.
KNOWN_XFADE_TRANSITIONS={
"fade":"A simple cross-fade.",
"fadeblack":"A fade to black then to the new video.",
"fadewhite":"A fade to white then fade to the new video.",
"fadegrays":"The old video fades to grayscale then to the new video.",
"wipeleft":"A wipe from right to left.",
"wiperight":"A wipe from left to right.",
"wipeup":"A wipe from bottom to top.",
"wipedown":"A wipe from top to bottom.",
"slideleft":"The old video slides left as the new video comes in from the right.",
"slideright":"The old video slides right as the new video comes in from the left.",
"slideup":"The old video slides up as the new video comes in from the bottom.",
"slidedown":"The old video slides down as the new video comes in from the top.",
"circlecrop":"Circular black mask comes in from edges to center, then out again with new video.",
"rectcrop":"Rectangular black mask comes in from edges to center, then out again with new video.",
"distance":"???",
"radial":"Similar to clock wipe, but with a cross-fading line.",
"smoothleft":"Similar to wipe left, but with a cross-fading line.",
"smoothright":"Similar to wipe right, but with a cross-fading line.",
"smoothup":"Similar to wipe up, but with a cross-fading line.",
"smoothdown":"Similar to wipe down, but with a cross-fading line.",
"circleopen":"Circular wipe from outside in, with a cross-fading line.",
"circleclose":"Circular wipe from inside out, with a cross-fading line.",
"vertopen":"Wipe from center to either side, with a cross-fading line.",
"vertclose":"Wipe from either side to center, with a cross-fading line.",
"horzopen":"Wipe from center to top and bottom, with a cross-fading line.",
"horzclose":"Wipe from top and bottom to center, with a cross-fading line.",
"dissolve":"Similar to a fade, but each pixel changes instantly, more pixels change over time.",
"pixelize":"Pixelates the image, switches to new video, then unpixelates.",
# TODO the rest later
"diagtl":"",
"diagtr":"",
"diagbl":"",
"diagbr":"",
"hlslice":"",
"hrslice":"",
"vuslice":"",
"vdslice":"",
"hblur":"",
"wipetl":"",
"wipetr":"",
"wipebl":"",
"wipebr":"",
"squeezeh":"",
"squeezev":"",
"zoomin":"",
"hlwind":"",
"hrwind":"",
"vuwind":"",
"vdwind":"",
"coverleft":"",
"coverright":"",
"coverup":"",
"coverdown":"",
"revealleft":"",
"revealright":"",
"revealup":"",
"revealdown":"",
"fadefast":"???",
"fadeslow":"???",
}
# These are custom transitions implemented using xfade's custom transition support.
# It maps from name to the "expr" value to use.
# It maps from name to (description, expr).
# In these expressions:
# X and Y are pixel coordinates
# A and B are the old and new video's pixel values
# W and H are screen width and height
# P is a "progress" number from 0 to 1 that increases over the course of the wipe
CUSTOM_XFADE_TRANSITIONS={
# A clock wipe is a 360 degree clockwise sweep around the center of the screen, starting at the top.
# It is intended to mimic an analog clock and insinuate a passing of time.
# It is implemented by calculating the angle of the point off a center line (using atan2())
# then using the new video if progress > that angle (normalized to 0-1).
"clockwipe":"if(lt((1-atan2(W/2-X,Y-H/2)/PI) / 2, P), A, B)",
# The classic star wipe is an expanding 5-pointed star from the center.
# It's mostly a meme.
# It is implemented by converting to polar coordinates (distance and angle off center),
# then comparing distance to a star formula derived from here: https://math.stackexchange.com/questions/4293250/how-to-write-a-polar-equation-for-a-five-pointed-star
"A 360 degree clockwise sweep around the center of the screen, starting at the top.\n"
"Intended to mimic an analog clock and insinuate a passing of time.",
# Implemented by calculating the angle of the point off a center line (using atan2())
# then using the new video if progress > that angle (normalized to 0-1).
"if(lt((1-atan2(W/2-X,Y-H/2)/PI) / 2, P), A, B)",
),
"starwipe":(
"Wipe using an expanding 5-pointed star from the center. Mostly a meme.",
# Implemented by converting to polar coordinates (distance and angle off center),
# then comparing distance to a star formula derived from here: https://math.stackexchange.com/questions/4293250/how-to-write-a-polar-equation-for-a-five-pointed-star