Automated release: version and notes generated from pull requests merged since 3.8.8.
Fixed
- An encoder or a filter this ffmpeg build lacks is refused before ffmpeg runs, dry runs
included (#402). On a build without libx265 an HDR source failed in every re-encoding tool, as
did--codec hevc,export.py --preset youtube-hdrandcut.pyon an SDR HEVC source, after
the dry run had said completed; the same foroverlay.py --textwithout drawtext and
color.py --to-sdrorlook.pyon an HDR source without zscale.run()now reads the encoders
(-c:v/-c:a/-c:safter the last input, each for a stream kind the output keeps: not one
-an/-vn/-sndrops or no input file carries, socut.py --accurateon a video-only source
needs no AAC) and the filter names (-vf,-af,-filter:v,-filter:a,-filter_complex,
-lavfi) of each command it is given and refuses one the build's own list lacks, with
thekind: ffmpeg,reason(encoder_missing,filter_missing),details.nameand hint the
failed run carried (under--dry-runthe list is ffprobe's, as for--codec av1). A missing
zscale is refused, not worked around:look.pyhas no other tone map, soreport.pystill has
no contact sheet for an HDR source on such a build (it says why). Not read: a VideoToolbox encoder (left to--hw), a lavfi input, an
explicit-mapselection, a measurement pass (run_analysis():loudness.py's loudnorm
measurement, for one, fails in ffmpeg as before), and anything when the list could not be read.
stabilize.pychecks vidstabdetect and vidstabtransform itself, since its pass 1 is a
measurement.cut.py's re-encode failure,stabilize.py's pass 1,loudness.py's measurement
and the shared silence, content, dropout and decode passes keep their own message and now carry
thereason,detailsandhintof the cause ffmpeg named;waveform.pypasses on the
reasonanddetailsof thegraphics.pyorcaption.pystage that failed. Arabic or Hebrew
overlay.py --text(andgraphics.py --text-render drawtext) on a build without fribidi is
refused as "on this ffmpeg build", not "on any ffmpeg build".contract --jsondeclares what
was missing from it: libx265 forloop.pyon an HDR source and forexport.py --preset youtube-hdr, an AV1 encoder foryoutube-av1, drawtext and subtitles forwaveform.py --title
/--srt, and theassfilter forgraphics.py's libass route. - A result no longer states what was not measured (#403).
cropdetect.pyreported a crop of
1920x1072 on a bar-free 1080p source, because the filter rounded to--round 16before the
no-bars comparison: it measures unrounded and rounds a detected crop itself as the filter would
(--round 1as 16, an odd value doubled), and a picture that reaches every edge is reported as
the frame.probe.py --analyzeon a PQ or HLG stream said
"normal display-referred SDR" (or "tagged as SDR: probably a Log profile"):looks_like_logis
nullthere with anot_measuredreason. Under--dry-run,probe(role="output")read a file
an earlier run had left at the output path, socut.pyreported that file's length as
output_duration(0.0 with no file): it isnull, as the contract says.render.pysaid "the
check failed" whencheck.pycould not run; it says the check could not run and why, and the
plan path'scheckstep carriesreason: not_measured.sync.py --fix-driftwithout
--replace-audioor--trim-secondno longer says the second file "will be resampled". The
decodeverification step andexport.py'skey_fill_pairstep carried aprovenance
(measurement,output_measurement) the contract does not list; neither compares with an
expected value, so neither carries one now. Not changed:cut.py --dry-runstill plans
mode: copyfor a copy that the real run re-encodes when it lands past--tolerance. - An emoji diagnostic says what the route draws (#403).
graphics.py --emoji autoon a build
whose libass draws colour reportedmode: colorfrom the drawtext route, which draws an empty
box: the text goes through libass, and with--text-render drawtextthe emoji are left out and
anemoji_not_drawnwarning says so (as it now does when auto finds nothing that draws them;
emoji.countis counted before they are removed).--emoji monoon such a build is drawn in
colour through libass and now reportsmode: colorwith anemoji_mono_drawn_in_colourwarning, where it
warned of "no colour path" (graphics.py --text-render drawtextleaves them out, as above:mode: none,emoji_not_drawn).caption.py's note no longer cites--emoji nonewhen auto chose
it,emoji_assets_missingsays whether libass draws a glyph for the clusters without a PNG, and
overlay.py's warning says drawtext has one font and no fallback. - A file in another format is refused by name (#404).
caption.py --text(andrender.py --cues) burned a WebVTT file withmm:sstimes or cue settings, an ASS file or a JSON document
in line by line; each is refused, naming the format and the flag that reads it (--srtfor
WebVTT,--assfor ASS/SSA). The JSON refused is an object, or a non-empty array whose first
element is an object or an array; an array of plain values (["hello"]) is still read as cue
text, and so is a first line in brackets that is not JSON ([Music]). A WebVTT file's inline word
timestamps and<c>/<v>/<lang>spans were burned as text when caption.py builds the ASS
itself (--animate, for one); they are dropped, in a file that startsWEBVTT.
metadata.py --chapterskept the-of0:00 - Introin the title, and failed on an SRT or
WebVTT file without naming it.join.py --listtook a concat directive (inpoint 1, or the
argument-freestream) for a path; it is refused unless the line names a file that is there,
and theffconcat versionheader is skipped.color.py --lutwith a.cubethat has
noLUT_3D_SIZEline or fewer than size^3 rows failed inside ffmpeg with a hint about an
unreadable video.cut.py --snap-sourcewith a file that is neither ascenes.pydocument nor
decodable audio said "no reliable beat grid".overlay.py --imageandwaveform.py --image
given a video or a GIF failed as "Option loop not found" (andwaveform.py --dry-runcompleted);
each is refused by name, the GIF with the way to make a PNG of it.silence.py --wordsdid
not read the whisper.cpp--output-json-fulldocument its own refusal asks for (it reads its
words, andresult.languagefor--filler-lang auto, as--transcribedoes), and now warns
(words_outside_input) when word timings start at or after the end of the input. Noto Emoji's file
names (emoji_u1f600.png, a keycap'semoji_u0031_20e3.png) are found in--emoji-assets. - fix: refuse a component the build lacks before FFmpeg runs; say what was not measured; name a file in the wrong format (#402, #403, #404) (#509)
What's Changed
- fix: refuse a component the build lacks before FFmpeg runs; say what was not measured; name a file in the wrong format (#402, #403, #404) by @kajisho5 in #509
Full Changelog: v3.8.8...v3.8.9