From ac76bee5a3da3c1387e34ebeeda22980e16c6369 Mon Sep 17 00:00:00 2001 From: Hampus Date: Mon, 24 Aug 2026 12:27:46 +0200 Subject: [PATCH] fix(media-proxy): clamp the webp effort override to the encoder maximum (#1834) --- fluxer_media_proxy/src/media_process.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/fluxer_media_proxy/src/media_process.rs b/fluxer_media_proxy/src/media_process.rs index bec4f39f0..c4827ca2c 100644 --- a/fluxer_media_proxy/src/media_process.rs +++ b/fluxer_media_proxy/src/media_process.rs @@ -14,6 +14,7 @@ use thiserror::Error; const ANIMATED_ENCODE_FLUSH_HEADROOM_MS: i64 = 3_000; const PNG_SIGNATURE: &[u8; 8] = b"\x89PNG\r\n\x1a\n"; const APNG_FRAME_PNG_SUFFIX: &str = ".png[strip,compression=9,filter=all]"; +const VIPS_WEBP_MAX_EFFORT: u8 = 6; static PNG_CRC_TABLE: OnceLock<[u32; 256]> = OnceLock::new(); #[derive(Clone, Debug)] @@ -188,7 +189,7 @@ fn output_suffix( "false" }; let effort = effort_override - .map(|v| v.min(9)) + .map(|v| v.min(VIPS_WEBP_MAX_EFFORT)) .unwrap_or_else(|| effort_for(quality, animated)); let suffix = match format { AssetExtension::Jpeg => format!(".jpg[Q={q},strip,interlace=true,optimize_coding=true]"), @@ -2242,6 +2243,22 @@ mod tests { delays } + #[test] + fn webp_effort_override_is_clamped_to_the_encoder_maximum() { + for requested in [7u8, 8, 9, 200] { + let suffix = + output_suffix(AssetExtension::Webp, "high", None, Some(requested)).unwrap(); + let suffix = suffix.to_str().unwrap().to_owned(); + assert!( + suffix.contains("effort=6"), + "effort={requested} produced {suffix}, but libvips webpsave rejects effort above 6 \ + and silently falls back to its own default" + ); + } + let suffix = output_suffix(AssetExtension::Webp, "high", None, Some(5)).unwrap(); + assert!(suffix.to_str().unwrap().contains("effort=5")); + } + #[test] fn animated_webp_default_effort_matches_fast_tier() { assert_eq!(2, effort_for("low", true));