github I-IAL9000/shrinkerr v0.3.32

latest releases: v0.9.98, v0.9.97, v0.9.96...
3 months ago

VMAF measurement reliability + activity log readability.

Fixed

  • VMAF "bimodal desync" measurement bug. libvmaf occasionally desynced its frame-pair iteration partway through the 30-second analysis window — half the frames scored ~100, half scored ~0, the recorded mean landed somewhere in between (e.g. 39.5 or 61.6) and a visually-fine encode was reported as "Poor". Diagnosis: see min=0.0 max=100.0 in the converter log. Fix: detect the bimodal signature (min < 20 ∧ max ≥ 90) and re-run VMAF at an alternate seek (66% / 33% of duration, ≥60s away from the primary). Take the higher of the two scores. If every pass came back bimodal, persist the score but flag the new jobs.vmaf_uncertain column so the UI can surface a ⚠ glyph next to the score and a tooltip explaining "measurement-suspect — encode is almost certainly visually fine."
  • eac3 (Dolby Digital Plus) decoder warnings (expacc N is out-of-range, error decoding the audio block) added to the health-check benign allow-list. These trip on streaming-service rips (HBO Max / Apple TV+ / etc.) but the audio plays fine in any real player. Files that previously got flagged "Corrupt (quick)" purely on these messages are now classified "warnings" and stay healthy for queue/auto-ignore.

Added

  • Re-measure suspect VMAF scores button in Settings → Encoding → VMAF. Iterates completed jobs whose recorded score landed below the "Excellent" tier or got flagged uncertain, and re-runs VMAF (with the same bimodal-aware retry path used for fresh encodes). Skips jobs whose original pre-rename source no longer exists on disk (typical when "delete original after conversion" is on). Live progress streams over the WebSocket; existing 30+ bad scores can be cleaned up without re-encoding anything.
  • Activity log + History tab now colour-code outcomes rather than always-green:
    • Health check: corrupt → red, warnings → amber, healthy → green.
    • VMAF: <score> → green / amber / red based on the canonical 3-tier table; uncertain measurements get amber regardless of the underlying score.
  • Canonical 3-tier VMAF table everywhere (FilterBar, JobListItem, EstimateModal, FileDetail, DashboardPage donut, EventTimeline, SettingsPage threshold). Excellent (93+) → green, Good (87–93) → amber, Poor (<87) → red. Backend mirrors the same cuts in backend/queue.py, backend/test_encode.py, backend/routes/stats.py. The previous "Fair" tier (80–87) was inconsistent across components — folded into Poor. frontend/src/utils/vmaf.ts is the new single source of truth.

Changed

  • convert_file's VMAF block extracted into _run_libvmaf_pass() and remeasure_vmaf() helpers in backend/converter.py. Cuts ~150 lines of inline ffmpeg-spawning duplication and lets the remeasure endpoint share the exact same filter pipeline + bimodal-detection logic as fresh encodes.
  • Cross-check (SSIM/PSNR) now runs against the same window that produced the chosen VMAF score, not always the primary seek — so a rescued retry-window score is sanity-checked at its window, not the bimodal one.

Docker images

Pinned to this release:

docker pull ghcr.io/i-ial9000/shrinkerr:0.3.32         # portable (amd64 + arm64, CPU)
docker pull ghcr.io/i-ial9000/shrinkerr:0.3.32-nvenc   # x86_64 + NVIDIA GPU (NVENC)
docker pull ghcr.io/i-ial9000/shrinkerr:0.3.32-edge    # as above but ffmpeg master
docker pull ghcr.io/i-ial9000/shrinkerr:0.3.32-edge-nvenc

Floating tags (:latest, :edge, :nvenc, :edge-nvenc) track the most recent release of each lineage.

Don't miss a new shrinkerr release

NewReleases is sending notifications on new releases.