github pinterf/AviSynthPlus v3.7.6pre-r4896
Avisynth+ v3.7.6pre-r4896 test build

pre-release11 hours ago

Changes since 3.7.5.r4669 (pre 3.7.6)

Full details:
readme_history.txt ·
changelist

New pixel formats (interface version 13)

  • New YUV(A) 4:4:0 and 4:1:0 (8-32 bit), 4:1:1 above 8 bit, and Y+alpha (YA) (8-32 bit) formats.
  • ConvertToYUV(A)440, ConvertToYUV(A)410, ConvertToYUV(A)411 (all bit depths) and ConvertToYA.
  • Support in Layer, Overlay (including YA), Text/Subtitle, ColorBars, ImageReader, AviSource (YVU9, I410, I411, I440),
    VfW export and BuildPixelType.
  • FFmpeg-style alternate names for 32-bit float formats (e.g. YUV420PF32, RGBPF32, YF32).

Chroma placement unified

  • ConvertToXXXX, the resizers, Overlay, Layer, Subtitle and Text now use the same placement names and the same default
    order: explicit parameter, then _ChromaLocation, then the format default. Siting is calculated per axis and is
    valid for every subsampled format.
  • Resizers: fixed "dv" siting and the ignored 4:1:0 vertical siting.
  • Overlay: placement is the base clip's siting. The overlay clip and a colour mask keep their own siting and are
    re-sited when it differs (AviSynth#525). Layer's default is the base clip's _ChromaLocation.
  • Text/Subtitle (gdi=false) use a proper filtered top_left kernel; Subtitle (gdi=true) on YUY2 is now
    placement-aware.
  • CombinePlanes: _ChromaLocation follows the source of the U and V planes, YA is finished, and planes not listed now
    get defined values instead of undefined ones. Also fixed the malformed frame with a single clip and a different
    chroma subsampling target.
  • YA support in UToY8/VToY8, ExtractU/V, PlaneToY and YToUV.

Script language: numbers, formatting, input

  • Scientific notation for floating point constants: 1.5e-5, 2E+3, .5e1, 1e308. A number with an exponent
    is always a 64-bit double. Expr already accepted this form.
  • Format() prints floats in the shortest representation that reads back exactly (like Python's repr()). Before,
    6 fixed decimals made Format("{}", 1.0/65535) give 0.000015 and values below 5e-7 become 0. This matters when
    building Expr strings with Format.
  • Format() also takes number format specs: {:.2f}, {0:x}, {name:05d}, {x:.8f}.
  • String(x, format): the value is now passed by its conversion letter. %d %i %u %o %x %X work (64-bit exact),
    and invalid formats are script errors instead of garbage or crashes. %lf, %lld and the like are accepted.
  • New Hex64(int [, width]).
  • Floating point constants with many digits are parsed correctly rounded.
  • Locale independence: String, Format, Value, ConditionalReader floats and GeneralConvolution always use .
    as the decimal point, even when a host sets a decimal-comma locale (Qt/GTK on Linux). Fixed Value("3.5") giving 3
    under such locales.
  • propShow and GetFilterProps() print floats in the same shortest form.
  • New array functions: dictionary-style ArraySet, ArrayDel, ArrayIndexOf.
  • 64-bit double instead of 32-bit float results: AverageLuma & co., *Difference*, Spline, Frac,
    ConditionalReader Type float. So AverageLuma() == 2.6 now behaves.
  • Fixed comparison operators and ConditionalFilter for 32-bit floats and 64-bit integers.
  • Floor, Ceil, Round, Int, Long give a script error for out-of-range, NaN and infinity values. Round is
    now exact.
  • Fixed integer division of the smallest 64-bit integer by -1 (host freeze or crash) and for loops near INT64_MAX
    that never ended.
  • Fixed stack buffer overflows in Format/String with huge floats (1e60, 1e308).
  • Bit functions and 64-bit integer arithmetic use defined behaviour (no visible change). The script parser uses
    ASCII-only character tests, and a non-ASCII character outside strings and comments now gives a clear error.
  • Bitmap font cache is shared per environment: propShow, Text in ScriptClip and Histogram("audiolevels") are
    2-6x faster per frame. External BDF fonts support characters above U+FFFF, and invalid UTF-8 no longer reads past the
    string end.

C API revamp (interface version 14, plus 13.1)

  • New avisynth_c_loader.h: cross-platform dynamic loader (Windows, Linux, macOS, ...) that replaces the
    Windows-only loader inside avisynth_c.h. Functions missing in older AviSynth are NULL, each with the interface
    version it is usable from, and there are helpers to detect the interface version and feature steps for hosts and
    plugins.
  • Interface v14: function values (avs_val_is_function, avs_invoke3, avs_invoke3_try), avs_invoke_try /
    avs_invoke2 / avs_invoke2_try, avs_create_map / avs_free_map, avs_apply_message (UTF-8), avs_val_get_type,
    AVS_VALUE_TYPE_xxx constants and RGBP8/RGBAP8 aliases. C++: AVSValue::AsFunction exported.
  • Interface v13.1: user cache hints forwarded upstream by the core (CACHE_USER_FORWARD_BEGIN..END) for
    plugin-to-plugin communication (AviSynth#521).
  • avs_create_script_environment now reports a refused version request through avs_get_error instead of crashing on
    the next call.
  • Pre-V11 C plugins get correctly converted values (no raw double or int64) from avs_invoke, runtime calls and
    arrays.
  • Fixed several property functions: propGetXXX with a NULL error parameter terminated the process,
    avs_prop_get_clip crashed on use, and propGetClip/propGetFrame did not report errors.
  • Fixed C plugins running as MT_NICE_FILTER sharing error fields between threads (AviSynth#519), and a regression where V13
    plugins ran against older runtimes through null linkage entries (AviSynth#523).
  • Fixed the old avisynth_c.h dynamic loader: 8 deprecated entries were never loaded and held garbage, and a failed
    load leaked the DLL.
  • Removed from avisynth_c.h: the old avs_load_library, AVS26_FALLBACK_SIMULATION and
    EXTERNAL_AVS_C_API_LOADER.

Expr

  • Relative pixel loads x[dx,dy] have an AVX2 JIT version: about 2x faster on AVX2 CPUs (1080p, 8/16/32 bit). The
    SSE2 JIT no longer needs SSSE3.
  • Border modes as a suffix on relative loads: :c clamp (default), :m mirror (akarin.Expr compatible), :r
    mirror without repeating the edge pixel (OpenCV BORDER_REFLECT_101), :k constant filler (OpenCV BORDER_CONSTANT,
    filler from the stack, e.g. 0 x[1,0]:k), :w wrap around. Mirror and wrap are periodic, which matters on subsampled
    chroma planes.
  • Fixed JIT wrong results or crash with relative loads near row edges under register pressure.
  • % in the JIT now matches the C path (fmodf); tan in the JIT was up to ~8% off and is now accurate to ~3.5 ulp.
  • Fixed a crash with round/floor/ceil/trunc before relative loads or asin/acos/atan.
  • Fixed ternary with constant condition plus variable store/dup/swap (wrong result or crash).

ARM64 / NEON

  • Broad aarch64 NEON coverage, bit-identical to the C paths: horizontal and vertical resizers (8-16 bit and
    float), Blur/Sharpen, TemporalSoften, ConvertBits dither, Limiter, Layer, Overlay/Layer/Merge mask preparation, packed
    RGB conversions and Extract/PlaneToY, plane sum/SAD for the runtime functions (with UDOT when the CPU has dot
    product), and the Windows ARM64 text overlay.
  • Many C fallback paths are now vectorized by GCC and Clang on aarch64 and x64 (RGB conversions, Overlay modes, Layer,
    Compare, Tweak, Levels, ColorKeyMask, ShowXxx), with unchanged output. Compare RGB32 is 2.2x faster and ColorKeyMask
    planar 8-bit 2.3x.
  • Clang NEON builds use -ffp-contract=fast, like GCC, so float results agree between compilers.
  • Windows ARM64 builds are cross-compiled with llvm-mingw (see the new dev-build documentation page).

Other performance

  • SSE2/AVX2: TemporalSoften AVX2 (1.1-1.5x), AverageLuma/Chroma/R/G/B for 10-16 bit (1.3-1.9x, and no more C fallback
    for 8K frames), SSSE3 ExtractR/G/B from RGB24/48 (up to 3.3x).
  • Filter construction copies function arguments fewer times.
  • Overlay's internal 444 converters were removed in favour of ConvertToYUV444.

Behaviour changes

  • Blur/Sharpen: more precise integer kernel, identical in all paths (C, SSE2, SSSE3, SSE4.1, AVX2), max error 0.5.
    Output changes slightly for amounts other than +/-1.0. MMX paths were removed.
  • ConvertBits: when fulls is not given, the source range (_ColorRange) is detected per frame instead of once
    from frame 0 (AviSynth#516). Spliced clips with different range flags now work.
  • TemporalSoften 10-16 bit rounds half up in all paths (identical results, independent of the CPU rounding mode).
  • SetMaxCPU: the limit is per environment, which fixes script reloads in VirtualDub (AviSynth#440). Limits only switch
    features off, and the AVX-512 and ARM64 names are clarified.

Fixes

  • Overlay: crash with use444=false and 4:1:1/4:4:0/4:1:0 clips differing only in alpha (AviSynth#524); a fully opaque mask
    now gives the same result as no mask (AviSynth#512). Layer "mul" and PlanarRGB "add" fixes (AviSynth#510, AviSynth#514).
  • Compare: 16-bit squared-difference overflow (PSNR was nan for black vs. white), 64-bit accumulators for large
    frames (AviSynth#506), RGB24/48 denominator (AviSynth#507), and an uninitialised mask (AviSynth#508).
  • TemporalSoften: scenechange threshold uses the full frame width, and 64-bit SAD for frames above ~8.4 Mpixel.
  • RGBDifference on RGB32 SSE2: wrong right-edge pixel count.
  • NewVideoFrame: buffer size integer overflow for frames above 2 GiB, which could give an undersized buffer.
  • Mask on RGB32 narrower than 4 pixels wrote before the frame buffer (AviSynth#518); a crash at environment destruction with
    frame properties holding frames (AviSynth#520).
  • Blur/Sharpen 10-14 bit did not clamp to the bit depth maximum in the SIMD paths, and NaN was accepted as amount.
  • Histogram mode="color" overflow at 10-16 bit, Text/Subtitle halo colour on 4:4:4, TurnLeft/TurnRight alignment
    checks, and a VfW YUVA 4:4:0 plane order swap (AviSynth#525).
  • ConvertBits dither: large dither_bits gaps silently dropped the dithering (AviSynth#509); packed RGB48/64 dither with
    dither_bits 1-7 failed.
  • RGB->YUV conversion fixes (AviSynth#494, AviSynth#496, AviSynth#497, AviSynth#498), YV411 -> higher bit depth order (AviSynth#482), synthesized alpha left
    uninitialised (AviSynth#511), RGBAdjust uninitialised parameter and LUT leak (AviSynth#499).
  • Expr: wrong source plane in mixed colourspace expressions, and x[dx,dy] ignoring the current row in the C path
    (AviSynth#505).
  • Property functions: propGetAll string arrays, propGetAsArray on frame properties, and PlaneMinMaxStats
    thresholded min/max on float clips.
  • Static-analysis findings (leaks and buffer overruns, tagged AVSP001-AVSP018).

Don't miss a new AviSynthPlus release

NewReleases is sending notifications on new releases.