Extension/Mandelbrot.rd.ext.ps1

<#
.Synopsis
    Generates fractals
.Description
    Generates fractals using the mandelbrot filter.
.Link
    https://ffmpeg.org/ffmpeg-filters.html#mandelbrot
.EXAMPLE
    New-Media -OutputPath "Mandelbrot.gif" -Duration "00:00:05" -Mandelbrot
#>


[Runtime.CompilerServices.Extension()]           # It's an extension
[Management.Automation.Cmdlet("New","Media")]    # that extends New-Media
[Management.Automation.Cmdlet("Show","Media")]   # that extends Show-Media
param(
# The type of fractal source
[Parameter(Mandatory)]
[switch]
$Mandelbrot,

# Set the initial x position (from -100 to 100) (default -0.743644)
[int]
$MandelbrotStartX,

# Set the initial y position (from -100 to 100) (default -0.131826)
[int]
$MandelbrotStartY,

# set the initial scale value (from 0 to FLT_MAX) (default 3)
[double]
$MandelbrotStartScale,

# set the terminal scale value (from 0 to FLT_MAX) (default 0.3)
[double]
$MandelbrotEndScale,
# set the terminal pts value (from 0 to I64_MAX) (default 400)
[double]
$MandelbrotEndPTS,
# set the bailout value (from 0 to FLT_MAX) (default 10)
$MandelbrotBailout,       
# set morph x frequency (from -FLT_MAX to FLT_MAX) (default 0.01)
[double]
$MandelbrotMorphXFrequency,
# set morph y frequency (from -FLT_MAX to FLT_MAX) (default 0.0123)
[double]
$MandelbrotMorphYFrequency,
# set morph amplitude (from -FLT_MAX to FLT_MAX) (default 0)
[double]

$MandelbrotMorphAmplitude,
# set inner coloring mode (from 0 to INT_MAX) (default mincol)
$MandelbrotInnerColoringMode,
# set outer coloring mode (from 0 to INT_MAX) (default normalized_iteration_count)
$MandelbrotOuterColoringMode
)

$fractalSrc = "Mandelbrot"
$fractalArgs = @(
    if ($resolution) {
        "s=$resolution"
    }
    
    if ($MandelbrotStartX) {
        "start_x=$MandelbrotStartX"
    }
    if ($MandelbrotStartY) {
        "start_y=$MandelbrotStartY"
    }
    if ($MandelbrotStartScale) {
        "start_scale=$MandelbrotStartScale"
    }
    if ($MandelbrotEndScale) {
        "end_scale=$MandelbrotEndScale"
    }
    if ($MandelbrotEndPTS) {
        "end_pts=$MandelbrotEndPTS"
    }
    if ($MandelbrotBailout) {
        "bailout=$MandelbrotBailout"
    }
    if ($MandelbrotMorphXFrequency) {
        "morphxf=$MandelbrotMorphXFrequency"
    }
    if ($MandelbrotMorphYFrequency) {
        "morphyf=$MandelbrotMorphYFrequency"
    }
    if ($MandelbrotMorphAmplitude) {
        "morphamp=$MandelbrotMorphAmplitude"
    }
    if ($MandelbrotInnerColoringMode) {
        "inner=$MandelbrotInnerColoringMode"
    }
    if ($MandelbrotOuterColoringMode) {
        "outer=$MandelbrotOuterColoringMode"
    }
)

'-f'
'lavfi'
'-i'
("$fractalSrc=".ToLower() + $(
    $fractalArgs -join ':'
)) -replace '\=$'