diff --git a/src/video_compress/cmpto_j2k.cpp b/src/video_compress/cmpto_j2k.cpp index 037ac34dba..9aae9bacf9 100644 --- a/src/video_compress/cmpto_j2k.cpp +++ b/src/video_compress/cmpto_j2k.cpp @@ -442,14 +442,19 @@ static bool configure_with(struct state_video_compress_j2k *s, struct video_desc CHECK_OK(cmpto_j2k_enc_cfg_create(s->context, &s->enc_settings), "Creating context configuration:", return false); - CHECK_OK(cmpto_j2k_enc_cfg_set_quantization( + + if (s->lossless) { + MSG(INFO, "Lossless compression selected. Ignoring quality parameter.\n"); + CHECK_OK(cmpto_j2k_enc_cfg_set_lossless( + s->enc_settings, s->lossless), + "Setting lossless mode", NOOP); + } else { + CHECK_OK(cmpto_j2k_enc_cfg_set_quantization( s->enc_settings, s->quality /* 0.0 = poor quality, 1.0 = full quality */ ), "Setting quantization", NOOP); - CHECK_OK(cmpto_j2k_enc_cfg_set_lossless( - s->enc_settings, s->lossless), - "Setting lossless mode", NOOP); + } CHECK_OK(cmpto_j2k_enc_cfg_set_resolutions(s->enc_settings, 6), "Setting DWT levels", NOOP); @@ -772,10 +777,12 @@ static struct module * j2k_compress_init(struct module *parent, const char *c_cf } } - if (s->quality < 0.0 || s->quality > 1.0) { - LOG(LOG_LEVEL_ERROR) << "[J2K] Quality should be in interval [0-1]!\n"; - j2k_compress_done((struct module *) s); - return nullptr; + if (!s->lossless) { + if (s->quality < 0.0 || s->quality > 1.0) { + LOG(LOG_LEVEL_ERROR) << "[J2K] Quality should be in interval [0-1]!\n"; + j2k_compress_done((struct module *) s); + return nullptr; + } } s->tech = get_supported_technology(req_technology); diff --git a/src/video_decompress/cmpto_j2k.cpp b/src/video_decompress/cmpto_j2k.cpp index b9580033c0..5a2001e3fe 100644 --- a/src/video_decompress/cmpto_j2k.cpp +++ b/src/video_decompress/cmpto_j2k.cpp @@ -632,6 +632,22 @@ static decompress_status j2k_probe_internal_codec(codec_t in_codec, unsigned cha int msg_level = internal_prop->subsampling == 0 ? LOG_LEVEL_WARNING /* bogus? */ : LOG_LEVEL_VERBOSE; log_msg(msg_level, "J2K stream properties: %s\n", get_pixdesc_desc(*internal_prop)); + // Attempt to get the lossiness info of the image + enum cmpto_codestream_lossiness lossiness; + if (cmpto_j2k_dec_cstream_get_ext_img_info(buffer, len, &info, &lossiness) != CMPTO_OK) { + MSG(WARNING, "J2K failed to get image extended attributes. Unable to read image lossiness info.\n"); + } else { + static auto get_lossiness_string = [&lossiness]() { + switch (lossiness) { + case CMPTO_LOSSLESS: return "Lossless"; + case CMPTO_LOSSY: return "Lossy"; + case CMPTO_MIXED_LOSSINESS: return "Mixed"; + default: return "Unknown"; + } + }; + MSG(INFO, "J2K codestream lossiness: %s\n", get_lossiness_string()); + } + return DECODER_GOT_CODEC; }