]> granicus.if.org Git - openjpeg/commitdiff
Partial revert BPC related check of #975 (#979)
authorEven Rouault <even.rouault@spatialys.com>
Wed, 9 Aug 2017 09:34:08 +0000 (11:34 +0200)
committerEven Rouault <even.rouault@spatialys.com>
Wed, 9 Aug 2017 09:34:08 +0000 (11:34 +0200)
PR #975 introduced a check that rejects images that have different bit depth/sign
per compoment in SIZ marker if the JP2 IHDR box has BPC != 255
This didn't work properly if decoding a .j2k file since the new bit added in
opj_cp_t wasn't initialized to the right value.
For clarity, tThis new bit has also been renamed to allow_different_bit_depth_sign

But looking closer at the code, it seems we were already tolerant to inconsistencies.
For example we parsed a JP2 BPCC box even if BPC != 255 (just a warning is emitted)
So failing hard in opj_j2k_read_siz() wouldn't be very inconsistent, and that
alone cannot protect against other issues, so just emit a warning if BPC != 255
and the SIZ marker contains different bit depth/sign per component.

Note: we could also check that the content of JP2 BPCC box is consistant with the one
of the SIZ marker.

src/lib/openjp2/j2k.c
src/lib/openjp2/j2k.h
src/lib/openjp2/jp2.c
tests/nonregression/md5refs.txt
tests/nonregression/test_suite.ctest.in

index 5a169e1809edc97106888716e370e96b3ee5a3f9..9cdc770b24c61c700a6b9902edbfcc4aa9c4749b 100644 (file)
@@ -2239,14 +2239,14 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
             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;
@@ -9273,6 +9273,9 @@ opj_j2k_t* opj_j2k_create_decompress(void)
 
     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;
index eeef6a9e17e86fd19c1082f4e2a95017eb092b39..d61c96dba32378c3a0d48dbca80a662b3da38335 100644 (file)
@@ -446,7 +446,8 @@ typedef struct opj_cp {
     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;
 
index df35a164d608060af76256abca20b33621ce7110..f3ccb9974246ced18a9919fc9959f3cf1389d23d 100644 (file)
@@ -619,7 +619,7 @@ static OPJ_BOOL opj_jp2_read_ihdr(opj_jp2_t *jp2,
     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;
index 2492ed529523ed974a0ec1d5857dccf82169aa4d..a2cda422bea9083f2ef3e6dc24b56d1cd9aa8382 100644 (file)
@@ -300,3 +300,7 @@ f3081c8e9e9a175f223382a7443b480f  issue559-eci-091-CIELab.jp2_2.pgx
 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
index ff05f7a0568bab3bf8dc6b639853e4e79cb3ec71..aaf40d7d0696f088702b3e1ad95e8d8787306390 100644 (file)
@@ -594,3 +594,6 @@ opj_decompress -i @INPUT_NR_PATH@/issue818.jp2 -o @TEMP_PATH@/issue818.png
 !opj_decompress -i @INPUT_NR_PATH@/issue826.jp2 -o @TEMP_PATH@/issue826.png
 # issue 820
 !opj_decompress -i @INPUT_NR_PATH@/issue820.jp2 -o @TEMP_PATH@/issue820.png
+
+# issue 979 (.j2k with different bit depth per component)
+opj_decompress -i @INPUT_NR_PATH@/issue979.j2k -o @TEMP_PATH@/issue979.j2k.pgx