Automated release: version and notes generated from pull requests merged since 3.8.5.
Fixed
- A number outside a flag's range is refused before ffmpeg runs (
kind: input, naming the
flag and the value; audit A21, A52, A72, A109, A124, A165, A176, A185, A190). Each of these
completed with something other than what was asked, failed inside ffmpeg askind: ffmpeg, or
was a traceback:caption.py --gapbelow 0 (overlapping cues);sequence.pyandfit.py --width/--heightof 0 or less (0 was read as "not given");fit.py --aspectwith a negative
side (0:9stays "no aspect", as decided; the same rule reaches arender.pyproject's
frame.aspect);color.py --peakof 0 or less and--desatbelow 0;graphics.py --from
below 0 (--from -1divided by zero) and--scaleof 0 or less;look.py --tileswith a side
below 1 (0x2divided by zero) and--widthbelow 2;loudness.py -I/--tp/--lraoutside
loudnorm's -70..-5 / -9..0 / 1..50 (the ranges--versionsalready checked) and
--sample-rateof 0 or less;silence.py --min-silenceandmetadata.py --silence-minbelow
0;overlay.py --font-sizebelow 1 (-10drew nothing and reportedverified: true),
--scalebelow 1,--scale-percentof 0 or less,--fadeand--borderbelow 0;sync.py --max-offsetand--analyze-secondsof 0 or less (--max-offset -1reported an offset it
never searched for);verify.py --secondsof 0 or less (every step failed and the tools were
blamed);audio.py --fade-in/--fade-out/--music-fade-outbelow 0;scenes.py --highlights
below 0 and, with--highlights,--target/--max-sceneof 0 or less.join.py --duration
below 0 (A52, A185) was already refused. Other numeric flags were not swept here and keep
their behaviour (docs/design-decisions.md lists the ones looked at and left). --timeoutbelow 0 or above 500000 s is refused (A188, A8). A negative value was read as 0
without a word, which removed every limit; a value whose outer ceiling (4x plus 60 s) did not
fit the millisecond wait ofpoll()(1e8,1e300) raised OverflowError after the child had
started, so an MCP call reported a failure while the tool ran on and wrote its output.
FFMPEG_SKILL_TIMEOUTabove 500000 is read as 0 (no limit) with thetimeout_env_invalid
warning, as a negative one already was. Measured on Linux only.cropdetect.py --limit 1is the top of its range (A164). FFmpeg reads a limit of 1 or more
as a pixel code, so the documented top of 0..1 was read as code 1, the opposite end from 0.999;
it is now written as the top code of the source's bit depth (255 for 8-bit; the 10-bit value
is computed the same way and was not run).- A flag the chosen mode does not read is refused instead of ignored (A50, A74, A85, A141,
A144, A145, A171):caption.py --asswith--animateor--karaoke;audio.py
--music-volume,--music-fade-outor--music-loopwithout--music,--effects-volume
without--effects,--denoise-strengthwithout--denoise(arender.pyproject's
audioblock with these and nomusicis refused by its audio stage, not before the first
stage);waveform.py --style spectrumwith--coloror--waveform-mode;scenes.py --edl,
--targetor--max-scenewithout--highlights;cut.py --segmentswith--start,--end
or--duration;overlay.py --videowith--fade(and arender.pyvideo layer'sfade, in a run that
reaches the overlays: not a timeline export, not one stopped before them);
arender.pytemplate pack with--stop-after,--cache,--from,--work,--keepor
--export-timeline(--audit-logis now handed to each destination). A flag recognised by
comparing it with its default (--music-volume,--music-fade-out,--effects-volume,
--denoise-strength,--max-scene,--color,--waveform-mode) is not refused when the
default value itself is passed. audio.py --voicewith--denoisedenoises at--denoise-strength(A136).--voice light --denoisedropped the denoise, and the strength was not read under any--voice;--voice medium --denoiseat the default strength writes the chain it wrote before.caption.py --mode mux --offsetshifts every--srttrack, not only the first (A61); an
offset that would leave any track with no cue is refused before a file is written (the first
track's empty copy used to fail inside ffmpeg and stay behind).--max-linesand
--min-durationstill lay out the first track only; a note now says so when they changed it.
--textcues that--offsetmoves before 0, all of them, are refused the same way (an empty
SRT, or an IndexError when the video's frame rate was known), and a dry run plans a track an
earlier step has yet to write under its shifted copy's name.- A project or recipe value no stage reads as written is refused before the first stage (A89,
A92, A93, A94, A104): a clip's ownsnap.toother thanbeats/noneon a clip the render
cuts (it rendered unsnapped);chaptersthat is neither a file path nor a list (falseand0stay "no chapters"); anaudiogram
with more than one clip in a render (not in--export-timeline; only the first clip was
rendered);render.py --template audiogramwithout--image, unless--write-project(the
dry run completed and the real run failed at the export); an unknown key in abatch.py
recipe (a misspelledoutput_dir,suffixorglobran with the default; the refusal names
the nearest valid key when one is close, else lists them). - fix: a flag value the tool cannot honour is refused before FFmpeg runs (26 audit items) (#504)
What's Changed
- fix: a flag value the tool cannot honour is refused before FFmpeg runs (26 audit items) by @kajisho5 in #504
Full Changelog: v3.8.5...v3.8.6