Skip to content

Commit

Permalink
Do not turn on 'TPsot==TNsot detection fix' when TNsot==1, and add a …
Browse files Browse the repository at this point in the history
…OPJ_DPARAMETERS_DISABLE_TPSOT_FIX flag to disable it

Adresses the use case of https://lists.osgeo.org/pipermail/gdal-dev/2024-November/059805.html
where Sentinel2 L1C JPEG2000 files are made of a single tile-part per
tile.
  • Loading branch information
rouault committed Nov 13, 2024
1 parent 4ec0aca commit 497d58c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
19 changes: 16 additions & 3 deletions src/lib/openjp2/j2k.c
Original file line number Diff line number Diff line change
Expand Up @@ -6752,6 +6752,9 @@ void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;

j2k->dump_state = (parameters->flags & OPJ_DPARAMETERS_DUMP_FLAG);
if (parameters->flags & OPJ_DPARAMETERS_DISABLE_TPSOT_FIX) {
j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
}
#ifdef USE_JPWL
j2k->m_cp.correct = parameters->jpwl_correct;
j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
Expand Down Expand Up @@ -9964,11 +9967,21 @@ OPJ_BOOL opj_j2k_read_tile_header(opj_j2k_t * p_j2k,
if (p_j2k->m_specific_param.m_decoder.m_can_decode &&
!p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) {
/* Issue 254 */
OPJ_BOOL l_correction_needed;
OPJ_BOOL l_correction_needed = OPJ_FALSE;

p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
if (!opj_j2k_need_nb_tile_parts_correction(p_stream,
p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
if (p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts == 1) {
/* Skip opj_j2k_need_nb_tile_parts_correction() if there is
* only a single tile part declared. The
* opj_j2k_need_nb_tile_parts_correction() hack was needed
* for files with 5 declared tileparts (where they were
* actually 6).
* Doing it systematically hurts performance when reading
* Sentinel2 L1C JPEG2000 files as explained in
* https://lists.osgeo.org/pipermail/gdal-dev/2024-November/059805.html
*/
} else if (!opj_j2k_need_nb_tile_parts_correction(p_stream,
p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
opj_event_msg(p_manager, EVT_ERROR,
"opj_j2k_apply_nb_tile_parts_correction error\n");
return OPJ_FALSE;
Expand Down
7 changes: 6 additions & 1 deletion src/lib/openjp2/openjpeg.h
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,12 @@ typedef struct opj_cparameters {
} opj_cparameters_t;

#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG 0x0001
#define OPJ_DPARAMETERS_DUMP_FLAG 0x0002
#define OPJ_DPARAMETERS_DUMP_FLAG 0x0002

/** Disable at runtime the check for invalid TPSOT values added in
* https://github.com/uclouvain/openjpeg/pull/514.
*/
#define OPJ_DPARAMETERS_DISABLE_TPSOT_FIX 0x0004

/**
* Decompression parameters
Expand Down

0 comments on commit 497d58c

Please sign in to comment.