AviSynth+ Changelog

What's new in AviSynth+ 3.7.3

Jul 16, 2023
  • Add "bold"=true (linux/NO_WIN_GDI: false), "italic"=false, "noaa"=false parameters to "ShowFrameNumber", "ShowCRC32", "ShowSMPTE", ShowTime" filters.
  • Add "noaa" parameter to SubTitle and Info. Setting it true will disable antialiasing. Useful when someone would use "VCR OSD Mono" as-is, without beautifying the outlines.
  • Fix: plane fill wrongly assumed that pitch is rowsize, which is not the case after a Crop It would result in crash e.g. in HistogramRGBParade.
  • Enhancement: much quicker YV24 to RGB32/RGB24 conversion when AVX2 instruction set is supported. (+50% fps at i7-11700).
  • UserDefined2Resize got an 's' parameter (to the existing b and c): support, default value = 2.3 (following DTL2020's addition in jpsdr's MT resizer repo, UserDefined2ResizeMT filter).
  • Fix: ConvertXXX to accept YV411 clip's frame property _ChromaLocation set to 'left' (and 'topleft' and 'bottomleft' which give the same result) instead of giving an error message.
  • Fix: bitrol/bitror functions return incorrect results when first argument is negative. Regression since the asm code of Avisynth 2.6 classic was ported to C in Avisynth+ project.
  • Add SetChannel parameter: channel string syntax: (similar to ffmpeg) a channel number followed by "c" for getting the default layout for a given number of channels.
  • Add SetChannel parameter: channel string syntax: a simple number is treated as the actual numeric mask.
  • Add "speaker_all" to accepted layout mask strings.

