]> granicus.if.org Git - openjpeg/commitdiff
[trunk] correct the encoding of colr box information (thanks Winfried)
authorMickael Savinaud <savmickael@users.noreply.github.com>
Mon, 3 Dec 2012 13:04:43 +0000 (13:04 +0000)
committerMickael Savinaud <savmickael@users.noreply.github.com>
Mon, 3 Dec 2012 13:04:43 +0000 (13:04 +0000)
src/lib/openjp2/jp2.c

index 2d4acc2996f33866f7b2179ed6b472c23e151d65..9fd785920950e7be0080e8b51ef8535fe274bbc6 100644 (file)
@@ -682,13 +682,15 @@ OPJ_BYTE * opj_jp2_write_colr(  opj_jp2_t *jp2,
        /* preconditions */
        assert(jp2 != 00);
        assert(p_nb_bytes_written != 00);
+    assert(jp2->meth == 1 || jp2->meth == 2);
 
-       switch (jp2->meth) {
+       switch (jp2->meth) { 
                case 1 :
-                       l_colr_size += 4;
+                       l_colr_size += 4; /* EnumCS */
                        break;
                case 2 :
-                       ++l_colr_size;
+            assert(jp2->color.icc_profile_len);        /* ICC profile */
+            l_colr_size += jp2->color.icc_profile_len;
                        break;
                default :
                        return 00;
@@ -717,11 +719,16 @@ OPJ_BYTE * opj_jp2_write_colr(  opj_jp2_t *jp2,
        opj_write_bytes(l_current_colr_ptr, jp2->approx,1);                             /* APPROX */
        ++l_current_colr_ptr;
        
-       if (jp2->meth == 1) {
-               opj_write_bytes(l_current_colr_ptr, jp2->enumcs,4);                     /* EnumCS */
-       }
-       else {
-               opj_write_bytes(l_current_colr_ptr, 0, 1);                                      /* PROFILE (??) */
+       if (jp2->meth == 1) { /* Meth value is restricted to 1 or 2 (Table I.9 of part 1) */
+        opj_write_bytes(l_current_colr_ptr, jp2->enumcs,4); }       /* EnumCS */
+    else {
+        if (jp2->meth == 2) {                                      /* ICC profile */
+            OPJ_UINT32 i;
+            for(i = 0; i < jp2->color.icc_profile_len; ++i) {
+                opj_write_bytes(l_current_colr_ptr, jp2->color.icc_profile_buf[i], 1);
+                ++l_current_colr_ptr;
+            }
+        }
        }
 
        *p_nb_bytes_written = l_colr_size;
@@ -1472,21 +1479,21 @@ void opj_jp2_setup_encoder(     opj_jp2_t *jp2,
        }
 
        /* Colour Specification box */
-       if ((image->numcomps == 1 || image->numcomps == 3) && (jp2->bpc != 255)) {
-               jp2->meth = 1;  /* METH: Enumerated colourspace */
-       } else {
-               jp2->meth = 2;  /* METH: Restricted ICC profile */
-       }
-       if (jp2->meth == 1) {
-               if (image->color_space == 1)
-                       jp2->enumcs = 16;       /* sRGB as defined by IEC 61966-2-1 */
-               else if (image->color_space == 2)
-                       jp2->enumcs = 17;       /* greyscale */
-               else if (image->color_space == 3)
-                       jp2->enumcs = 18;       /* YUV */
-       } else {
-               jp2->enumcs = 0;                /* PROFILE (??) */
-       }
+    if(image->icc_profile_len) {
+        jp2->meth = 2;
+        jp2->enumcs = 0;
+    } 
+    else {
+        jp2->meth = 1;
+        if (image->color_space == 1)
+            jp2->enumcs = 16;  /* sRGB as defined by IEC 61966-2-1 */
+        else if (image->color_space == 2)
+            jp2->enumcs = 17;  /* greyscale */
+        else if (image->color_space == 3)
+            jp2->enumcs = 18;  /* YUV */
+    }
+
+
        jp2->precedence = 0;    /* PRECEDENCE */
        jp2->approx = 0;                /* APPROX */