void LibJpegCompressor::ensureReadyForWriteScanline()

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);
}