From adbaeaab9065a2b7b1aaa239179fa7076e47839d Mon Sep 17 00:00:00 2001 From: Jonathan Brown Date: Tue, 3 Jun 2025 15:48:59 +0100 Subject: [PATCH 1/3] Add bool --- lib/extras/enc/jpegli.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/extras/enc/jpegli.cc b/lib/extras/enc/jpegli.cc index 14a7a398..630d6f9e 100644 --- a/lib/extras/enc/jpegli.cc +++ b/lib/extras/enc/jpegli.cc @@ -34,6 +34,7 @@ #include "lib/extras/xyb_transform.h" #include "lib/jpegli/common.h" #include "lib/jpegli/encode.h" +#include "lib/jpegli/encode_internal.h" #include "lib/jpegli/types.h" namespace jxl { @@ -435,6 +436,7 @@ Status EncodeJpeg(const PackedPixelFile& ppf, const JpegSettings& jpeg_settings, jpegli_set_cicp_transfer_function(&cinfo, cicp_tf); jpegli_set_defaults(&cinfo); if (!jpeg_settings.chroma_subsampling.empty()) { + cinfo.master->chroma_subsampling_set_by_cli = true; if (jpeg_settings.chroma_subsampling == "444") { cinfo.comp_info[0].h_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1; From c8ecec633485e84d484c3c86fb2a317432f01138 Mon Sep 17 00:00:00 2001 From: Jonathan Brown Date: Tue, 3 Jun 2025 15:54:13 +0100 Subject: [PATCH 2/3] Set parameters based on distance --- lib/jpegli/encode.cc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/jpegli/encode.cc b/lib/jpegli/encode.cc index ac4917d2..5d261553 100644 --- a/lib/jpegli/encode.cc +++ b/lib/jpegli/encode.cc @@ -837,6 +837,22 @@ void jpegli_set_distance(j_compress_ptr cinfo, float distance, boolean force_baseline) { CheckState(cinfo, jpegli::kEncStart); cinfo->master->force_baseline = FROM_JXL_BOOL(force_baseline); + if (distance >= 1.9f && !(cinfo->master->xyb_mode) && + !cinfo->master->chroma_subsampling_set_by_cli) { + // At medium qualities, 420 subsampling begins to outperform 444. + cinfo->comp_info[0].h_samp_factor = cinfo->comp_info[0].v_samp_factor = 2; + if (cinfo->jpeg_color_space == JCS_YCCK) { + cinfo->comp_info[3].h_samp_factor = cinfo->comp_info[3].v_samp_factor = 2; + } + } + // Disable adaptive quantization at high qualities. + if (distance <= 1.0f && !(cinfo->master->xyb_mode)) { + cinfo->master->use_adaptive_quantization = false; + } + // At quality 100 (distance 0) auto select RGB colorspace. + if (distance <= 0.01f && cinfo->in_color_space == JCS_RGB) { + jpegli_set_colorspace(cinfo, JCS_RGB); + } float distances[NUM_QUANT_TBLS] = {distance, distance, distance}; jpegli::SetQuantMatrices(cinfo, distances, /*add_two_chroma_tables=*/true); } @@ -862,6 +878,22 @@ void jpegli_set_quality(j_compress_ptr cinfo, int quality, CheckState(cinfo, jpegli::kEncStart); cinfo->master->force_baseline = FROM_JXL_BOOL(force_baseline); float distance = jpegli_quality_to_distance(quality); + if (distance >= 1.9f && !(cinfo->master->xyb_mode) && + !cinfo->master->chroma_subsampling_set_by_cli) { + // At medium qualities, 420 subsampling begins to outperform 444. + cinfo->comp_info[0].h_samp_factor = cinfo->comp_info[0].v_samp_factor = 2; + if (cinfo->jpeg_color_space == JCS_YCCK) { + cinfo->comp_info[3].h_samp_factor = cinfo->comp_info[3].v_samp_factor = 2; + } + } + // Disable adaptive quantization at high qualities. + if (distance <= 1.0f && !(cinfo->master->xyb_mode)) { + cinfo->master->use_adaptive_quantization = false; + } + // At quality 100 (distance 0) auto select RGB colorspace. + if (distance <= 0.01f && cinfo->in_color_space == JCS_RGB) { + jpegli_set_colorspace(cinfo, JCS_RGB); + } float distances[NUM_QUANT_TBLS] = {distance, distance, distance}; jpegli::SetQuantMatrices(cinfo, distances, /*add_two_chroma_tables=*/false); } From 491a12b4de7f4d19db969ecf35631d53f1bf625e Mon Sep 17 00:00:00 2001 From: Jonathan Brown Date: Tue, 3 Jun 2025 15:55:04 +0100 Subject: [PATCH 3/3] Add bool --- lib/jpegli/encode_internal.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jpegli/encode_internal.h b/lib/jpegli/encode_internal.h index 3f5d1a76..b0236a6a 100644 --- a/lib/jpegli/encode_internal.h +++ b/lib/jpegli/encode_internal.h @@ -75,6 +75,7 @@ struct jpeg_comp_master { uint8_t cicp_transfer_function; bool use_std_tables; bool use_adaptive_quantization; + bool chroma_subsampling_set_by_cli = false; int progressive_level; size_t xsize_blocks; size_t ysize_blocks;