80#if defined(__has_include)
81#if __has_include(<openjpeg.h>)
83#elif __has_include(<openjpeg-2.5/openjpeg.h>)
84#include <openjpeg-2.5/openjpeg.h>
85#elif __has_include(<openjpeg-2.1/openjpeg.h>)
86#include <openjpeg-2.1/openjpeg.h>
88#error "openjpeg.h not found"
101#define DOWNSAMPLE_FLOAT_TO_8BIT(_val) (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 255 : (int)roundf(255.0f * (_val)))
102#define DOWNSAMPLE_FLOAT_TO_12BIT(_val) (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 4095 : (int)roundf(4095.0f * (_val)))
103#define DOWNSAMPLE_FLOAT_TO_16BIT(_val) \
104 (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 65535 : (int)roundf(65535.0f * (_val)))
145 FILE *stream = (FILE *)client_data;
146 fprintf(stream,
"[ERROR] %s", msg);
153 FILE *stream = (FILE *)client_data;
154 fprintf(stream,
"[WARNING] %s", msg);
161 FILE *stream = (FILE *)client_data;
162 fprintf(stream,
"[INFO] %s", msg);
171 POC[0].resno1 = numres - 1;
173 POC[0].prg1 = OPJ_CPRL;
175 POC[1].resno0 = numres - 1;
178 POC[1].resno1 = numres;
180 POC[1].prg1 = OPJ_CPRL;
186 parameters->tile_size_on = 0;
187 parameters->cp_tdx = 1;
188 parameters->cp_tdy = 1;
191 parameters->tp_flag =
'C';
192 parameters->tp_on = 1;
195 parameters->cp_tx0 = 0;
196 parameters->cp_ty0 = 0;
197 parameters->image_offset_x0 = 0;
198 parameters->image_offset_y0 = 0;
201 parameters->cblockw_init = 32;
202 parameters->cblockh_init = 32;
203 parameters->csty |= 0x01;
206 parameters->prog_order = OPJ_CPRL;
209 parameters->roi_compno = -1;
211 parameters->subsampling_dx = 1;
212 parameters->subsampling_dy = 1;
215 parameters->irreversible = 1;
223 switch(parameters->cp_cinema)
225 case OPJ_CINEMA2K_24:
226 case OPJ_CINEMA2K_48:
227 parameters->cp_rsiz = OPJ_CINEMA2K;
228 if(parameters->numresolution > 6)
230 parameters->numresolution = 6;
232 if(!((image->comps[0].w == 2048) | (image->comps[0].h == 1080)))
235 "Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3 "
236 "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n",
237 image->comps[0].w, image->comps[0].h);
238 parameters->cp_rsiz = OPJ_STD_RSIZ;
242 case OPJ_CINEMA4K_24:
243 parameters->cp_rsiz = OPJ_CINEMA4K;
244 if(parameters->numresolution < 1)
246 parameters->numresolution = 1;
248 else if(parameters->numresolution > 7)
250 parameters->numresolution = 7;
252 if(!((image->comps[0].w == 4096) | (image->comps[0].h == 2160)))
255 "Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4"
256 "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n",
257 image->comps[0].w, image->comps[0].h);
258 parameters->cp_rsiz = OPJ_STD_RSIZ;
260 parameters->numpocs =
initialise_4K_poc(parameters->POC, parameters->numresolution);
266 switch(parameters->cp_cinema)
268 case OPJ_CINEMA2K_24:
269 case OPJ_CINEMA4K_24:
270 for(
i = 0;
i < parameters->tcp_numlayers;
i++)
274 parameters->tcp_rates[0]
275 = ((float)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))
276 / (OPJ_CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
281 = ((float)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))
282 / (rates[
i] * 8 * image->comps[0].dx * image->comps[0].dy);
283 if(temp_rate > OPJ_CINEMA_24_CS)
285 parameters->tcp_rates[
i]
286 = ((float)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))
287 / (OPJ_CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
291 parameters->tcp_rates[
i] = rates[
i];
295 parameters->max_comp_size = OPJ_CINEMA_24_COMP;
298 case OPJ_CINEMA2K_48:
299 for(
i = 0;
i < parameters->tcp_numlayers;
i++)
303 parameters->tcp_rates[0]
304 = ((float)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))
305 / (OPJ_CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
310 = ((float)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))
311 / (rates[
i] * 8 * image->comps[0].dx * image->comps[0].dy);
312 if(temp_rate > OPJ_CINEMA_48_CS)
314 parameters->tcp_rates[0]
315 = ((float)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))
316 / (OPJ_CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
320 parameters->tcp_rates[
i] = rates[
i];
324 parameters->max_comp_size = OPJ_CINEMA_48_COMP;
329 parameters->cp_disto_alloc = 1;
334 void *exif,
int exif_len, int32_t imgid,
int num,
int total,
struct dt_dev_pixelpipe_t *pipe,
335 const gboolean export_masks)
338 const float *in = (
const float *)in_tmp;
340 opj_cparameters_t parameters;
342 opj_image_t *image = NULL;
343 const int quality = CLAMP(j2k->
quality, 1, 100);
346 opj_set_default_encoder_parameters(¶meters);
351 parameters.tcp_rates[0] = 100 - quality + 1;
353 parameters.tcp_numlayers = 1;
354 parameters.cp_disto_alloc = 1;
355 parameters.cp_rsiz = OPJ_STD_RSIZ;
357 parameters.cod_format = j2k->
format;
358 parameters.cp_cinema = (OPJ_CINEMA_MODE)j2k->
preset;
360 if(parameters.cp_cinema)
362 rates = (
float *)calloc(parameters.tcp_numlayers,
sizeof(
float));
363 for(
int i = 0;
i < parameters.tcp_numlayers;
i++)
365 rates[
i] = parameters.tcp_rates[
i];
375 const int subsampling_dx = parameters.subsampling_dx;
376 const int subsampling_dy = parameters.subsampling_dy;
377 const int numcomps = 3;
381 opj_image_cmptparm_t cmptparm[4];
382 memset(&cmptparm[0], 0,
sizeof(opj_image_cmptparm_t) * numcomps);
384 for(
int i = 0;
i < numcomps;
i++)
386 cmptparm[
i].prec = prec;
387 cmptparm[
i].sgnd = 0;
388 cmptparm[
i].dx = subsampling_dx;
389 cmptparm[
i].dy = subsampling_dy;
393 image = opj_image_create(numcomps, &cmptparm[0], OPJ_CLRSPC_SRGB);
396 fprintf(stderr,
"Error: opj_image_create() failed\n");
403 image->x0 = parameters.image_offset_x0;
404 image->y0 = parameters.image_offset_y0;
405 image->x1 = parameters.image_offset_x0 + (w - 1) * subsampling_dx + 1;
406 image->y1 = parameters.image_offset_y0 + (h - 1) * subsampling_dy + 1;
417 for(
int i = 0;
i < w * h;
i++)
419 for(
int k = 0;
k < numcomps;
k++)
442 parameters.tcp_mct = image->numcomps == 3 ? 1 : 0;
444 if(parameters.cp_cinema)
452 OPJ_CODEC_FORMAT codec;
453 if(parameters.cod_format ==
J2K_CFMT)
454 codec = OPJ_CODEC_J2K;
456 codec = OPJ_CODEC_JP2;
458 opj_stream_t *cstream = NULL;
461 opj_codec_t *ccodec = opj_create_compress(codec);
467 g_strlcpy(parameters.outfile, filename,
sizeof(parameters.outfile));
470 opj_setup_encoder(ccodec, ¶meters, image);
474 cstream = opj_stream_create_default_file_stream(parameters.outfile, OPJ_FALSE);
477 opj_destroy_codec(ccodec);
478 opj_image_destroy(image);
479 fprintf(stderr,
"failed to create output stream\n");
484 if(!opj_start_compress(ccodec, image, cstream))
486 opj_stream_destroy(cstream);
487 opj_destroy_codec(ccodec);
488 opj_image_destroy(image);
489 fprintf(stderr,
"failed to encode image: opj_start_compress\n");
495 if(!opj_encode(ccodec, cstream))
497 opj_stream_destroy(cstream);
498 opj_destroy_codec(ccodec);
499 opj_image_destroy(image);
500 fprintf(stderr,
"failed to encode image: opj_encode\n");
506 if(!opj_end_compress(ccodec, cstream))
508 opj_stream_destroy(cstream);
509 opj_destroy_codec(ccodec);
510 opj_image_destroy(image);
511 fprintf(stderr,
"failed to encode image: opj_end_compress\n");
516 opj_stream_destroy(cstream);
517 opj_destroy_codec(ccodec);
523 opj_image_destroy(image);
527 dt_free(parameters.cp_comment);
528 dt_free(parameters.cp_matrice);
531 return ((rc == 1) ? 0 : 1);
540 const size_t old_params_size,
const int old_version,
const int new_version,
543 if(old_version == 1 && new_version == 2)
545 typedef struct dt_imageio_j2k_v1_t
547 int max_width, max_height;
554 } dt_imageio_j2k_v1_t;
556 dt_imageio_j2k_v1_t *o = (dt_imageio_j2k_v1_t *)old_params;
560 n->global.max_height = o->max_height;
561 n->global.width = o->width;
562 n->global.height = o->height;
563 g_strlcpy(
n->global.style, o->style,
sizeof(o->style));
565 n->format = o->format;
566 n->preset = o->preset;
567 n->quality = o->quality;
568 *new_size = self->params_size(self);
581 if(
d->quality <= 0 ||
d->quality > 100)
d->quality = 100;
592 if(
size != self->params_size(self))
return 1;
628 return _(
"JPEG 2000 (12-bit)");
656 const int format_last =
dt_conf_get_int(
"plugins/imageio/format/j2k/format");
657 const int preset_last =
dt_conf_get_int(
"plugins/imageio/format/j2k/preset");
658 const int quality_last =
dt_conf_get_int(
"plugins/imageio/format/j2k/quality");
void dt_bauhaus_slider_set_default(GtkWidget *widget, float def)
float dt_bauhaus_slider_get(GtkWidget *widget)
int dt_bauhaus_combobox_get(GtkWidget *widget)
void dt_bauhaus_slider_set(GtkWidget *widget, float pos)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
void dt_bauhaus_widget_set_label(GtkWidget *widget, const char *label)
GtkWidget * dt_bauhaus_slider_new_with_range(dt_bauhaus_t *bh, dt_gui_module_t *self, float min, float max, float step, float defval, int digits)
GtkWidget * dt_bauhaus_combobox_new(dt_bauhaus_t *bh, dt_gui_module_t *self)
void dt_bauhaus_combobox_add(GtkWidget *widget, const char *text)
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
Integer for name, clamped to the bounds declared in the XML.
int dt_confgen_get_int(const char *name, dt_confgen_value_kind_t kind)
const char darktable_package_string[]
struct dt_bauhaus_t * dt_bauhaus_get_global(void)
int dt_exif_write_blob(uint8_t *blob, uint32_t size, const char *path, const int compressed)
What a photograph says about itself: the EXIF, IPTC and XMP tags a camera and a cataloguer write,...
@ FORMAT_FLAGS_SUPPORT_XMP
struct dt_iop_tonecurve_params_t preset
const char * mime(dt_imageio_module_data_t *data)
static void format_changed(GtkWidget *widget, gpointer user_data)
size_t params_size(dt_imageio_module_format_t *self)
const char * extension(dt_imageio_module_data_t *data_tmp)
static void cinema_parameters(opj_cparameters_t *parameters)
void gui_reset(dt_imageio_module_format_t *self)
void gui_init(dt_imageio_module_format_t *self)
@ DT_J2K_PRESET_CINEMA2K_24
@ DT_J2K_PRESET_CINEMA4K_24
@ DT_J2K_PRESET_CINEMA2K_48
int set_params(dt_imageio_module_format_t *self, const void *params, const int size)
static void warning_callback(const char *msg, void *client_data)
void cleanup(dt_imageio_module_format_t *self)
int levels(dt_imageio_module_data_t *p)
void * legacy_params(dt_imageio_module_format_t *self, const void *const old_params, const size_t old_params_size, const int old_version, const int new_version, size_t *new_size)
void free_params(dt_imageio_module_format_t *self, dt_imageio_module_data_t *params)
static void preset_changed(GtkWidget *widget, gpointer user_data)
static int initialise_4K_poc(opj_poc_t *POC, int numres)
int write_image(dt_imageio_module_data_t *j2k_tmp, const char *filename, const void *in_tmp, dt_colorspaces_color_profile_type_t over_type, const char *over_filename, void *exif, int exif_len, int32_t imgid, int num, int total, struct dt_dev_pixelpipe_t *pipe, const gboolean export_masks)
void init(dt_imageio_module_format_t *self)
static void error_callback(const char *msg, void *client_data)
void * get_params(dt_imageio_module_format_t *self)
#define DOWNSAMPLE_FLOAT_TO_12BIT(_val)
void gui_cleanup(dt_imageio_module_format_t *self)
static void quality_changed(GtkWidget *slider, gpointer user_data)
static void info_callback(const char *msg, void *client_data)
static void cinema_setup_encoder(opj_cparameters_t *parameters, opj_image_t *image, float *rates)
float *const restrict const size_t k
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
dt_mipmap_buffer_dsc_flags flags
#define DT_MODULE(MODVER)
Instantiate the version handshake every module must export. Use once, at file scope,...
dt_colorspaces_color_profile_type_t
dt_imageio_j2k_preset_t preset
dt_imageio_j2k_format_t format
dt_imageio_module_data_t global