/** @name Local static functions */
/*@{*/
+#define OPJ_UNUSED(x) (void)x
+
/**
* Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures.
*/
assert(p_j2k != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_j2k);
+ OPJ_UNUSED(p_manager);
+
l_nb_tiles = cp->tw * cp->th;
* p_nb_tiles = 0;
tcp = cp->tcps;
i, l_img_comp->dx, l_img_comp->dy);
return OPJ_FALSE;
}
- if (l_img_comp->prec > 38) { /* TODO openjpeg won't handle more than ? */
+ /* Avoids later undefined shift in computation of */
+ /* p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
+ << (l_image->comps[i].prec - 1); */
+ if (l_img_comp->prec > 32) {
opj_event_msg(p_manager, EVT_ERROR,
- "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm)\n",
+ "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm. OpenJpeg only supports up to 32)\n",
i, l_img_comp->prec);
return OPJ_FALSE;
}
assert(p_j2k != 00);
assert(p_manager != 00);
assert(p_header_data != 00);
- (void)p_header_size;
+
+ OPJ_UNUSED(p_j2k);
+ OPJ_UNUSED(p_header_data);
+ OPJ_UNUSED(p_header_size);
+ OPJ_UNUSED(p_manager);
return OPJ_TRUE;
}
assert(p_j2k != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_manager);
+
l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
l_tccp = &l_tcp->tccps[0];
l_image = p_j2k->m_private_image;
assert(p_j2k != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_header_data);
+
l_nb_comp = p_j2k->m_private_image->numcomps;
if (p_header_size != l_nb_comp * 4) {
assert(p_j2k != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_j2k);
+
if (p_header_size < 2) {
opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
return OPJ_FALSE;
assert(p_j2k != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_j2k);
+ OPJ_UNUSED(p_header_data);
+
if (p_header_size < 1) {
opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
return OPJ_FALSE;
assert(p_j2k != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_j2k);
+
if (p_header_size < 1) {
opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
return OPJ_FALSE;
assert(p_manager != 00);
assert(p_stream != 00);
+ OPJ_UNUSED(p_stream);
+ OPJ_UNUSED(p_manager);
+
opj_write_bytes(p_data, J2K_MS_SOT,
2); /* SOT */
p_data += 2;
l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
+ /* Fixes issue with id_000020,sig_06,src_001958,op_flip4,pos_149 */
+ /* of https://github.com/uclouvain/openjpeg/issues/939 */
+ /* We must avoid reading twice the same tile part number for a given tile */
+ /* so as to avoid various issues, like opj_j2k_merge_ppt being called */
+ /* several times. */
+ /* ISO 15444-1 A.4.2 Start of tile-part (SOT) mandates that tile parts */
+ /* should appear in increasing order. */
+ if (l_tcp->m_current_tile_part_number + 1 != (OPJ_INT32)l_current_part) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Invalid tile part index for tile number %d. "
+ "Got %d, expected %d\n",
+ p_j2k->m_current_tile_number,
+ l_current_part,
+ l_tcp->m_current_tile_part_number + 1);
+ return OPJ_FALSE;
+ }
+ ++ l_tcp->m_current_tile_part_number;
+
#ifdef USE_JPWL
if (l_cp->correct) {
assert(p_manager != 00);
assert(p_stream != 00);
+ OPJ_UNUSED(p_stream);
+
opj_write_bytes(p_data, J2K_MS_SOD,
2); /* SOD */
p_data += 2;
assert(p_manager != 00);
assert(p_stream != 00);
+ OPJ_UNUSED(p_manager);
+
l_cp = &(p_j2k->m_cp);
l_image = p_j2k->m_private_image;
l_tcp = l_cp->tcps;
assert(p_manager != 00);
assert(p_stream != 00);
+ OPJ_UNUSED(p_manager);
+
p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
return OPJ_TRUE;
assert(p_manager != 00);
assert(p_stream != 00);
+ OPJ_UNUSED(p_manager);
+
l_cstr_index = p_j2k->cstr_index;
if (l_cstr_index) {
l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
++p_header_data;
l_comp->sgnd = (l_comp_def >> 7) & 1;
l_comp->prec = (l_comp_def & 0x7f) + 1;
+
+ if (l_comp->prec > 32) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm. OpenJpeg only supports up to 32)\n",
+ i, l_comp->prec);
+ return OPJ_FALSE;
+ }
++l_comp;
}
assert(p_stream != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_stream);
+ OPJ_UNUSED(p_manager);
+
if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
assert(p_stream != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_stream);
+
/* STATE checking */
/* make sure the state is at 0 */
l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
assert(p_stream != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_stream);
+ OPJ_UNUSED(p_manager);
+
/* STATE checking */
/* make sure the state is at 0 */
#ifdef TODO_MSD
/* read 2 bytes as the marker size */
opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
2);
+ if (l_marker_size < 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
+ return OPJ_FALSE;
+ }
l_marker_size -= 2; /* Subtract the size of the marker ID already read */
/* Check if the marker size is compatible with the header data size */
assert(p_stream != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_stream);
+
l_image = p_j2k->m_private_image;
l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
l_tcp = p_j2k->m_cp.tcps;
l_tcp->cod = 0;
l_tcp->ppt = 0;
l_tcp->ppt_data = 00;
+ l_tcp->m_current_tile_part_number = -1;
/* Remove memory not owned by this tile in case of early error return. */
l_tcp->m_mct_decoding_matrix = 00;
l_tcp->m_nb_max_mct_records = 0;
OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
OPJ_UINT32 l_nb_comps;
OPJ_BYTE * l_current_data;
+ OPJ_UINT32 l_nb_tiles;
+ OPJ_UINT32 i;
l_current_data = (OPJ_BYTE*)opj_malloc(1000);
if (! l_current_data) {
}
}
+ /* Reset current tile part number for all tiles, and not only the one */
+ /* of interest. */
+ /* Not completely sure this is always correct but required for */
+ /* ./build/bin/j2k_random_tile_access ./build/tests/tte1.j2k */
+ l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
+ for (i = 0; i < l_nb_tiles; ++i) {
+ p_j2k->m_cp.tcps[i].m_current_tile_part_number = -1;
+ }
+
for (;;) {
if (! opj_j2k_read_tile_header(p_j2k,
&l_current_tile_no,
assert(p_manager != 00);
assert(p_stream != 00);
+ OPJ_UNUSED(p_stream);
+ OPJ_UNUSED(p_manager);
+
opj_tcd_destroy(p_j2k->m_tcd);
p_j2k->m_tcd = 00;
assert(p_stream != 00);
assert(p_manager != 00);
+ OPJ_UNUSED(p_stream);
+ OPJ_UNUSED(p_manager);
+
if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
assert(p_stream != 00);
(void)l_cstr_info;
+ OPJ_UNUSED(p_stream);
+
/* TODO mergeV2: check this part which use cstr_info */
/*l_cstr_info = p_j2k->cstr_info;
assert(p_manager != 00);
assert(p_stream != 00);
+ OPJ_UNUSED(p_stream);
+
p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
if (! p_j2k->m_tcd) {