summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMickael Savinaud <savmickael@users.noreply.github.com>2012-12-03 13:04:43 +0000
committerMickael Savinaud <savmickael@users.noreply.github.com>2012-12-03 13:04:43 +0000
commit0adb43f06e9c1517f1f72a4e596a247a5817d048 (patch)
treec12610d3c9e877a151a0324317c66cbd8e9673f9 /src
parent87e09a09da6493b9e25193173091fd56c2063136 (diff)
[trunk] correct the encoding of colr box information (thanks Winfried)
Diffstat (limited to 'src')
-rw-r--r--src/lib/openjp2/jp2.c53
1 files changed, 30 insertions, 23 deletions
diff --git a/src/lib/openjp2/jp2.c b/src/lib/openjp2/jp2.c
index 2d4acc29..9fd78592 100644
--- a/src/lib/openjp2/jp2.c
+++ b/src/lib/openjp2/jp2.c
@@ -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 */