New in AviSynth+ 3.7.2 (Mar 18, 2022)

  • C interface Win32 access: fix issue by adding V8 interface function…
  • … names to avisynth.def
  • or else names are decorated (Issue #276)
  • e.g. DLL published _avs_get_frame_props_ro@8 instead of avs_get_frame_props_ro
  • ShowRed/Green/Blue/Alpha/Y/U/V: addition to earlier fixes:
  • When clips are planar and both source and destination format have alpha plane,
  • then it will be copied instead of filled with 255d.
  • Additional checking is done for alpha plane size when ShowU/V, because when
  • source is subsampled the original alpha plane cannot be copied (larger).
  • ConvertBits:
  • Does not get frame 0 in constructor for frame properties if 'fulls' is directly specified. (magiblot)
  • May make script initialization much quicker (Issue #275)
  • #275
  • Trim, AudioTrim: bool 'cache' (default true) parameter.
  • Workaround for Issue #274, lower memory consumption but may be slower.
  • Benefits heavily depend on how trimmed clips are used later.
  • Expr: scale_inputs to case insensitive and add floatUV to error message as an allowed value.
  • propCopy: able to specify that the property list is negative.
  • bool "exclude" = false # default: "props" is positive list
  • propCopy(org,true,props=["_Matrix", "_ColorRange"], exclude=false) # merge only two properties
  • propCopy(org,true,props=["_Matrix", "_ColorRange"], exclude=true) # merge all, except listed ones
  • propCopy(org,props=["_Matrix", "_ColorRange"]) # erase all then copy only selected
  • propCopy(org,props=["_Matrix", "_ColorRange"], exclude = true) # erase all, then copy all, except listed ones
  • Version()
  • New optional parameters
  • int length, int width, int height, string pixel_type, clip c
  • Version clip defaults:
  • length=240, width = -1, height = -1 (-1: automatically sized to fit for font size 24)
  • pixel_type = "RGB24"
  • When 'clip' (a format template) is specified then pixel_type, length,
  • fps data, width and height are defined from it.
  • If any additional 'length', 'width', 'height', 'pixel_type' parameter is given, it overrides defaults.
  • When width and height is given and is <= 0 then it is treated as 'automatic'
  • Covers feature request Issue #261
  • BlankClip: allow 'colors' with array size more than the number of actual planes.
  • If an array is larger, further values are simply ignored.
  • BlankClip, AddBorders, LetterBox: no A=0 check for non-YUVA
  • Fade filter family new parameters
  • int 'color_yuv'
  • array of float 'colors'
  • similar to BlankClip
  • MergeRGB, MergeARGB
  • add MergeARGB parameter "pixel_type", similar to MergeRGB
  • accept pixel_type other than packed RGB formats, plus a special one is "rgb"
  • output format is planar rgb(a) (MergeRGB/MergeARGB) when
  • pixel_type = "rgb" or
  • pixel_type is empty and
  • either input is planar RGB
  • either input is different from 8 or 16 bits (no packed RGB formats there)
  • pixel_type is explicitely set to a valid planar rgb constant e.g. "RGBP10"
  • Accept planar RGB clip in place of input clips and the appropriate color plane is copied from them
  • Fill alpha channel with zero when MergeRGB output pixel_type format is specified to have an alpha plane
  • frame property source is the R clip; _Matrix and _ChromaLocation are removed if R is not an RGB clip
  • PropDelete: accept a non-empty array string as list of property names to remove
  • Parameter is not optional, and has no name. It can be either a string (as before) or an array of strings
  • propDelete("_Matrix") # old syntax, still accepted
  • propDelete(["_Matrix", "_ColorRange"])
  • PropCopy: new string parameter "props" as list of property names to remove
  • "props": a non-empty array of strings
  • old syntax, still accepted:
  • propCopy(org,true) # merge from all org's properties
  • propCopy(org,false) # erase all then copy all org's properties (exact copy)
  • new syntax
  • propCopy(org,true,props=["_Matrix", "_ColorRange"]) # merge
  • propCopy(org,props=["_Matrix", "_ColorRange"]) # erase all then copy only selected
  • Histogram Levels: stop using shades of grey on top of bars.
  • Histogram Levels: use bar color 255 for RGB instead of Y's 235. (and scaled eqivivalents)
  • Fix: Histogram "Levels": prevent crash when factor=0.0
  • Fix: Histogram "Levels": fix regression incorrect "factor" applied for U/V part drawing when format was subsampled (non-444)
  • Regression since 20160916 r2666 (commit 986e275)
  • Histogram "Audiolevels" and StereoOverlay to deny planar RGB
  • Histogram "Luma": support 10-16 and 32 bits
  • Histogram: give parameter name "factor" and type 'float' for Histogram's unnamed optional parameter used in "Level" mode.
  • Other modes just ignore this parameter if given.
  • Fix: Histogram "color" may crash on certain dimensions for subsampled formats.
  • Regression since 20180301 r2632.
  • Fix: Histogram "color" and "color2" mode check and give error on Planar RGB
  • Fix: missing Histogram "color2" CCIR rectangle top and bottom line (black on black)
  • Regression since 3.6.2-test1 (commit 1fc82f0)
  • Fix: Compare to support 10-14 bits
  • was: factor was always using 65535 (2^16-1) instead of (2^bit depth - 1)
  • was: 16 bit luma/rgb color values were used for drawing graph
  • Fix: Compare
  • 'channels' parameter default to "Y" when input is greyscale;
  • instead of "YUV" which was giving error because of U and V does not exist for this format.
  • ShowRed/Green/Blue/Alpha/Y/U/V
  • support YUY2 input
  • support YV411 output
  • (not changed: ShowU/ShowV may give error for 420, 422 or 411 format outputs when clip dimensions are
  • not eligible for a given output subsampling (check for appropriate mod2 or mod4 width or height)
  • Copy alpha from source when target is alpha-capable
  • Fill alpha with maximum pixel value when target is alpha-capable but source ha no alpha component
  • Delete _Matrix and _ChromaLocation frame properties when needed.
  • More consistent behaviour for YUV and planar RGB sources.
  • Default pixel_type is adaptive. If none or empty ("") is given for pixel_type then target format is
  • YUV444 when source is Y, YUV or YUVA
  • RGB32/64 (packed RGB) when source is RGB24/32/48/64
  • RGBP (planar RGB) when source is RGBP or RGBAP
  • When 'rgb' is given for pixel_type then then target format is
  • RGB32/64 (packed) when source is RGB24/32/48/64 - old, compatible way
  • RGB planar when source is planar RGB(A) or YUV(A) or Y - changed from rgb32/64 because all bit depth must be supported
  • When 'yuv' is given (new option!) for pixel_type then then target format is
  • YUV444 for all sources
  • Also there is a new option when pixel_type is still not exact, and is given w/o bit depth.
  • pixel_type which describes the format without bit depth is automatically extended to a valid video string constant:
  • y, yuv420, yuv422, yuv444, yuva420, yuva422, yuva444, rgbp, rgbap
  • Examples:
  • 32 bit video and pixel_type 'y' will result in "Y32"
  • 16 bit video and pixel_type 'yuv444' will result in "YUV444P16"
  • 8 bit video and pixel_type 'rgbap' will result in "RGBAP8"
  • Fix #263. Escaping double-quotes results in error
  • Allow top_left (2) and bottom_left (4) chroma placements for 422 in colorspace conversions, they act as "left" (0, "mpeg2")
  • in order not to give error with video sources which have _ChromaLocation set to other than "mpeg2"
  • See https://trac.ffmpeg.org/ticket/9598#comment:5
  • Fix: Expr LUT operation Access Violation on x86 + AVX2 due to an unaligned internal buffer (<32 bytes)
  • Fix: Chroma full scale as ITU Rec H.273 (e.g +/-127.5 and not +/-127) in internal converters, ColorYUV and Histogram
  • Fix #257: regression in 3.7.1: GreyScale to not convert to limited range when input is RGB. Regression in 3.7.1
  • Accepts only matrix names of limited range as it is put in the documentation.
  • Fix #256: ColorYUV(analyse=true) to not set _ColorRange property to "full" if input has no such
  • property and range cannot be 100% sure established. In general: when no _ColorRange for input and
  • no parameter which would rely on a supposed default (such as full range for gamma), then an
  • output frame property is not added.
  • When no _ColorRange for input and no other parameters to hint color range then
  • gamma<>0 sets full range
  • opt="coring" sets limited range
  • otherwise no _ColorRange for output would be set
  • Overlay (#255): "blend": using accurate formula using float calculation. 8 bit basic case is slower now when opacity=1.0.
  • Higher bit depths and opacity<1.0 cases are quicker.
  • Mask processing suffered from inaccuracy. For speed reasons mask value 0 to 255 were handled
  • as mask/256 instead of mask/255. Since with such calculation maximum value was not the expected 1.0 but rather 255/256 (0.996)
  • this case was specially treated as 1.0 to give Overlay proper results at least the the two extremes.
  • But for example applying mask=129 to pixel=255 resulted in result_pixel=128 instead of 129. This was valid on higher bit depths as well.
  • Note 3.7.2 Test2 has a regression of broken maskless mode for 0<opacity<1 which was fixed in 3.7.2 test 3
  • Fix: Attempt to resolve deadlock when an Eval'd (Prefetch inside) Clip result is
  • used in Invoke which calls a filter with GetFrame in its constructor.
  • (AvsPMod use case which Invokes frame prop read / ConvertToRGB32 after having the AVS script evaluated)
  • Remark: problem emerged in 3.7.1test22 which is trying to read frame properties of the 0th frame in its constructor.
  • A similar deadlock situation was already fixed earlier in Neo branch and had been backported but it did not cover this use case.
  • Note: Prefetch(1) case was fixed in 3.7.2 Test3

New in AviSynth+ 3.7.1 (Jan 1, 2022)

  • Additions:
  • Linux: Show more information when dlopen fails
  • Expr: allow auto scaling effect on pixels obtained from relative addressing
  • New array manipulators: ArrayDel, ArrayAdd, ArrayIns, ArraySet with accepting multi dimensional indexes
  • ExtractY/U/V/R/G/B/A, PlaneToY: delete _ChromaLocation property. Set _ColorRange property to "full" if source is Alpha plane
  • Add new AEP (Avisynth Environtment Property) constants to directly query Avisynth interface main and bugfix version and system endianness:
  • AEP_HOST_SYSTEM_ENDIANNESS, AEP_INTERFACE_VERSION, AEP_INTERFACE_BUGFIX (c++)
  • AVS_AEP_HOST_SYSTEM_ENDIANNESS, AVS_AEP_INTERFACE_VERSION, AVS_AEP_INTERFACE_BUGFIX (c)
  • Interface: introduce AVISYNTHPLUS_INTERFACE_BUGFIX_VERSION.
  • New interface functions env->MakePropertyWritable/VideoFrame::IsPropertyWritable.
  • Expr: allow 'f32' as internal autoscale target (was: i8, i10, i12, i14, i16 were accepted, only integers)
  • Expr: LUT mode! 'lut'=1 or 2 for 1D (lut_x) and 2D (lux_xy) support
  • xPlaneMin/Max/Median/MinMaxDifference to accept old packed formats (RGB24/32/48/64 and YUY2) by autoconverting them to Planar RGB or YV16
  • New runtime function: PlaneMinMaxStats returns an array and/or set global variables.
  • Language syntax: accept arrays in the place of "val" script function parameter type regardless of being named or unnamed.
  • Histogram "Levels": more precise drawing when bit depth is different from histogram's resolution bit depth, plus using full/limited flag.
  • Expr: no more banker's rounding when converting back float result to integer pixels. Using the usual truncate(x+0.5) rounding method
  • ColorYUV: More consistent and accurate output across different color spaces, match with ConvertBits fulls-fulld conversions
  • ColorYUV: set _ColorRange frame property
  • ColorYUV: when no hint is given by parameter "levels" then it can use _ColorRange (limited/full) frame property for establishing source range for gamma
  • ColorYUV "showyuv_fullrange"=true: fix shown U and V ranges. E.g. for bits=8: 128 +/- 127 (range 1..255 is shown) instead of 0..255
  • propShow: display _Matrix, _ColorRange and _ChromaLocation constants with friendly names
  • Expr: new function "sgn". Returns -1 when x is negative; 0 if zero; 1 when x is positive
  • Expr: add "neg": negates stack top: a = -a
  • ConvertBits: Support YUY2 (by autoconverting to and from YV16), support YV411
  • ConvertBits: "bits" parameter is not compulsory, since bit depth can stay as it was before. Call like ConvertBits(fulld=true)
  • ConvertBits: much nicer output for low bit depth targets such as dither_bits 1 to 7.
  • ConvertBits: allow dither down from 8 bit sources by giving a lower dither_bits value
  • ConvertBits: dither=1 (Floyd-S) to support dither_bits = 1 to 16 (similar to ordered dither)
  • ConvertBits: dither=0 (ordered) to allow odd dither_bits values. Any dither_bits=1 to 16 (was: 2,4,6,8,..)
  • ConvertBits: dither=0 (ordered) allow larger than 8 bit difference when dither_bits is less than 8.
  • ConvertBits: Correct conversion of full-range chroma at 8-16 bits. Like 128+/-112 -> 128+/-127 in 8 bits
  • ConvertBits: allow dither from 32 bits to 8-16 bits
  • ConvertBits: allow different fulls fulld when converting between integer bit depths (was: they must have been the same)
  • ConvertBits: allow 32 bit to 32 bit conversion
  • frame property support: _ChromaLocation in various filters (e.g. ConvertToYUV422)
  • Support additional chroma locations "top", "bottom_left", "bottom"
  • New syntax for "matrix" parameters (e.g. in ConvertToYUV444 old:"rec601" new "170m:l") which separate matrix and full/limited marker.
  • Old syntax is still valid but does not support all new matrix values.
  • frame propery support: _Matrix and _ColorRange in various filters. New "matrix" string constants
  • RGB<->YUV (YUY2) conversions: frame property support _Matrix and _ColorRange (_Primaries and _Transfer is not used at all yet)
  • ConvertBits: use input frame property _ColorRange to detect full/limited range of input clip
  • ColorBars, ColorBarsHD, BlankClip: set frame properties _ColorRange and _Matrix
  • New function: propCopy to copy or merge frame properties from one clip to another.
  • xxxPlaneMin xxxPlaneMax, xxxPlaneMinMaxDifference for 32 bit float formats:
  • when threshold is 0 then return real values instead of 0..1 (chroma -0.5..0.5) clamped histogram-based result
  • Allow propGetXXX property getter functions called as normal functions, outside runtime. Frame number offset can be used.
  • YUY2 RGB conversions now allow matrix "PC.2020" and "Rec2020"
  • 4:2:2 conversions: allow ChromaInPlacement and ChromaOutPlacement:
  • Valid values: left/mpeg2, center/mpeg1/jpeg
  • 4:2:0 conversions: new ChromaInPlacement and ChromaOutPlacement values:
  • top_left, left (alias to mpeg2), center (alias to mpeg1), jpeg (alias to mpeg1) (see http://avisynth.nl/index.php/Convert)
  • Expr: atan2 (SIMD acceleration as well)
  • Expr: sin and cos SIMD acceleration (SSE2 and AVX2) port from VapourSynth (Akarin et al.)
  • Expr: x.framePropName syntax for injecting actual frame property values into expression
  • Script functions to supports arrays with _nz type suffix. (one or more)
  • Expr: arbitrary variable names (instead of single letters A..Z), up to 128 different one.
  • Expr: add 'round', 'floor', 'ceil', 'trunc' operators (nearest integer, round down, round up, round to zero)
  • Acceleration requires at least SSE4.1 capable processor or else the whole expression is running in C mode.
  • Recognize ' and b and v in escaped (e"somethg") string literals (see http://avisynth.nl/index.php/The_full_AviSynth_grammar#Literals)
  • Expr: allow TAB, CR and LF characters as whitespace in expression strings
  • Clip types for propSet, propGet, add propSetClip, propGetClip
  • Clip content support for propGetAsArray, propSetArray and propGetAll
  • RGBAdjust: analyse=true 32 bit float support
  • Build environment, Interface:
  • Added stubs for compiling on RISC-V and SPARC
  • Visual Studio 2022: Add /fp:contract to compilation parameters (addition to /fp:precise)
  • Check Visual Studio 2022, add build examples to documentation. Recognized: it has still an option to use v141_xp toolkit
  • CMake build environment: older GCC can be used which knows only -std=c++-1z instead of c++17
  • AviSynth programming interface V8.1 / V9:
  • Add 'MakePropertyWritable' to the IScriptEnvironment (CPP interface), avs_make_property_writable (C interface)
  • Add 'VideoFrame::IsPropertyWritable' (CPP interface), avs_is_property_writable (C interface)
  • Info on Windows XP compatibility (must revert to an older Visual C++ Redistributable)
  • CMake/source: Intel C++ Compiler 2021 and Intel C++ Compiler 19.2 support
  • experimental! Fix CUDA plugin support on specific builds, add CMake support for the option.
  • Fixes for building the core as a static library
  • Fixes:
  • Fix: "Text" filter would crash when y coord is odd and format has vertical subsampling
  • Fix: MinMax runtime filter family: check plane existance (e.g. error when requesting RPlaneMinMaxDifference on YV12)
  • Fix: prevent x64 debug AviSynth builds from crashing in VirtualDub2 (opened through CAVIStreamSynth)
  • Expr: fix conversion factor (+correct chroma scaling) when integer-to-integer full-scale automatic range scaling was required
  • ColorYUV: fix 32 bit float output
  • ColorYUV: fix display when showyuv=true and bits=32
  • ConvertBits: "dither" parameter: type changed to integer. Why was it float? :)
  • ConvertBits: Fix: fulls=true -> fulld=true 16->8 bit missing rounding
  • Fix: Planar RGB 32 bit -> YUV matrix="PC.709"/"PC.601"/"PC.2020" resulted in greyscale image
  • SelectRangeEvery: experimental fix on getting audio part (TomArrow; #232)
  • Fix: Overlay "blend" 10+ bit clips and "opacity"<1 would leave rightmost non-mod8 (10-16 bit format) or non-mod4 (32 bit format) pixels unprocessed.
  • Fix: Overlay "blend" with exactly 16 bit clips and "opacity"<1 would treat large mask values as zero (when proc>=SSE4.1)
  • Parser: proper error message when a script array is passed to a non-array named function argument
  • (e.g. foo(sigma=[1.1,1.1]) to [foo]f parameter signature)
  • Fix: Expr: wrong constant folding optimization when ternary operator and Store-Only (like M^) operator is used together.
  • ColorBars: fixed studio RGB values for -I and +Q for rgb pixel types
  • ColorBarsHD: use BT.709-2 for +I (Pattern 2), not BT.601.
  • Also fixed Pattern 1 Green.Y to conform to SMPTE RP 219-1:2014 (133, not 134).
  • Overlay mode "multiply": proper rounding in internal calculations
  • Fix: ConvertAudio integer 32-to-8 bits C code garbage (regression in 3.7)
  • Fix: ConvertAudio: float to 32 bit integer conversion max value glitch (regression in 3.7)
  • Fix: Crash in ColorBars very first frame when followed by ResampleAudio
  • Fix: frame property access from C interface
  • Fix: StackVertical and packed RGB formats: get audio and parity from the first and not the last clip
  • Optimizations:
  • Quicker ClearProperties and CopyProperties filters (by using MakePropertyWritable instead of MakeWritable).
  • ConvertBits: AVX2 support
  • ConvertBits: Special case for: 8->16 bit fulls=true, fulld=true
  • Expr: consume less bytes on stack. 48x Expr call in sequence caused stack overflow
  • xxxPlaneMin xxxPlaneMax, xxxPlaneMinMaxDifference for threshold 0 became a bit quicker for 8-16 bit formats (~10% on i7-7700)
  • Speedup: Overlay mode "multiply": overlay clip is not converted to 4:4:4 internally when 420 or 422 subsampled format
  • (since only Y is used from that clip)
  • Speedup: Overlay mode "multiply": SSE4.1 and AVX2 code (was: C only)
  • SSE4.1: ~1.2-2.5X speed, AVX2: ~2-3.5X speed (i7700 x64 single thread, depending on opacity full/not, mask clip yes/no)
  • ConvertAudio: Add direct Float from/to 8/16 conversions (C,SSE2,AVX2)

New in AviSynth+ 3.7.0 (Jun 15, 2021)

  • Haiku support
  • PowerPC support
  • Support for building the core as a static library (mcmtroffaes)
  • Fixes for MinGW-w64 compilation
  • Shibatch, TimeStretch, and ImageSeq GCC build support
  • Shibatch, TimeStretch, and ImageSeq non-Windows support
  • Fix: AddBorders did not pass frame properties
  • Fix: propSet, propDelete and propClearAll not to ruin visibility of variables
  • (property read functions are still kept being runtime only)
  • AviSource: fix test5 regression which refused handling old formats like YV24
  • Resizers: throw error on too small dimensions vs. taps
  • Add ShowCRC32 debug filter. Parameters are the same as in ShowFrameNumber
  • Overlay: allow 4:1:1 input
  • Overlay: fix crash when mask is YUV411 and greymask=false
  • Overlay: may work quicker, most input/overlay/mask/output clip format conversions moved to filter constructor
  • RemoveAlphaPlane: do nothing on YUY2 instead of throwing an error message
  • AviSource: support non-printing characters in fourCC code: allow [number] style, e.g. G3[0][16]
  • AviSource: add Y410 (YUVA444P10) format support. Allow 'Y410' pixel_type hints.
  • AviSource: decode b64a, b48r, v210, P210, P010, P016, P216, v410, Y416, r210, R10k, v308, v408, Y410 fourCCs natively.
  • Fix: Average...: check for valid colorspace (e.g. no AverageB for a YUV clip)
  • Add: AverageA
  • New: Average...: allow YUY2, RGB24/32/48/64 inputs
  • Fix: Overlay: Actual frame of a mask clip would be freed up too early in MT environment
  • Fix: ConvertBits to ignore dither parameter instead of throwing error, in a 8 to 8 bit case
  • Fix: GeneralConvolution missing internal rounding on 8-16 bit formats
  • support for Win10 long file path option
  • project: Improve inclusion of the ghc filesystem helper library
  • project: Add a GitHub action workflow
  • posix: fix crash when autoloading imports
  • internally refactored ConvertAudio
  • ConvertBits(8): fix dither=1 (floyd) for RGB48/RGB64
  • Fix: Blur right side garbage: 16 bit+AVX2+non mod32 width
  • Fix: check fn signature with implicite "last" first (3.6 regression)
  • Fix: function parameters provided as arrays (e.g. GrunT callback of WriteFileIf)
  • Fix: ConvertBits (YUV): proper rounding when bit depth is reduced and origin is 10-16 bits
  • (added rounder before bit-shift)
  • New: Histogram("color2") to support 10+ bits.
  • Allow bits=x (x=8,9,10,11,12) parameter for this kind of histogram as well.

New in AviSynth+ 0.1 (r1576) (Dec 19, 2017)

  • Revert BitBlt to Avs2.6a5-implementation.