Skip to content

Commit

Permalink
openjp2/j2k: Report error if all wanted components are not decoded.
Browse files Browse the repository at this point in the history
Previously the caller had to check whether each component data had
been decoded. This means duplicating the checking in every user of
openjpeg which is unnecessary. If the caller wantes to decode all
or a set of, or a specific component then openjpeg ought to error
out if it was unable to do so.

Fixes #1158.
  • Loading branch information
sebras committed Nov 2, 2018
1 parent 948332e commit 2e1f95d
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 11 deletions.
11 changes: 0 additions & 11 deletions src/bin/jp2/opj_decompress.c
Original file line number Diff line number Diff line change
Expand Up @@ -1571,17 +1571,6 @@ int main(int argc, char **argv)
}
}

/* FIXME? Shouldn't that situation be considered as an error of */
/* opj_decode() / opj_get_decoded_tile() ? */
if (image->comps[0].data == NULL) {
fprintf(stderr, "ERROR -> opj_decompress: no image data!\n");
opj_destroy_codec(l_codec);
opj_stream_destroy(l_stream);
opj_image_destroy(image);
failed = 1;
goto fin;
}

tCumulative += opj_clock() - t;
numDecompressedImages++;

Expand Down
28 changes: 28 additions & 0 deletions src/lib/openjp2/j2k.c
Original file line number Diff line number Diff line change
Expand Up @@ -10666,6 +10666,8 @@ static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
OPJ_UINT32 l_nb_comps;
OPJ_UINT32 nr_tiles = 0;
OPJ_UINT32 compno;
OPJ_BOOL decoded_all_used_components = OPJ_TRUE;

/* Particular case for whole single tile decoding */
/* We can avoid allocating intermediate tile buffers */
Expand Down Expand Up @@ -10768,6 +10770,32 @@ static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
}
}

if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode) {
for (compno = 0;
compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
OPJ_UINT32 dec_compno =
p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
if (p_j2k->m_output_image->comps[dec_compno].data == NULL) {
opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
dec_compno);
decoded_all_used_components = OPJ_FALSE;
}
}
} else {
for (compno = 0; compno < p_j2k->m_output_image->numcomps; compno++) {
if (p_j2k->m_output_image->comps[compno].data == NULL) {
opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
compno);
decoded_all_used_components = OPJ_FALSE;
}
}
}

if (decoded_all_used_components == OPJ_FALSE) {
opj_event_msg(p_manager, EVT_ERROR, "Failed to decode all used components\n");
return OPJ_FALSE;
}

return OPJ_TRUE;
}

Expand Down

0 comments on commit 2e1f95d

Please sign in to comment.