| This feature is specific to AviSynth plus.|
It is not supported in other AviSynth versions.
Autoscale is the term being used to describe filter and function arguments that adjust themselves to the current bit depth – the BitsPerComponent of the main source clip. A related concept is 'd' notation: 16d-235d refers to normal TV-range levels at any bit depth.
bit depth equivalent color values 8 0 16 128 235 255 10 0 64 512 940 1020 12 0 256 2048 3670 4080 14 0 1024 8192 15040 16320 16 0 4096 32768 60160 65280 32 0.0 16/256 128/256 235/256 255/256
To see a filter with non-autoscaling arguments, consider Levels:
All the arguments in blue expect user inputs in the normal 0-255 range – assuming 8-bit video. For 10-bit, the input range is 0-1023, and for 16-bit, it's 0-65535. Scripts that specify 8-bit Levels arguments need to be altered for use with other bit depths. For those used to "thinking in 8-bit," writing scripts for multiple bit depths can be cumbersome.
That's not to say Levels is wrong or buggy – what it does makes sense: it is the humans that need to adjust. There are utility functions to help with this, which will be discussed below.
Another example is RGBAdjust with its bias arguments: rb=16 always lifts the Red channel by 16 units, whether on the 0-255 or the 0-65535 scale. It does what you say, not necessarily what you mean.
To see a filter with autoscaling arguments, consider ColorYUV:
The off_x arguments (in blue) add or subtract a given amount from all pixels in the given color channel, and the amount is always on the 0-255 scale – that is, off_y=255 will always turn black to white, at any bit depth.
In 8-bit video, setting off_y=16 will raise all luminance values by 16 units on the 0-255 scale – but in 10-bit video, off_y=16 will raise all luminance values by 64 units on the 0-1023 scale.
The argument value has been adjusted by the filter to give the same visual effect. That's autoscaling.
User-Defined Autoscaling functions
For filters and function that don't autoscale, there are some helper functions you can call upon, which are included in raffriff42's Utils-r41.avsi script. These three are the ones most important for autoscaling:
- sc8f(clip T, float f, [bool cx])
- Scale an 8-bit value for target clip T
- sc8x(clip T, float f)
- Scale an 8-bit value for target clip T; clamp output
- sc8s(clip T, float f, [int decimals])
- Scale an 8-bit value for target clip T; string result
You can use them to make Levels autoscale, so that the old 8-bit arguments give the same visual result in any bit depth:
LevelsPlus is included in the script previously mentioned.
You don't have to write wrapper scripts like the one above; you can insert them only where needed:
These statements will have the same visual effect at all bit depths.