github kajisho5/ffmpeg-skill v3.8.9

latest release: v3.8.10
one hour ago

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-hdr and cut.py on an SDR HEVC source, after
    the dry run had said completed; the same for overlay.py --text without drawtext and
    color.py --to-sdr or look.py on an HDR source without zscale. run() now reads the encoders
    (-c:v/-c:a/-c:s after the last input, each for a stream kind the output keeps: not one
    -an/-vn/-sn drops or no input file carries, so cut.py --accurate on 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
    the kind: ffmpeg, reason (encoder_missing, filter_missing), details.name and hint the
    failed run carried (under --dry-run the list is ffprobe's, as for --codec av1). A missing
    zscale is refused, not worked around: look.py has no other tone map, so report.py still 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 -map selection, 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.py checks 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
    the reason, details and hint of the cause ffmpeg named; waveform.py passes on the
    reason and details of the graphics.py or caption.py stage that failed. Arabic or Hebrew
    overlay.py --text (and graphics.py --text-render drawtext) on a build without fribidi is
    refused as "on this ffmpeg build", not "on any ffmpeg build". contract --json declares what
    was missing from it: libx265 for loop.py on an HDR source and for export.py --preset youtube-hdr, an AV1 encoder for youtube-av1, drawtext and subtitles for waveform.py --title
    / --srt, and the ass filter for graphics.py's libass route.
  • A result no longer states what was not measured (#403). cropdetect.py reported a crop of
    1920x1072 on a bar-free 1080p source, because the filter rounded to --round 16 before the
    no-bars comparison: it measures unrounded and rounds a detected crop itself as the filter would
    (--round 1 as 16, an odd value doubled), and a picture that reaches every edge is reported as
    the frame. probe.py --analyze on a PQ or HLG stream said
    "normal display-referred SDR" (or "tagged as SDR: probably a Log profile"): looks_like_log is
    null there with a not_measured reason. Under --dry-run, probe(role="output") read a file
    an earlier run had left at the output path, so cut.py reported that file's length as
    output_duration (0.0 with no file): it is null, as the contract says. render.py said "the
    check failed" when check.py could not run; it says the check could not run and why, and the
    plan path's check step carries reason: not_measured. sync.py --fix-drift without
    --replace-audio or --trim-second no longer says the second file "will be resampled". The
    decode verification step and export.py's key_fill_pair step carried a provenance
    (measurement, output_measurement) the contract does not list; neither compares with an
    expected value, so neither carries one now. Not changed: cut.py --dry-run still plans
    mode: copy for 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 auto on a build
    whose libass draws colour reported mode: color from the drawtext route, which draws an empty
    box: the text goes through libass, and with --text-render drawtext the emoji are left out and
    an emoji_not_drawn warning says so (as it now does when auto finds nothing that draws them;
    emoji.count is counted before they are removed). --emoji mono on such a build is drawn in
    colour through libass and now reports mode: color with an emoji_mono_drawn_in_colour warning, where it
    warned of "no colour path" (graphics.py --text-render drawtext leaves them out, as above: mode: none, emoji_not_drawn). caption.py's note no longer cites --emoji none when auto chose
    it, emoji_assets_missing says 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 (and render.py --cues) burned a WebVTT file with mm:ss times 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 (--srt for
    WebVTT, --ass for 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 starts WEBVTT.
    metadata.py --chapters kept the - of 0:00 - Intro in the title, and failed on an SRT or
    WebVTT file without naming it. join.py --list took a concat directive (inpoint 1, or the
    argument-free stream) for a path; it is refused unless the line names a file that is there,
    and the ffconcat version header is skipped. color.py --lut with a .cube that has
    no LUT_3D_SIZE line or fewer than size^3 rows failed inside ffmpeg with a hint about an
    unreadable video. cut.py --snap-source with a file that is neither a scenes.py document nor
    decodable audio said "no reliable beat grid". overlay.py --image and waveform.py --image
    given a video or a GIF failed as "Option loop not found" (and waveform.py --dry-run completed);
    each is refused by name, the GIF with the way to make a PNG of it. silence.py --words did
    not read the whisper.cpp --output-json-full document its own refusal asks for (it reads its
    words, and result.language for --filler-lang auto, as --transcribe does), 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's emoji_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

Don't miss a new ffmpeg-skill release

NewReleases is sending notifications on new releases.