]> Creatis software - gdcm.git/blob - src/gdcmjasper/src/libjasper/jp2/jp2_dec.c
c2086d61565eee209c79a5e1da67f92479ff897b
[gdcm.git] / src / gdcmjasper / src / libjasper / jp2 / jp2_dec.c
1 /*
2  * Copyright (c) 1999-2000 Image Power, Inc. and the University of
3  *   British Columbia.
4  * Copyright (c) 2001-2003 Michael David Adams.
5  * All rights reserved.
6  */
7
8 /* __START_OF_JASPER_LICENSE__
9  * 
10  * JasPer License Version 2.0
11  * 
12  * Copyright (c) 1999-2000 Image Power, Inc.
13  * Copyright (c) 1999-2000 The University of British Columbia
14  * Copyright (c) 2001-2003 Michael David Adams
15  * 
16  * All rights reserved.
17  * 
18  * Permission is hereby granted, free of charge, to any person (the
19  * "User") obtaining a copy of this software and associated documentation
20  * files (the "Software"), to deal in the Software without restriction,
21  * including without limitation the rights to use, copy, modify, merge,
22  * publish, distribute, and/or sell copies of the Software, and to permit
23  * persons to whom the Software is furnished to do so, subject to the
24  * following conditions:
25  * 
26  * 1.  The above copyright notices and this permission notice (which
27  * includes the disclaimer below) shall be included in all copies or
28  * substantial portions of the Software.
29  * 
30  * 2.  The name of a copyright holder shall not be used to endorse or
31  * promote products derived from the Software without specific prior
32  * written permission.
33  * 
34  * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
35  * LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
36  * THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
37  * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
38  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
39  * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
40  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
41  * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
42  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
43  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
44  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
45  * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
46  * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
47  * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
48  * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
49  * PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
50  * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
51  * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
52  * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
53  * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
54  * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
55  * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
56  * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
57  * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
58  * RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
59  * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
60  * 
61  * __END_OF_JASPER_LICENSE__
62  */
63
64 /*
65  * JP2 Library
66  *
67  * $Id: jp2_dec.c,v 1.1 2005/05/22 18:33:03 malaterre Exp $
68  */
69
70 /******************************************************************************\
71 * Includes.
72 \******************************************************************************/
73
74 #include "jasper/jas_image.h"
75 #include "jasper/jas_stream.h"
76 #include "jasper/jas_math.h"
77 #include "jasper/jas_debug.h"
78 #include "jasper/jas_malloc.h"
79 #include "jasper/jas_version.h"
80
81 #include "jp2_cod.h"
82 #include "jp2_dec.h"
83
84 #define  JP2_VALIDATELEN  (JAS_MIN(JP2_JP_LEN + 16, JAS_STREAM_MAXPUTBACK))
85
86 static jp2_dec_t *jp2_dec_create(void);
87 static void jp2_dec_destroy(jp2_dec_t *dec);
88 static int jp2_getcs(jp2_colr_t *colr);
89 static int fromiccpcs(int cs);
90 static int jp2_getct(int colorspace, int type, int assoc);
91
92 /******************************************************************************\
93 * Functions.
94 \******************************************************************************/
95
96 jas_image_t *jp2_decode(jas_stream_t *in, char *optstr)
97 {
98   jp2_box_t *box;
99   int found;
100   jas_image_t *image;
101   jp2_dec_t *dec;
102   bool samedtype;
103   int dtype;
104   unsigned int i;
105   jp2_cmap_t *cmapd;
106   jp2_pclr_t *pclrd;
107   jp2_cdef_t *cdefd;
108   unsigned int channo;
109   int newcmptno;
110   int_fast32_t *lutents;
111 #if 0
112   jp2_cdefchan_t *cdefent;
113   int cmptno;
114 #endif
115   jp2_cmapent_t *cmapent;
116   jas_icchdr_t icchdr;
117   jas_iccprof_t *iccprof;
118
119   dec = 0;
120   box = 0;
121   image = 0;
122
123   if (!(dec = jp2_dec_create())) {
124     goto error;
125   }
126
127   /* Get the first box.  This should be a JP box. */
128   if (!(box = jp2_box_get(in))) {
129     jas_eprintf("error: cannot get box\n");
130     goto error;
131   }
132   if (box->type != JP2_BOX_JP) {
133     jas_eprintf("error: expecting signature box\n");
134     goto error;
135   }
136   if (box->data.jp.magic != JP2_JP_MAGIC) {
137     jas_eprintf("incorrect magic number\n");
138     goto error;
139   }
140   jp2_box_destroy(box);
141   box = 0;
142
143   /* Get the second box.  This should be a FTYP box. */
144   if (!(box = jp2_box_get(in))) {
145     goto error;
146   }
147   if (box->type != JP2_BOX_FTYP) {
148     jas_eprintf("expecting file type box\n");
149     goto error;
150   }
151   jp2_box_destroy(box);
152   box = 0;
153
154   /* Get more boxes... */
155   found = 0;
156   while ((box = jp2_box_get(in))) {
157     if (jas_getdbglevel() >= 1) {
158       fprintf(stderr, "box type %s\n", box->info->name);
159     }
160     switch (box->type) {
161     case JP2_BOX_JP2C:
162       found = 1;
163       break;
164     case JP2_BOX_IHDR:
165       if (!dec->ihdr) {
166         dec->ihdr = box;
167         box = 0;
168       }
169       break;
170     case JP2_BOX_BPCC:
171       if (!dec->bpcc) {
172         dec->bpcc = box;
173         box = 0;
174       }
175       break;
176     case JP2_BOX_CDEF:
177       if (!dec->cdef) {
178         dec->cdef = box;
179         box = 0;
180       }
181       break;
182     case JP2_BOX_PCLR:
183       if (!dec->pclr) {
184         dec->pclr = box;
185         box = 0;
186       }
187       break;
188     case JP2_BOX_CMAP:
189       if (!dec->cmap) {
190         dec->cmap = box;
191         box = 0;
192       }
193       break;
194     case JP2_BOX_COLR:
195       if (!dec->colr) {
196         dec->colr = box;
197         box = 0;
198       }
199       break;
200     }
201     if (box) {
202       jp2_box_destroy(box);
203       box = 0;
204     }
205     if (found) {
206       break;
207     }
208   }
209
210   if (!found) {
211     jas_eprintf("error: no code stream found\n");
212     goto error;
213   }
214
215   if (!(dec->image = jpc_decode(in, optstr))) {
216     jas_eprintf("error: cannot decode code stream\n");
217     goto error;
218   }
219
220   /* An IHDR box must be present. */
221   if (!dec->ihdr) {
222     jas_eprintf("error: missing IHDR box\n");
223     goto error;
224   }
225
226   /* Does the number of components indicated in the IHDR box match
227     the value specified in the code stream? */
228   if (dec->ihdr->data.ihdr.numcmpts != JAS_CAST(uint, jas_image_numcmpts(dec->image))) {
229     jas_eprintf("warning: number of components mismatch\n");
230   }
231
232   /* At least one component must be present. */
233   if (!jas_image_numcmpts(dec->image)) {
234     jas_eprintf("error: no components\n");
235     goto error;
236   }
237
238   /* Determine if all components have the same data type. */
239   samedtype = true;
240   dtype = jas_image_cmptdtype(dec->image, 0);
241   for (i = 1; i < JAS_CAST(uint, jas_image_numcmpts(dec->image)); ++i) {
242     if (jas_image_cmptdtype(dec->image, i) != dtype) {
243       samedtype = false;
244       break;
245     }
246   }
247
248   /* Is the component data type indicated in the IHDR box consistent
249     with the data in the code stream? */
250   if ((samedtype && dec->ihdr->data.ihdr.bpc != JP2_DTYPETOBPC(dtype)) ||
251     (!samedtype && dec->ihdr->data.ihdr.bpc != JP2_IHDR_BPCNULL)) {
252     jas_eprintf("warning: component data type mismatch\n");
253   }
254
255   /* Is the compression type supported? */
256   if (dec->ihdr->data.ihdr.comptype != JP2_IHDR_COMPTYPE) {
257     jas_eprintf("error: unsupported compression type\n");
258     goto error;
259   }
260
261   if (dec->bpcc) {
262     /* Is the number of components indicated in the BPCC box
263       consistent with the code stream data? */
264     if (dec->bpcc->data.bpcc.numcmpts != JAS_CAST(uint, jas_image_numcmpts(
265       dec->image))) {
266       jas_eprintf("warning: number of components mismatch\n");
267     }
268     /* Is the component data type information indicated in the BPCC
269       box consistent with the code stream data? */
270     if (!samedtype) {
271       for (i = 0; i < JAS_CAST(uint, jas_image_numcmpts(dec->image)); ++i) {
272         if (jas_image_cmptdtype(dec->image, i) != JP2_BPCTODTYPE(dec->bpcc->data.bpcc.bpcs[i])) {
273           jas_eprintf("warning: component data type mismatch\n");
274         }
275       }
276     } else {
277       jas_eprintf("warning: superfluous BPCC box\n");
278     }
279   }
280
281   /* A COLR box must be present. */
282   if (!dec->colr) {
283     jas_eprintf("error: no COLR box\n");
284     goto error;
285   }
286
287   switch (dec->colr->data.colr.method) {
288   case JP2_COLR_ENUM:
289     jas_image_setclrspc(dec->image, jp2_getcs(&dec->colr->data.colr));
290     break;
291   case JP2_COLR_ICC:
292     iccprof = jas_iccprof_createfrombuf(dec->colr->data.colr.iccp,
293       dec->colr->data.colr.iccplen);
294     assert(iccprof);
295     jas_iccprof_gethdr(iccprof, &icchdr);
296     jas_eprintf("ICC Profile CS %08x\n", icchdr.colorspc);
297     jas_image_setclrspc(dec->image, fromiccpcs(icchdr.colorspc));
298     dec->image->cmprof_ = jas_cmprof_createfromiccprof(iccprof);
299     assert(dec->image->cmprof_);
300     jas_iccprof_destroy(iccprof);
301     break;
302   }
303
304   /* If a CMAP box is present, a PCLR box must also be present. */
305   if (dec->cmap && !dec->pclr) {
306     jas_eprintf("warning: missing PCLR box or superfluous CMAP box\n");
307     jp2_box_destroy(dec->cmap);
308     dec->cmap = 0;
309   }
310
311   /* If a CMAP box is not present, a PCLR box must not be present. */
312   if (!dec->cmap && dec->pclr) {
313     jas_eprintf("warning: missing CMAP box or superfluous PCLR box\n");
314     jp2_box_destroy(dec->pclr);
315     dec->pclr = 0;
316   }
317
318   /* Determine the number of channels (which is essentially the number
319     of components after any palette mappings have been applied). */
320   dec->numchans = dec->cmap ? dec->cmap->data.cmap.numchans : JAS_CAST(uint, jas_image_numcmpts(dec->image));
321
322   /* Perform a basic sanity check on the CMAP box if present. */
323   if (dec->cmap) {
324     for (i = 0; i < dec->numchans; ++i) {
325       /* Is the component number reasonable? */
326       if (dec->cmap->data.cmap.ents[i].cmptno >= JAS_CAST(uint, jas_image_numcmpts(dec->image))) {
327         jas_eprintf("error: invalid component number in CMAP box\n");
328         goto error;
329       }
330       /* Is the LUT index reasonable? */
331       if (dec->cmap->data.cmap.ents[i].pcol >= dec->pclr->data.pclr.numchans) {
332         jas_eprintf("error: invalid CMAP LUT index\n");
333         goto error;
334       }
335     }
336   }
337
338   /* Allocate space for the channel-number to component-number LUT. */
339   if (!(dec->chantocmptlut = jas_malloc(dec->numchans * sizeof(uint_fast16_t)))) {
340     jas_eprintf("error: no memory\n");
341     goto error;
342   }
343
344   if (!dec->cmap) {
345     for (i = 0; i < dec->numchans; ++i) {
346       dec->chantocmptlut[i] = i;
347     }
348   } else {
349     cmapd = &dec->cmap->data.cmap;
350     pclrd = &dec->pclr->data.pclr;
351     cdefd = &dec->cdef->data.cdef;
352     for (channo = 0; channo < cmapd->numchans; ++channo) {
353       cmapent = &cmapd->ents[channo];
354       if (cmapent->map == JP2_CMAP_DIRECT) {
355         dec->chantocmptlut[channo] = channo;
356       } else if (cmapent->map == JP2_CMAP_PALETTE) {
357         lutents = jas_malloc(pclrd->numlutents * sizeof(int_fast32_t));
358         for (i = 0; i < pclrd->numlutents; ++i) {
359           lutents[i] = pclrd->lutdata[cmapent->pcol + i * pclrd->numchans];
360         }
361         newcmptno = jas_image_numcmpts(dec->image);
362         jas_image_depalettize(dec->image, cmapent->cmptno, pclrd->numlutents, lutents, JP2_BPCTODTYPE(pclrd->bpc[cmapent->pcol]), newcmptno);
363         dec->chantocmptlut[channo] = newcmptno;
364         jas_free(lutents);
365 #if 0
366         if (dec->cdef) {
367           cdefent = jp2_cdef_lookup(cdefd, channo);
368           if (!cdefent) {
369             abort();
370           }
371         jas_image_setcmpttype(dec->image, newcmptno, jp2_getct(jas_image_clrspc(dec->image), cdefent->type, cdefent->assoc));
372         } else {
373         jas_image_setcmpttype(dec->image, newcmptno, jp2_getct(jas_image_clrspc(dec->image), 0, channo + 1));
374         }
375 #endif
376       }
377     }
378   }
379
380   /* Mark all components as being of unknown type. */
381
382   for (i = 0; i < JAS_CAST(uint, jas_image_numcmpts(dec->image)); ++i) {
383     jas_image_setcmpttype(dec->image, i, JAS_IMAGE_CT_UNKNOWN);
384   }
385
386   /* Determine the type of each component. */
387   if (dec->cdef) {
388     for (i = 0; i < dec->numchans; ++i) {
389       jas_image_setcmpttype(dec->image,
390         dec->chantocmptlut[dec->cdef->data.cdef.ents[i].channo],
391         jp2_getct(jas_image_clrspc(dec->image),
392         dec->cdef->data.cdef.ents[i].type, dec->cdef->data.cdef.ents[i].assoc));
393     }
394   } else {
395     for (i = 0; i < dec->numchans; ++i) {
396       jas_image_setcmpttype(dec->image, dec->chantocmptlut[i],
397         jp2_getct(jas_image_clrspc(dec->image), 0, i + 1));
398     }
399   }
400
401   /* Delete any components that are not of interest. */
402   for (i = jas_image_numcmpts(dec->image); i > 0; --i) {
403     if (jas_image_cmpttype(dec->image, i - 1) == JAS_IMAGE_CT_UNKNOWN) {
404       jas_image_delcmpt(dec->image, i - 1);
405     }
406   }
407
408   /* Ensure that some components survived. */
409   if (!jas_image_numcmpts(dec->image)) {
410     jas_eprintf("error: no components\n");
411     goto error;
412   }
413 #if 0
414 fprintf(stderr, "no of components is %d\n", jas_image_numcmpts(dec->image));
415 #endif
416
417   /* Prevent the image from being destroyed later. */
418   image = dec->image;
419   dec->image = 0;
420
421   jp2_dec_destroy(dec);
422
423   return image;
424
425 error:
426   if (box) {
427     jp2_box_destroy(box);
428   }
429   if (dec) {
430     jp2_dec_destroy(dec);
431   }
432   return 0;
433 }
434
435 int jp2_validate(jas_stream_t *in)
436 {
437   char buf[JP2_VALIDATELEN];
438   int i;
439   int n;
440 #if 0
441   jas_stream_t *tmpstream;
442   jp2_box_t *box;
443 #endif
444
445   assert(JAS_STREAM_MAXPUTBACK >= JP2_VALIDATELEN);
446
447   /* Read the validation data (i.e., the data used for detecting
448     the format). */
449   if ((n = jas_stream_read(in, buf, JP2_VALIDATELEN)) < 0) {
450     return -1;
451   }
452
453   /* Put the validation data back onto the stream, so that the
454     stream position will not be changed. */
455   for (i = n - 1; i >= 0; --i) {
456     if (jas_stream_ungetc(in, buf[i]) == EOF) {
457       return -1;
458     }
459   }
460
461   /* Did we read enough data? */
462   if (n < JP2_VALIDATELEN) {
463     return -1;
464   }
465
466   /* Is the box type correct? */
467   if (((buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]) !=
468     JP2_BOX_JP)
469   {
470     return -1;
471   }
472
473   return 0;
474 }
475
476 static jp2_dec_t *jp2_dec_create(void)
477 {
478   jp2_dec_t *dec;
479
480   if (!(dec = jas_malloc(sizeof(jp2_dec_t)))) {
481     return 0;
482   }
483   dec->ihdr = 0;
484   dec->bpcc = 0;
485   dec->cdef = 0;
486   dec->pclr = 0;
487   dec->image = 0;
488   dec->chantocmptlut = 0;
489   dec->cmap = 0;
490   dec->colr = 0;
491   return dec;
492 }
493
494 static void jp2_dec_destroy(jp2_dec_t *dec)
495 {
496   if (dec->ihdr) {
497     jp2_box_destroy(dec->ihdr);
498   }
499   if (dec->bpcc) {
500     jp2_box_destroy(dec->bpcc);
501   }
502   if (dec->cdef) {
503     jp2_box_destroy(dec->cdef);
504   }
505   if (dec->pclr) {
506     jp2_box_destroy(dec->pclr);
507   }
508   if (dec->image) {
509     jas_image_destroy(dec->image);
510   }
511   if (dec->cmap) {
512     jp2_box_destroy(dec->cmap);
513   }
514   if (dec->colr) {
515     jp2_box_destroy(dec->colr);
516   }
517   if (dec->chantocmptlut) {
518     jas_free(dec->chantocmptlut);
519   }
520   jas_free(dec);
521 }
522
523 static int jp2_getct(int colorspace, int type, int assoc)
524 {
525   if (type == 1 && assoc == 0) {
526     return JAS_IMAGE_CT_OPACITY;
527   }
528   if (type == 0 && assoc >= 1 && assoc <= 65534) {
529     switch (colorspace) {
530     case JAS_CLRSPC_FAM_RGB:
531       switch (assoc) {
532       case JP2_CDEF_RGB_R:
533         return JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_R);
534         break;
535       case JP2_CDEF_RGB_G:
536         return JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_G);
537         break;
538       case JP2_CDEF_RGB_B:
539         return JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_B);
540         break;
541       }
542       break;
543     case JAS_CLRSPC_FAM_YCBCR:
544       switch (assoc) {
545       case JP2_CDEF_YCBCR_Y:
546         return JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_Y);
547         break;
548       case JP2_CDEF_YCBCR_CB:
549         return JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_CB);
550         break;
551       case JP2_CDEF_YCBCR_CR:
552         return JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_CR);
553         break;
554       }
555       break;
556     case JAS_CLRSPC_FAM_GRAY:
557       switch (assoc) {
558       case JP2_CDEF_GRAY_Y:
559         return JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_GRAY_Y);
560         break;
561       }
562       break;
563     default:
564       return JAS_IMAGE_CT_COLOR(assoc - 1);
565       break;
566     }
567   }
568   return JAS_IMAGE_CT_UNKNOWN;
569 }
570
571 static int jp2_getcs(jp2_colr_t *colr)
572 {
573   if (colr->method == JP2_COLR_ENUM) {
574     switch (colr->csid) {
575     case JP2_COLR_SRGB:
576       return JAS_CLRSPC_SRGB;
577       break;
578     case JP2_COLR_SYCC:
579       return JAS_CLRSPC_SYCBCR;
580       break;
581     case JP2_COLR_SGRAY:
582       return JAS_CLRSPC_SGRAY;
583       break;
584     }
585   }
586   return JAS_CLRSPC_UNKNOWN;
587 }
588
589 static int fromiccpcs(int cs)
590 {
591   switch (cs) {
592   case ICC_CS_RGB:
593     return JAS_CLRSPC_GENRGB;
594     break;
595   case ICC_CS_YCBCR:
596     return JAS_CLRSPC_GENYCBCR;
597     break;
598   case ICC_CS_GRAY:
599     return JAS_CLRSPC_GENGRAY;
600     break;
601   }
602   return JAS_CLRSPC_UNKNOWN;
603 }