if (i == 0) {
l_prec0 = l_img_comp->prec;
l_sgnd0 = l_img_comp->sgnd;
- } else if (l_cp->bpc_is_255 == 0
+ } else if (!l_cp->allow_different_bit_depth_sign
&& (l_img_comp->prec != l_prec0 || l_img_comp->sgnd != l_sgnd0)) {
- opj_event_msg(p_manager, EVT_ERROR,
- "Invalid precision and/or sgnd values for comp[%d]:\n"
+ opj_event_msg(p_manager, EVT_WARNING,
+ "Despite JP2 BPC!=255, precision and/or sgnd values for comp[%d] is different than comp[0]:\n"
" [0] prec(%d) sgnd(%d) [%d] prec(%d) sgnd(%d)\n", i, l_prec0, l_sgnd0,
i, l_img_comp->prec, l_img_comp->sgnd);
- return OPJ_FALSE;
}
+ /* TODO: we should perhaps also check against JP2 BPCC values */
}
opj_read_bytes(p_header_data, &tmp, 1); /* XRsiz_i */
++p_header_data;
l_j2k->m_is_decoder = 1;
l_j2k->m_cp.m_is_decoder = 1;
+ /* in the absence of JP2 boxes, consider different bit depth / sign */
+ /* per component is allowed */
+ l_j2k->m_cp.allow_different_bit_depth_sign = 1;
#ifdef OPJ_DISABLE_TPSOT_FIX
l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
OPJ_BITFIELD ppm : 1;
/** tells if the parameter is a coding or decoding one */
OPJ_BITFIELD m_is_decoder : 1;
- OPJ_BITFIELD bpc_is_255 : 1;
+ /** whether different bit depth or sign per component is allowed. Decoder only for ow */
+ OPJ_BITFIELD allow_different_bit_depth_sign : 1;
/* <<UniPG */
} opj_cp_t;
opj_read_bytes(p_image_header_data, &(jp2->IPR), 1); /* IPR */
++ p_image_header_data;
- jp2->j2k->m_cp.bpc_is_255 = (jp2->bpc == 255);
+ jp2->j2k->m_cp.allow_different_bit_depth_sign = (jp2->bpc == 255);
jp2->j2k->ihdr_w = jp2->w;
jp2->j2k->ihdr_h = jp2->h;
jp2->has_ihdr = 1;
3bf91c974abc17e520c6a5efa883a58a issue653-zero-unknownbox.jp2.png
8d7a866d29d5c68dc540b0f0011959a5 issue726.png
3bf91c974abc17e520c6a5efa883a58a issue818.png
+3c7ff2e4bdae849167be36589f32bcd5 issue979.j2k_0.pgx
+f004b48eafb2e52529cc9c7b6a3ff5d2 issue979.j2k_1.pgx
+3127bd0a591d113c3c2428c8d2c14ec8 issue979.j2k_2.pgx
+dacaf60e4c430916a8c2a9ebec32e71c issue979.j2k_3.pgx
\ No newline at end of file