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.