Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions src/video_compress/cmpto_j2k.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
16 changes: 16 additions & 0 deletions src/video_decompress/cmpto_j2k.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down