in cpp/spectrum/plugins/jpeg/LibJpegCompressor.cpp [105:165]
void LibJpegCompressor::ensureReadyForWriteScanline() {
if (libJpegCompressInfo.global_state < CSTATE_SCANNING) {
jpeg_c_set_bool_param(
&libJpegCompressInfo,
JBOOLEAN_TRELLIS_QUANT,
_options.configuration.jpeg.useTrellis());
jpeg_c_set_bool_param(
&libJpegCompressInfo,
JBOOLEAN_OPTIMIZE_SCANS,
_options.configuration.jpeg.useOptimizeScan());
if (_options.configuration.jpeg.useCompatibleDcScanOpt()) {
jpeg_c_set_int_param(&libJpegCompressInfo, JINT_DC_SCAN_OPT_MODE, 0);
}
if (_options.imageSpecification.chromaSamplingMode ==
image::ChromaSamplingMode::S444) {
// Add support for 422?
for (int i = 0; i < MAX_COMPONENTS; i++) {
// 4:4:4 sampling translates into H/V sample factors of 1
libJpegCompressInfo.comp_info[i].h_samp_factor = 1;
libJpegCompressInfo.comp_info[i].v_samp_factor = 1;
}
}
if (_options.configuration.jpeg.usePsnrQuantTable()) {
// similar to cjpeg.c
jpeg_c_set_int_param(&libJpegCompressInfo, JINT_BASE_QUANT_TBL_IDX, 1);
jpeg_c_set_float_param(
&libJpegCompressInfo, JFLOAT_LAMBDA_LOG_SCALE1, 9.0);
jpeg_c_set_float_param(
&libJpegCompressInfo, JFLOAT_LAMBDA_LOG_SCALE2, 0.0);
jpeg_c_set_bool_param(
&libJpegCompressInfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, FALSE);
}
jpeg_set_quality(&libJpegCompressInfo, quality, false /* force_baseline */);
if (_options.configuration.jpeg.useProgressive()) {
// re-setup DC and AC scan layout
jpeg_simple_progression(&libJpegCompressInfo);
} else {
libJpegCompressInfo.num_scans = 0;
libJpegCompressInfo.scan_info = NULL;
}
jpeg_start_compress(&libJpegCompressInfo, true);
SPECTRUM_ERROR_CSTR_IF_NOT(
libJpegCompressInfo.global_state >= CSTATE_SCANNING,
codecs::error::CompressorFailure,
"jpeg_start_compress_failed");
if (_options.configuration.general.interpretMetadata() &&
!_options.imageSpecification.metadata.empty()) {
writeMetadata(libJpegCompressInfo, _options.imageSpecification.metadata);
}
}
SPECTRUM_ENFORCE_IF_NOT(!writtenLastScanline);
}