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) andConvertToYA.- 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:
placementis 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_leftkernel; Subtitle (gdi=true) on YUY2 is now
placement-aware. - CombinePlanes:
_ChromaLocationfollows 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 madeFormat("{}", 1.0/65535)give0.000015and values below 5e-7 become0. 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 %Xwork (64-bit exact),
and invalid formats are script errors instead of garbage or crashes.%lf,%lldand 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). FixedValue("3.5")giving 3
under such locales. propShowandGetFilterProps()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,
ConditionalReaderType float. SoAverageLuma() == 2.6now behaves. - Fixed comparison operators and ConditionalFilter for 32-bit floats and 64-bit integers.
Floor,Ceil,Round,Int,Longgive a script error for out-of-range, NaN and infinity values.Roundis
now exact.- Fixed integer division of the smallest 64-bit integer by -1 (host freeze or crash) and
forloops near INT64_MAX
that never ended. - Fixed stack buffer overflows in
Format/Stringwith 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,Textin ScriptClip andHistogram("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 insideavisynth_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_xxxconstants and RGBP8/RGBAP8 aliases. C++:AVSValue::AsFunctionexported. - 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_environmentnow reports a refused version request throughavs_get_errorinstead 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:
propGetXXXwith a NULL error parameter terminated the process,
avs_prop_get_clipcrashed on use, andpropGetClip/propGetFramedid not report errors. - Fixed C plugins running as
MT_NICE_FILTERsharing 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.hdynamic loader: 8 deprecated entries were never loaded and held garbage, and a failed
load leaked the DLL. - Removed from
avisynth_c.h: the oldavs_load_library,AVS26_FALLBACK_SIMULATIONand
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:
:cclamp (default),:mmirror (akarin.Expr compatible),:r
mirror without repeating the edge pixel (OpenCV BORDER_REFLECT_101),:kconstant filler (OpenCV BORDER_CONSTANT,
filler from the stack, e.g.0 x[1,0]:k),:wwrap 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);tanin the JIT was up to ~8% off and is now accurate to ~3.5 ulp.- Fixed a crash with
round/floor/ceil/truncbefore relative loads orasin/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
fullsis 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=falseand 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
nanfor 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_bitsgaps silently dropped the dithering (AviSynth#509); packed RGB48/64 dither with
dither_bits1-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:
propGetAllstring arrays,propGetAsArrayon frame properties, andPlaneMinMaxStats
thresholded min/max on float clips. - Static-analysis findings (leaks and buffer overruns, tagged AVSP001-AVSP018).