Coverage Report

Created: 2025-06-10 07:27

/src/ghostpdl/openjpeg/src/lib/openjp2/jp2.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * The copyright in this software is being made available under the 2-clauses
3
 * BSD License, included below. This software may be subject to other third
4
 * party and contributor rights, including patent rights, and no such rights
5
 * are granted under this license.
6
 *
7
 * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8
 * Copyright (c) 2002-2014, Professor Benoit Macq
9
 * Copyright (c) 2001-2003, David Janssens
10
 * Copyright (c) 2002-2003, Yannick Verschueren
11
 * Copyright (c) 2003-2007, Francois-Olivier Devaux
12
 * Copyright (c) 2003-2014, Antonin Descampe
13
 * Copyright (c) 2005, Herve Drolon, FreeImage Team
14
 * Copyright (c) 2010-2011, Kaori Hagihara
15
 * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
16
 * Copyright (c) 2012, CS Systemes d'Information, France
17
 * All rights reserved.
18
 *
19
 * Redistribution and use in source and binary forms, with or without
20
 * modification, are permitted provided that the following conditions
21
 * are met:
22
 * 1. Redistributions of source code must retain the above copyright
23
 *    notice, this list of conditions and the following disclaimer.
24
 * 2. Redistributions in binary form must reproduce the above copyright
25
 *    notice, this list of conditions and the following disclaimer in the
26
 *    documentation and/or other materials provided with the distribution.
27
 *
28
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
29
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
32
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38
 * POSSIBILITY OF SUCH DAMAGE.
39
 */
40
#include "opj_includes.h"
41
42
/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
43
/*@{*/
44
45
13.3k
#define OPJ_BOX_SIZE    1024
46
47
26.7k
#define OPJ_UNUSED(x) (void)x
48
49
/** @name Local static functions */
50
/*@{*/
51
52
/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
53
54
/**
55
 * Reads a IHDR box - Image Header box
56
 *
57
 * @param   p_image_header_data         pointer to actual data (already read from file)
58
 * @param   jp2                         the jpeg2000 file codec.
59
 * @param   p_image_header_size         the size of the image header
60
 * @param   p_manager                   the user event manager.
61
 *
62
 * @return  true if the image header is valid, false else.
63
 */
64
static OPJ_BOOL opj_jp2_read_ihdr(opj_jp2_t *jp2,
65
                                  OPJ_BYTE *p_image_header_data,
66
                                  OPJ_UINT32 p_image_header_size,
67
                                  opj_event_mgr_t * p_manager);
68
69
/**
70
 * Writes the Image Header box - Image Header box.
71
 *
72
 * @param jp2                   jpeg2000 file codec.
73
 * @param p_nb_bytes_written    pointer to store the nb of bytes written by the function.
74
 *
75
 * @return  the data being copied.
76
*/
77
static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
78
                                     OPJ_UINT32 * p_nb_bytes_written);
79
80
/**
81
 * Writes the Bit per Component box.
82
 *
83
 * @param   jp2                     jpeg2000 file codec.
84
 * @param   p_nb_bytes_written      pointer to store the nb of bytes written by the function.
85
 *
86
 * @return  the data being copied.
87
*/
88
static OPJ_BYTE * opj_jp2_write_bpcc(opj_jp2_t *jp2,
89
                                     OPJ_UINT32 * p_nb_bytes_written);
90
91
/**
92
 * Reads a Bit per Component box.
93
 *
94
 * @param   p_bpc_header_data           pointer to actual data (already read from file)
95
 * @param   jp2                         the jpeg2000 file codec.
96
 * @param   p_bpc_header_size           the size of the bpc header
97
 * @param   p_manager                   the user event manager.
98
 *
99
 * @return  true if the bpc header is valid, false else.
100
 */
101
static OPJ_BOOL opj_jp2_read_bpcc(opj_jp2_t *jp2,
102
                                  OPJ_BYTE * p_bpc_header_data,
103
                                  OPJ_UINT32 p_bpc_header_size,
104
                                  opj_event_mgr_t * p_manager);
105
106
static OPJ_BOOL opj_jp2_read_cdef(opj_jp2_t * jp2,
107
                                  OPJ_BYTE * p_cdef_header_data,
108
                                  OPJ_UINT32 p_cdef_header_size,
109
                                  opj_event_mgr_t * p_manager);
110
111
static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color,
112
                               opj_event_mgr_t *);
113
114
/**
115
 * Writes the Channel Definition box.
116
 *
117
 * @param jp2                   jpeg2000 file codec.
118
 * @param p_nb_bytes_written    pointer to store the nb of bytes written by the function.
119
 *
120
 * @return  the data being copied.
121
 */
122
static OPJ_BYTE * opj_jp2_write_cdef(opj_jp2_t *jp2,
123
                                     OPJ_UINT32 * p_nb_bytes_written);
124
125
/**
126
 * Writes the Colour Specification box.
127
 *
128
 * @param jp2                   jpeg2000 file codec.
129
 * @param p_nb_bytes_written    pointer to store the nb of bytes written by the function.
130
 *
131
 * @return  the data being copied.
132
*/
133
static OPJ_BYTE * opj_jp2_write_colr(opj_jp2_t *jp2,
134
                                     OPJ_UINT32 * p_nb_bytes_written);
135
136
/**
137
 * Writes a FTYP box - File type box
138
 *
139
 * @param   cio         the stream to write data to.
140
 * @param   jp2         the jpeg2000 file codec.
141
 * @param   p_manager   the user event manager.
142
 *
143
 * @return  true if writing was successful.
144
 */
145
static OPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,
146
                                   opj_stream_private_t *cio,
147
                                   opj_event_mgr_t * p_manager);
148
149
/**
150
 * Reads a a FTYP box - File type box
151
 *
152
 * @param   p_header_data   the data contained in the FTYP box.
153
 * @param   jp2             the jpeg2000 file codec.
154
 * @param   p_header_size   the size of the data contained in the FTYP box.
155
 * @param   p_manager       the user event manager.
156
 *
157
 * @return true if the FTYP box is valid.
158
 */
159
static OPJ_BOOL opj_jp2_read_ftyp(opj_jp2_t *jp2,
160
                                  OPJ_BYTE * p_header_data,
161
                                  OPJ_UINT32 p_header_size,
162
                                  opj_event_mgr_t * p_manager);
163
164
static OPJ_BOOL opj_jp2_skip_jp2c(opj_jp2_t *jp2,
165
                                  opj_stream_private_t *stream,
166
                                  opj_event_mgr_t * p_manager);
167
168
/**
169
 * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
170
 *
171
 * @param   p_header_data   the data contained in the file header box.
172
 * @param   jp2             the jpeg2000 file codec.
173
 * @param   p_header_size   the size of the data contained in the file header box.
174
 * @param   p_manager       the user event manager.
175
 *
176
 * @return true if the JP2 Header box was successfully recognized.
177
*/
178
static OPJ_BOOL opj_jp2_read_jp2h(opj_jp2_t *jp2,
179
                                  OPJ_BYTE *p_header_data,
180
                                  OPJ_UINT32 p_header_size,
181
                                  opj_event_mgr_t * p_manager);
182
183
/**
184
 * Writes the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
185
 *
186
 * @param  jp2      the jpeg2000 file codec.
187
 * @param  stream      the stream to write data to.
188
 * @param  p_manager  user event manager.
189
 *
190
 * @return true if writing was successful.
191
 */
192
static OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
193
                                   opj_stream_private_t *stream,
194
                                   opj_event_mgr_t * p_manager);
195
196
/**
197
 * Writes the Jpeg2000 codestream Header box - JP2C Header box. This function must be called AFTER the coding has been done.
198
 *
199
 * @param   cio         the stream to write data to.
200
 * @param   jp2         the jpeg2000 file codec.
201
 * @param   p_manager   user event manager.
202
 *
203
 * @return true if writing was successful.
204
*/
205
static OPJ_BOOL opj_jp2_write_jp2c(opj_jp2_t *jp2,
206
                                   opj_stream_private_t *cio,
207
                                   opj_event_mgr_t * p_manager);
208
209
#ifdef USE_JPIP
210
/**
211
 * Write index Finder box
212
 * @param cio     the stream to write to.
213
 * @param   jp2         the jpeg2000 file codec.
214
 * @param   p_manager   user event manager.
215
*/
216
static OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,
217
                                    opj_stream_private_t *cio,
218
                                    opj_event_mgr_t * p_manager);
219
220
/**
221
 * Write index Finder box
222
 * @param cio     the stream to write to.
223
 * @param   jp2         the jpeg2000 file codec.
224
 * @param   p_manager   user event manager.
225
 */
226
static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
227
                                    opj_stream_private_t *cio,
228
                                    opj_event_mgr_t * p_manager);
229
230
/**
231
 * Write file Index (superbox)
232
 * @param cio     the stream to write to.
233
 * @param   jp2         the jpeg2000 file codec.
234
 * @param   p_manager   user event manager.
235
 */
236
static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
237
                                    opj_stream_private_t *cio,
238
                                    opj_event_mgr_t * p_manager);
239
#endif /* USE_JPIP */
240
241
/**
242
 * Reads a jpeg2000 file signature box.
243
 *
244
 * @param   p_header_data   the data contained in the signature box.
245
 * @param   jp2             the jpeg2000 file codec.
246
 * @param   p_header_size   the size of the data contained in the signature box.
247
 * @param   p_manager       the user event manager.
248
 *
249
 * @return true if the file signature box is valid.
250
 */
251
static OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,
252
                                OPJ_BYTE * p_header_data,
253
                                OPJ_UINT32 p_header_size,
254
                                opj_event_mgr_t * p_manager);
255
256
/**
257
 * Writes a jpeg2000 file signature box.
258
 *
259
 * @param cio the stream to write data to.
260
 * @param   jp2         the jpeg2000 file codec.
261
 * @param p_manager the user event manager.
262
 *
263
 * @return true if writing was successful.
264
 */
265
static OPJ_BOOL opj_jp2_write_jp(opj_jp2_t *jp2,
266
                                 opj_stream_private_t *cio,
267
                                 opj_event_mgr_t * p_manager);
268
269
/**
270
Apply collected palette data
271
@param image Image.
272
@param color Collector for profile, cdef and pclr data.
273
@param p_manager the user event manager.
274
@return true in case of success
275
*/
276
static OPJ_BOOL opj_jp2_apply_pclr(opj_image_t *image,
277
                                   opj_jp2_color_t *color,
278
                                   opj_event_mgr_t * p_manager);
279
280
static void opj_jp2_free_pclr(opj_jp2_color_t *color);
281
282
/**
283
 * Collect palette data
284
 *
285
 * @param jp2 JP2 handle
286
 * @param p_pclr_header_data    FIXME DOC
287
 * @param p_pclr_header_size    FIXME DOC
288
 * @param p_manager
289
 *
290
 * @return Returns true if successful, returns false otherwise
291
*/
292
static OPJ_BOOL opj_jp2_read_pclr(opj_jp2_t *jp2,
293
                                  OPJ_BYTE * p_pclr_header_data,
294
                                  OPJ_UINT32 p_pclr_header_size,
295
                                  opj_event_mgr_t * p_manager);
296
297
/**
298
 * Collect component mapping data
299
 *
300
 * @param jp2                 JP2 handle
301
 * @param p_cmap_header_data  FIXME DOC
302
 * @param p_cmap_header_size  FIXME DOC
303
 * @param p_manager           FIXME DOC
304
 *
305
 * @return Returns true if successful, returns false otherwise
306
*/
307
308
static OPJ_BOOL opj_jp2_read_cmap(opj_jp2_t * jp2,
309
                                  OPJ_BYTE * p_cmap_header_data,
310
                                  OPJ_UINT32 p_cmap_header_size,
311
                                  opj_event_mgr_t * p_manager);
312
313
/**
314
 * Reads the Color Specification box.
315
 *
316
 * @param   p_colr_header_data          pointer to actual data (already read from file)
317
 * @param   jp2                         the jpeg2000 file codec.
318
 * @param   p_colr_header_size          the size of the color header
319
 * @param   p_manager                   the user event manager.
320
 *
321
 * @return  true if the bpc header is valid, false else.
322
*/
323
static OPJ_BOOL opj_jp2_read_colr(opj_jp2_t *jp2,
324
                                  OPJ_BYTE * p_colr_header_data,
325
                                  OPJ_UINT32 p_colr_header_size,
326
                                  opj_event_mgr_t * p_manager);
327
328
/*@}*/
329
330
/*@}*/
331
332
/**
333
 * Sets up the procedures to do on writing header after the codestream.
334
 * Developers wanting to extend the library can add their own writing procedures.
335
 */
336
static OPJ_BOOL opj_jp2_setup_end_header_writing(opj_jp2_t *jp2,
337
        opj_event_mgr_t * p_manager);
338
339
/**
340
 * Sets up the procedures to do on reading header after the codestream.
341
 * Developers wanting to extend the library can add their own writing procedures.
342
 */
343
static OPJ_BOOL opj_jp2_setup_end_header_reading(opj_jp2_t *jp2,
344
        opj_event_mgr_t * p_manager);
345
346
/**
347
 * Reads a jpeg2000 file header structure.
348
 *
349
 * @param jp2 the jpeg2000 file header structure.
350
 * @param stream the stream to read data from.
351
 * @param p_manager the user event manager.
352
 *
353
 * @return true if the box is valid.
354
 */
355
static OPJ_BOOL opj_jp2_read_header_procedure(opj_jp2_t *jp2,
356
        opj_stream_private_t *stream,
357
        opj_event_mgr_t * p_manager);
358
359
/**
360
 * Executes the given procedures on the given codec.
361
 *
362
 * @param   p_procedure_list    the list of procedures to execute
363
 * @param   jp2                 the jpeg2000 file codec to execute the procedures on.
364
 * @param   stream                  the stream to execute the procedures on.
365
 * @param   p_manager           the user manager.
366
 *
367
 * @return  true                if all the procedures were successfully executed.
368
 */
369
static OPJ_BOOL opj_jp2_exec(opj_jp2_t * jp2,
370
                             opj_procedure_list_t * p_procedure_list,
371
                             opj_stream_private_t *stream,
372
                             opj_event_mgr_t * p_manager);
373
374
/**
375
 * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure.
376
 *
377
 * @param   cio                     the input stream to read data from.
378
 * @param   box                     the box structure to fill.
379
 * @param   p_number_bytes_read     pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
380
 * @param   p_manager               user event manager.
381
 *
382
 * @return  true if the box is recognized, false otherwise
383
*/
384
static OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
385
                                    OPJ_UINT32 * p_number_bytes_read,
386
                                    opj_stream_private_t *cio,
387
                                    opj_event_mgr_t * p_manager);
388
389
/**
390
 * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
391
 * are valid. Developers wanting to extend the library can add their own validation procedures.
392
 */
393
static OPJ_BOOL opj_jp2_setup_encoding_validation(opj_jp2_t *jp2,
394
        opj_event_mgr_t * p_manager);
395
396
/**
397
 * Sets up the procedures to do on writing header. Developers wanting to extend the library can add their own writing procedures.
398
 */
399
static OPJ_BOOL opj_jp2_setup_header_writing(opj_jp2_t *jp2,
400
        opj_event_mgr_t * p_manager);
401
402
static OPJ_BOOL opj_jp2_default_validation(opj_jp2_t * jp2,
403
        opj_stream_private_t *cio,
404
        opj_event_mgr_t * p_manager);
405
406
/**
407
 * Finds the image execution function related to the given box id.
408
 *
409
 * @param   p_id    the id of the handler to fetch.
410
 *
411
 * @return  the given handler or NULL if it could not be found.
412
 */
413
static const opj_jp2_header_handler_t * opj_jp2_img_find_handler(
414
    OPJ_UINT32 p_id);
415
416
/**
417
 * Finds the execution function related to the given box id.
418
 *
419
 * @param   p_id    the id of the handler to fetch.
420
 *
421
 * @return  the given handler or NULL if it could not be found.
422
 */
423
static const opj_jp2_header_handler_t * opj_jp2_find_handler(OPJ_UINT32 p_id);
424
425
static const opj_jp2_header_handler_t jp2_header [] = {
426
    {JP2_JP, opj_jp2_read_jp},
427
    {JP2_FTYP, opj_jp2_read_ftyp},
428
    {JP2_JP2H, opj_jp2_read_jp2h}
429
};
430
431
static const opj_jp2_header_handler_t jp2_img_header [] = {
432
    {JP2_IHDR, opj_jp2_read_ihdr},
433
    {JP2_COLR, opj_jp2_read_colr},
434
    {JP2_BPCC, opj_jp2_read_bpcc},
435
    {JP2_PCLR, opj_jp2_read_pclr},
436
    {JP2_CMAP, opj_jp2_read_cmap},
437
    {JP2_CDEF, opj_jp2_read_cdef}
438
439
};
440
441
/**
442
 * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure. Data is read from a character string
443
 *
444
 * @param   box                     the box structure to fill.
445
 * @param   p_data                  the character string to read data from.
446
 * @param   p_number_bytes_read     pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
447
 * @param   p_box_max_size          the maximum number of bytes in the box.
448
 * @param   p_manager         FIXME DOC
449
 *
450
 * @return  true if the box is recognized, false otherwise
451
*/
452
static OPJ_BOOL opj_jp2_read_boxhdr_char(opj_jp2_box_t *box,
453
        OPJ_BYTE * p_data,
454
        OPJ_UINT32 * p_number_bytes_read,
455
        OPJ_UINT32 p_box_max_size,
456
        opj_event_mgr_t * p_manager);
457
458
/**
459
 * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
460
 * are valid. Developers wanting to extend the library can add their own validation procedures.
461
 */
462
static OPJ_BOOL opj_jp2_setup_decoding_validation(opj_jp2_t *jp2,
463
        opj_event_mgr_t * p_manager);
464
465
/**
466
 * Sets up the procedures to do on reading header.
467
 * Developers wanting to extend the library can add their own writing procedures.
468
 */
469
static OPJ_BOOL opj_jp2_setup_header_reading(opj_jp2_t *jp2,
470
        opj_event_mgr_t * p_manager);
471
472
/* ----------------------------------------------------------------------- */
473
static OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
474
                                    OPJ_UINT32 * p_number_bytes_read,
475
                                    opj_stream_private_t *cio,
476
                                    opj_event_mgr_t * p_manager)
477
59.3k
{
478
    /* read header from file */
479
59.3k
    OPJ_BYTE l_data_header [8];
480
481
    /* preconditions */
482
59.3k
    assert(cio != 00);
483
59.3k
    assert(box != 00);
484
59.3k
    assert(p_number_bytes_read != 00);
485
59.3k
    assert(p_manager != 00);
486
487
59.3k
    *p_number_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio, l_data_header, 8,
488
59.3k
                           p_manager);
489
59.3k
    if (*p_number_bytes_read != 8) {
490
0
        return OPJ_FALSE;
491
0
    }
492
493
    /* process read data */
494
59.3k
    opj_read_bytes(l_data_header, &(box->length), 4);
495
59.3k
    opj_read_bytes(l_data_header + 4, &(box->type), 4);
496
497
59.3k
    if (box->length == 0) { /* last box */
498
5.58k
        const OPJ_OFF_T bleft = opj_stream_get_number_byte_left(cio);
499
5.58k
        if (bleft > (OPJ_OFF_T)(0xFFFFFFFFU - 8U)) {
500
0
            opj_event_msg(p_manager, EVT_ERROR,
501
0
                          "Cannot handle box sizes higher than 2^32\n");
502
0
            return OPJ_FALSE;
503
0
        }
504
5.58k
        box->length = (OPJ_UINT32)bleft + 8U;
505
5.58k
        assert((OPJ_OFF_T)box->length == bleft + 8);
506
5.58k
        return OPJ_TRUE;
507
5.58k
    }
508
509
    /* do we have a "special very large box ?" */
510
    /* read then the XLBox */
511
53.7k
    if (box->length == 1) {
512
12
        OPJ_UINT32 l_xl_part_size;
513
514
12
        OPJ_UINT32 l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,
515
12
                                     l_data_header, 8, p_manager);
516
12
        if (l_nb_bytes_read != 8) {
517
0
            if (l_nb_bytes_read > 0) {
518
0
                *p_number_bytes_read += l_nb_bytes_read;
519
0
            }
520
521
0
            return OPJ_FALSE;
522
0
        }
523
524
12
        *p_number_bytes_read = 16;
525
12
        opj_read_bytes(l_data_header, &l_xl_part_size, 4);
526
12
        if (l_xl_part_size != 0) {
527
12
            opj_event_msg(p_manager, EVT_ERROR,
528
12
                          "Cannot handle box sizes higher than 2^32\n");
529
12
            return OPJ_FALSE;
530
12
        }
531
0
        opj_read_bytes(l_data_header + 4, &(box->length), 4);
532
0
    }
533
53.7k
    return OPJ_TRUE;
534
53.7k
}
535
536
#if 0
537
static void jp2_write_url(opj_cio_t *cio, char *Idx_file)
538
{
539
    OPJ_UINT32 i;
540
    opj_jp2_box_t box;
541
542
    box.init_pos = cio_tell(cio);
543
    cio_skip(cio, 4);
544
    cio_write(cio, JP2_URL, 4); /* DBTL */
545
    cio_write(cio, 0, 1);       /* VERS */
546
    cio_write(cio, 0, 3);       /* FLAG */
547
548
    if (Idx_file) {
549
        for (i = 0; i < strlen(Idx_file); i++) {
550
            cio_write(cio, Idx_file[i], 1);
551
        }
552
    }
553
554
    box.length = cio_tell(cio) - box.init_pos;
555
    cio_seek(cio, box.init_pos);
556
    cio_write(cio, box.length, 4);  /* L */
557
    cio_seek(cio, box.init_pos + box.length);
558
}
559
#endif
560
561
static OPJ_BOOL opj_jp2_read_ihdr(opj_jp2_t *jp2,
562
                                  OPJ_BYTE *p_image_header_data,
563
                                  OPJ_UINT32 p_image_header_size,
564
                                  opj_event_mgr_t * p_manager)
565
12.8k
{
566
    /* preconditions */
567
12.8k
    assert(p_image_header_data != 00);
568
12.8k
    assert(jp2 != 00);
569
12.8k
    assert(p_manager != 00);
570
571
12.8k
    if (jp2->comps != NULL) {
572
0
        opj_event_msg(p_manager, EVT_WARNING,
573
0
                      "Ignoring ihdr box. First ihdr box already read\n");
574
0
        return OPJ_TRUE;
575
0
    }
576
577
12.8k
    if (p_image_header_size != 14) {
578
0
        opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
579
0
        return OPJ_FALSE;
580
0
    }
581
582
12.8k
    opj_read_bytes(p_image_header_data, &(jp2->h), 4);          /* HEIGHT */
583
12.8k
    p_image_header_data += 4;
584
12.8k
    opj_read_bytes(p_image_header_data, &(jp2->w), 4);          /* WIDTH */
585
12.8k
    p_image_header_data += 4;
586
12.8k
    opj_read_bytes(p_image_header_data, &(jp2->numcomps), 2);   /* NC */
587
12.8k
    p_image_header_data += 2;
588
589
12.8k
    if (jp2->h < 1 || jp2->w < 1 || jp2->numcomps < 1) {
590
0
        opj_event_msg(p_manager, EVT_ERROR,
591
0
                      "Wrong values for: w(%d) h(%d) numcomps(%d) (ihdr)\n",
592
0
                      jp2->w, jp2->h, jp2->numcomps);
593
0
        return OPJ_FALSE;
594
0
    }
595
12.8k
    if ((jp2->numcomps - 1U) >=
596
12.8k
            16384U) { /* unsigned underflow is well defined: 1U <= jp2->numcomps <= 16384U */
597
0
        opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components (ihdr)\n");
598
0
        return OPJ_FALSE;
599
0
    }
600
601
    /* allocate memory for components */
602
12.8k
    jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps,
603
12.8k
                 sizeof(opj_jp2_comps_t));
604
12.8k
    if (jp2->comps == 0) {
605
0
        opj_event_msg(p_manager, EVT_ERROR,
606
0
                      "Not enough memory to handle image header (ihdr)\n");
607
0
        return OPJ_FALSE;
608
0
    }
609
610
12.8k
    opj_read_bytes(p_image_header_data, &(jp2->bpc), 1);        /* BPC */
611
12.8k
    ++ p_image_header_data;
612
613
12.8k
    opj_read_bytes(p_image_header_data, &(jp2->C), 1);          /* C */
614
12.8k
    ++ p_image_header_data;
615
616
    /* Should be equal to 7 cf. chapter about image header box of the norm */
617
12.8k
    if (jp2->C != 7) {
618
8
        opj_event_msg(p_manager, EVT_INFO,
619
8
                      "JP2 IHDR box: compression type indicate that the file is not a conforming JP2 file (%d) \n",
620
8
                      jp2->C);
621
8
    }
622
623
12.8k
    opj_read_bytes(p_image_header_data, &(jp2->UnkC), 1);       /* UnkC */
624
12.8k
    ++ p_image_header_data;
625
12.8k
    opj_read_bytes(p_image_header_data, &(jp2->IPR), 1);        /* IPR */
626
12.8k
    ++ p_image_header_data;
627
628
12.8k
    jp2->j2k->m_cp.allow_different_bit_depth_sign = (jp2->bpc == 255);
629
12.8k
    jp2->j2k->ihdr_w = jp2->w;
630
12.8k
    jp2->j2k->ihdr_h = jp2->h;
631
12.8k
    jp2->has_ihdr = 1;
632
633
12.8k
    return OPJ_TRUE;
634
12.8k
}
635
636
static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
637
                                     OPJ_UINT32 * p_nb_bytes_written
638
                                    )
639
0
{
640
0
    OPJ_BYTE * l_ihdr_data, * l_current_ihdr_ptr;
641
642
    /* preconditions */
643
0
    assert(jp2 != 00);
644
0
    assert(p_nb_bytes_written != 00);
645
646
    /* default image header is 22 bytes wide */
647
0
    l_ihdr_data = (OPJ_BYTE *) opj_calloc(1, 22);
648
0
    if (l_ihdr_data == 00) {
649
0
        return 00;
650
0
    }
651
652
0
    l_current_ihdr_ptr = l_ihdr_data;
653
654
0
    opj_write_bytes(l_current_ihdr_ptr, 22, 4);             /* write box size */
655
0
    l_current_ihdr_ptr += 4;
656
657
0
    opj_write_bytes(l_current_ihdr_ptr, JP2_IHDR, 4);       /* IHDR */
658
0
    l_current_ihdr_ptr += 4;
659
660
0
    opj_write_bytes(l_current_ihdr_ptr, jp2->h, 4);     /* HEIGHT */
661
0
    l_current_ihdr_ptr += 4;
662
663
0
    opj_write_bytes(l_current_ihdr_ptr, jp2->w, 4);     /* WIDTH */
664
0
    l_current_ihdr_ptr += 4;
665
666
0
    opj_write_bytes(l_current_ihdr_ptr, jp2->numcomps, 2);      /* NC */
667
0
    l_current_ihdr_ptr += 2;
668
669
0
    opj_write_bytes(l_current_ihdr_ptr, jp2->bpc, 1);       /* BPC */
670
0
    ++l_current_ihdr_ptr;
671
672
0
    opj_write_bytes(l_current_ihdr_ptr, jp2->C, 1);     /* C : Always 7 */
673
0
    ++l_current_ihdr_ptr;
674
675
0
    opj_write_bytes(l_current_ihdr_ptr, jp2->UnkC,
676
0
                    1);      /* UnkC, colorspace unknown */
677
0
    ++l_current_ihdr_ptr;
678
679
0
    opj_write_bytes(l_current_ihdr_ptr, jp2->IPR,
680
0
                    1);       /* IPR, no intellectual property */
681
0
    ++l_current_ihdr_ptr;
682
683
0
    *p_nb_bytes_written = 22;
684
685
0
    return l_ihdr_data;
686
0
}
687
688
static OPJ_BYTE * opj_jp2_write_bpcc(opj_jp2_t *jp2,
689
                                     OPJ_UINT32 * p_nb_bytes_written
690
                                    )
691
0
{
692
0
    OPJ_UINT32 i;
693
    /* room for 8 bytes for box and 1 byte for each component */
694
0
    OPJ_UINT32 l_bpcc_size;
695
0
    OPJ_BYTE * l_bpcc_data, * l_current_bpcc_ptr;
696
697
    /* preconditions */
698
0
    assert(jp2 != 00);
699
0
    assert(p_nb_bytes_written != 00);
700
0
    l_bpcc_size = 8 + jp2->numcomps;
701
702
0
    l_bpcc_data = (OPJ_BYTE *) opj_calloc(1, l_bpcc_size);
703
0
    if (l_bpcc_data == 00) {
704
0
        return 00;
705
0
    }
706
707
0
    l_current_bpcc_ptr = l_bpcc_data;
708
709
0
    opj_write_bytes(l_current_bpcc_ptr, l_bpcc_size,
710
0
                    4);            /* write box size */
711
0
    l_current_bpcc_ptr += 4;
712
713
0
    opj_write_bytes(l_current_bpcc_ptr, JP2_BPCC, 4);               /* BPCC */
714
0
    l_current_bpcc_ptr += 4;
715
716
0
    for (i = 0; i < jp2->numcomps; ++i)  {
717
0
        opj_write_bytes(l_current_bpcc_ptr, jp2->comps[i].bpcc,
718
0
                        1); /* write each component information */
719
0
        ++l_current_bpcc_ptr;
720
0
    }
721
722
0
    *p_nb_bytes_written = l_bpcc_size;
723
724
0
    return l_bpcc_data;
725
0
}
726
727
static OPJ_BOOL opj_jp2_read_bpcc(opj_jp2_t *jp2,
728
                                  OPJ_BYTE * p_bpc_header_data,
729
                                  OPJ_UINT32 p_bpc_header_size,
730
                                  opj_event_mgr_t * p_manager
731
                                 )
732
0
{
733
0
    OPJ_UINT32 i;
734
735
    /* preconditions */
736
0
    assert(p_bpc_header_data != 00);
737
0
    assert(jp2 != 00);
738
0
    assert(p_manager != 00);
739
740
741
0
    if (jp2->bpc != 255) {
742
0
        opj_event_msg(p_manager, EVT_WARNING,
743
0
                      "A BPCC header box is available although BPC given by the IHDR box (%d) indicate components bit depth is constant\n",
744
0
                      jp2->bpc);
745
0
    }
746
747
    /* and length is relevant */
748
0
    if (p_bpc_header_size != jp2->numcomps) {
749
0
        opj_event_msg(p_manager, EVT_ERROR, "Bad BPCC header box (bad size)\n");
750
0
        return OPJ_FALSE;
751
0
    }
752
753
    /* read info for each component */
754
0
    for (i = 0; i < jp2->numcomps; ++i) {
755
0
        opj_read_bytes(p_bpc_header_data, &jp2->comps[i].bpcc,
756
0
                       1);  /* read each BPCC component */
757
0
        ++p_bpc_header_data;
758
0
    }
759
760
0
    return OPJ_TRUE;
761
0
}
762
static OPJ_BYTE * opj_jp2_write_cdef(opj_jp2_t *jp2,
763
                                     OPJ_UINT32 * p_nb_bytes_written)
764
0
{
765
    /* room for 8 bytes for box, 2 for n */
766
0
    OPJ_UINT32 l_cdef_size = 10;
767
0
    OPJ_BYTE * l_cdef_data, * l_current_cdef_ptr;
768
0
    OPJ_UINT32 l_value;
769
0
    OPJ_UINT16 i;
770
771
    /* preconditions */
772
0
    assert(jp2 != 00);
773
0
    assert(p_nb_bytes_written != 00);
774
0
    assert(jp2->color.jp2_cdef != 00);
775
0
    assert(jp2->color.jp2_cdef->info != 00);
776
0
    assert(jp2->color.jp2_cdef->n > 0U);
777
778
0
    l_cdef_size += 6U * jp2->color.jp2_cdef->n;
779
780
0
    l_cdef_data = (OPJ_BYTE *) opj_malloc(l_cdef_size);
781
0
    if (l_cdef_data == 00) {
782
0
        return 00;
783
0
    }
784
785
0
    l_current_cdef_ptr = l_cdef_data;
786
787
0
    opj_write_bytes(l_current_cdef_ptr, l_cdef_size, 4);        /* write box size */
788
0
    l_current_cdef_ptr += 4;
789
790
0
    opj_write_bytes(l_current_cdef_ptr, JP2_CDEF, 4);               /* BPCC */
791
0
    l_current_cdef_ptr += 4;
792
793
0
    l_value = jp2->color.jp2_cdef->n;
794
0
    opj_write_bytes(l_current_cdef_ptr, l_value, 2);                /* N */
795
0
    l_current_cdef_ptr += 2;
796
797
0
    for (i = 0U; i < jp2->color.jp2_cdef->n; ++i) {
798
0
        l_value = jp2->color.jp2_cdef->info[i].cn;
799
0
        opj_write_bytes(l_current_cdef_ptr, l_value, 2);                /* Cni */
800
0
        l_current_cdef_ptr += 2;
801
0
        l_value = jp2->color.jp2_cdef->info[i].typ;
802
0
        opj_write_bytes(l_current_cdef_ptr, l_value, 2);                /* Typi */
803
0
        l_current_cdef_ptr += 2;
804
0
        l_value = jp2->color.jp2_cdef->info[i].asoc;
805
0
        opj_write_bytes(l_current_cdef_ptr, l_value, 2);                /* Asoci */
806
0
        l_current_cdef_ptr += 2;
807
0
    }
808
0
    *p_nb_bytes_written = l_cdef_size;
809
810
0
    return l_cdef_data;
811
0
}
812
813
static OPJ_BYTE * opj_jp2_write_colr(opj_jp2_t *jp2,
814
                                     OPJ_UINT32 * p_nb_bytes_written
815
                                    )
816
0
{
817
    /* room for 8 bytes for box 3 for common data and variable upon profile*/
818
0
    OPJ_UINT32 l_colr_size = 11;
819
0
    OPJ_BYTE * l_colr_data, * l_current_colr_ptr;
820
821
    /* preconditions */
822
0
    assert(jp2 != 00);
823
0
    assert(p_nb_bytes_written != 00);
824
0
    assert(jp2->meth == 1 || jp2->meth == 2);
825
826
0
    switch (jp2->meth) {
827
0
    case 1 :
828
0
        l_colr_size += 4; /* EnumCS */
829
0
        break;
830
0
    case 2 :
831
0
        assert(jp2->color.icc_profile_len); /* ICC profile */
832
0
        l_colr_size += jp2->color.icc_profile_len;
833
0
        break;
834
0
    default :
835
0
        return 00;
836
0
    }
837
838
0
    l_colr_data = (OPJ_BYTE *) opj_calloc(1, l_colr_size);
839
0
    if (l_colr_data == 00) {
840
0
        return 00;
841
0
    }
842
843
0
    l_current_colr_ptr = l_colr_data;
844
845
0
    opj_write_bytes(l_current_colr_ptr, l_colr_size,
846
0
                    4);            /* write box size */
847
0
    l_current_colr_ptr += 4;
848
849
0
    opj_write_bytes(l_current_colr_ptr, JP2_COLR, 4);               /* BPCC */
850
0
    l_current_colr_ptr += 4;
851
852
0
    opj_write_bytes(l_current_colr_ptr, jp2->meth, 1);              /* METH */
853
0
    ++l_current_colr_ptr;
854
855
0
    opj_write_bytes(l_current_colr_ptr, jp2->precedence, 1);        /* PRECEDENCE */
856
0
    ++l_current_colr_ptr;
857
858
0
    opj_write_bytes(l_current_colr_ptr, jp2->approx, 1);            /* APPROX */
859
0
    ++l_current_colr_ptr;
860
861
0
    if (jp2->meth ==
862
0
            1) { /* Meth value is restricted to 1 or 2 (Table I.9 of part 1) */
863
0
        opj_write_bytes(l_current_colr_ptr, jp2->enumcs, 4);
864
0
    }       /* EnumCS */
865
0
    else {
866
0
        if (jp2->meth == 2) {                                      /* ICC profile */
867
0
            OPJ_UINT32 i;
868
0
            for (i = 0; i < jp2->color.icc_profile_len; ++i) {
869
0
                opj_write_bytes(l_current_colr_ptr, jp2->color.icc_profile_buf[i], 1);
870
0
                ++l_current_colr_ptr;
871
0
            }
872
0
        }
873
0
    }
874
875
0
    *p_nb_bytes_written = l_colr_size;
876
877
0
    return l_colr_data;
878
0
}
879
880
static void opj_jp2_free_pclr(opj_jp2_color_t *color)
881
0
{
882
0
    opj_free(color->jp2_pclr->channel_sign);
883
0
    opj_free(color->jp2_pclr->channel_size);
884
0
    opj_free(color->jp2_pclr->entries);
885
886
0
    if (color->jp2_pclr->cmap) {
887
0
        opj_free(color->jp2_pclr->cmap);
888
0
    }
889
890
0
    opj_free(color->jp2_pclr);
891
0
    color->jp2_pclr = NULL;
892
0
}
893
894
static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color,
895
                                    opj_event_mgr_t *p_manager)
896
5.03k
{
897
5.03k
    OPJ_UINT16 i;
898
899
    /* testcase 4149.pdf.SIGSEGV.cf7.3501 */
900
5.03k
    if (color->jp2_cdef) {
901
7
        opj_jp2_cdef_info_t *info = color->jp2_cdef->info;
902
7
        OPJ_UINT16 n = color->jp2_cdef->n;
903
7
        OPJ_UINT32 nr_channels =
904
7
            image->numcomps; /* FIXME image->numcomps == jp2->numcomps before color is applied ??? */
905
906
        /* cdef applies to cmap channels if any */
907
7
        if (color->jp2_pclr && color->jp2_pclr->cmap) {
908
0
            nr_channels = (OPJ_UINT32)color->jp2_pclr->nr_channels;
909
0
        }
910
911
21
        for (i = 0; i < n; i++) {
912
14
            if (info[i].cn >= nr_channels) {
913
0
                opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n",
914
0
                              info[i].cn, nr_channels);
915
0
                return OPJ_FALSE;
916
0
            }
917
14
            if (info[i].asoc == 65535U) {
918
0
                continue;
919
0
            }
920
921
14
            if (info[i].asoc > 0 && (OPJ_UINT32)(info[i].asoc - 1) >= nr_channels) {
922
0
                opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n",
923
0
                              info[i].asoc - 1, nr_channels);
924
0
                return OPJ_FALSE;
925
0
            }
926
14
        }
927
928
        /* issue 397 */
929
        /* ISO 15444-1 states that if cdef is present, it shall contain a complete list of channel definitions. */
930
21
        while (nr_channels > 0) {
931
21
            for (i = 0; i < n; ++i) {
932
21
                if ((OPJ_UINT32)info[i].cn == (nr_channels - 1U)) {
933
14
                    break;
934
14
                }
935
21
            }
936
14
            if (i == n) {
937
0
                opj_event_msg(p_manager, EVT_ERROR, "Incomplete channel definitions.\n");
938
0
                return OPJ_FALSE;
939
0
            }
940
14
            --nr_channels;
941
14
        }
942
7
    }
943
944
    /* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and
945
       66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */
946
5.03k
    if (color->jp2_pclr && color->jp2_pclr->cmap) {
947
0
        OPJ_UINT16 nr_channels = color->jp2_pclr->nr_channels;
948
0
        opj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap;
949
0
        OPJ_BOOL *pcol_usage, is_sane = OPJ_TRUE;
950
951
        /* verify that all original components match an existing one */
952
0
        for (i = 0; i < nr_channels; i++) {
953
0
            if (cmap[i].cmp >= image->numcomps) {
954
0
                opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n",
955
0
                              cmap[i].cmp, image->numcomps);
956
0
                is_sane = OPJ_FALSE;
957
0
            }
958
0
        }
959
960
0
        pcol_usage = (OPJ_BOOL *) opj_calloc(nr_channels, sizeof(OPJ_BOOL));
961
0
        if (!pcol_usage) {
962
0
            opj_event_msg(p_manager, EVT_ERROR, "Unexpected OOM.\n");
963
0
            return OPJ_FALSE;
964
0
        }
965
        /* verify that no component is targeted more than once */
966
0
        for (i = 0; i < nr_channels; i++) {
967
0
            OPJ_BYTE mtyp = cmap[i].mtyp;
968
0
            OPJ_BYTE pcol = cmap[i].pcol;
969
            /* See ISO 15444-1 Table I.14 – MTYPi field values */
970
0
            if (mtyp != 0 && mtyp != 1) {
971
0
                opj_event_msg(p_manager, EVT_ERROR,
972
0
                              "Invalid value for cmap[%d].mtyp = %d.\n", i,
973
0
                              mtyp);
974
0
                is_sane = OPJ_FALSE;
975
0
            } else if (pcol >= nr_channels) {
976
0
                opj_event_msg(p_manager, EVT_ERROR,
977
0
                              "Invalid component/palette index for direct mapping %d.\n", pcol);
978
0
                is_sane = OPJ_FALSE;
979
0
            } else if (pcol_usage[pcol] && mtyp == 1) {
980
0
                opj_event_msg(p_manager, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
981
0
                is_sane = OPJ_FALSE;
982
0
            } else if (mtyp == 0 && pcol != 0) {
983
                /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then
984
                 * the value of this field shall be 0. */
985
0
                opj_event_msg(p_manager, EVT_ERROR, "Direct use at #%d however pcol=%d.\n", i,
986
0
                              pcol);
987
0
                is_sane = OPJ_FALSE;
988
0
            } else if (mtyp == 1 && pcol != i) {
989
                /* OpenJPEG implementation limitation. See assert(i == pcol); */
990
                /* in opj_jp2_apply_pclr() */
991
0
                opj_event_msg(p_manager, EVT_ERROR,
992
0
                              "Implementation limitation: for palette mapping, "
993
0
                              "pcol[%d] should be equal to %d, but is equal "
994
0
                              "to %d.\n", i, i, pcol);
995
0
                is_sane = OPJ_FALSE;
996
0
            } else {
997
0
                pcol_usage[pcol] = OPJ_TRUE;
998
0
            }
999
0
        }
1000
        /* verify that all components are targeted at least once */
1001
0
        for (i = 0; i < nr_channels; i++) {
1002
0
            if (!pcol_usage[i] && cmap[i].mtyp != 0) {
1003
0
                opj_event_msg(p_manager, EVT_ERROR, "Component %d doesn't have a mapping.\n",
1004
0
                              i);
1005
0
                is_sane = OPJ_FALSE;
1006
0
            }
1007
0
        }
1008
        /* Issue 235/447 weird cmap */
1009
0
        if (1 && is_sane && (image->numcomps == 1U)) {
1010
0
            for (i = 0; i < nr_channels; i++) {
1011
0
                if (!pcol_usage[i]) {
1012
0
                    is_sane = 0U;
1013
0
                    opj_event_msg(p_manager, EVT_WARNING,
1014
0
                                  "Component mapping seems wrong. Trying to correct.\n");
1015
0
                    break;
1016
0
                }
1017
0
            }
1018
0
            if (!is_sane) {
1019
0
                is_sane = OPJ_TRUE;
1020
0
                for (i = 0; i < nr_channels; i++) {
1021
0
                    cmap[i].mtyp = 1U;
1022
0
                    cmap[i].pcol = (OPJ_BYTE) i;
1023
0
                }
1024
0
            }
1025
0
        }
1026
0
        opj_free(pcol_usage);
1027
0
        if (!is_sane) {
1028
0
            return OPJ_FALSE;
1029
0
        }
1030
0
    }
1031
1032
5.03k
    return OPJ_TRUE;
1033
5.03k
}
1034
1035
/* file9.jp2 */
1036
static OPJ_BOOL opj_jp2_apply_pclr(opj_image_t *image,
1037
                                   opj_jp2_color_t *color,
1038
                                   opj_event_mgr_t * p_manager)
1039
0
{
1040
0
    opj_image_comp_t *old_comps, *new_comps;
1041
0
    OPJ_BYTE *channel_size, *channel_sign;
1042
0
    OPJ_UINT32 *entries;
1043
0
    opj_jp2_cmap_comp_t *cmap;
1044
0
    OPJ_INT32 *src, *dst;
1045
0
    OPJ_UINT32 j, max;
1046
0
    OPJ_UINT16 i, nr_channels, cmp, pcol;
1047
0
    OPJ_INT32 k, top_k;
1048
1049
0
    channel_size = color->jp2_pclr->channel_size;
1050
0
    channel_sign = color->jp2_pclr->channel_sign;
1051
0
    entries = color->jp2_pclr->entries;
1052
0
    cmap = color->jp2_pclr->cmap;
1053
0
    nr_channels = color->jp2_pclr->nr_channels;
1054
1055
0
    for (i = 0; i < nr_channels; ++i) {
1056
        /* Palette mapping: */
1057
0
        cmp = cmap[i].cmp;
1058
0
        if (image->comps[cmp].data == NULL) {
1059
0
            opj_event_msg(p_manager, EVT_ERROR,
1060
0
                          "image->comps[%d].data == NULL in opj_jp2_apply_pclr().\n", i);
1061
0
            return OPJ_FALSE;
1062
0
        }
1063
0
    }
1064
1065
0
    old_comps = image->comps;
1066
0
    new_comps = (opj_image_comp_t*)
1067
0
                opj_malloc(nr_channels * sizeof(opj_image_comp_t));
1068
0
    if (!new_comps) {
1069
0
        opj_event_msg(p_manager, EVT_ERROR,
1070
0
                      "Memory allocation failure in opj_jp2_apply_pclr().\n");
1071
0
        return OPJ_FALSE;
1072
0
    }
1073
0
    for (i = 0; i < nr_channels; ++i) {
1074
0
        pcol = cmap[i].pcol;
1075
0
        cmp = cmap[i].cmp;
1076
1077
        /* Direct use */
1078
0
        if (cmap[i].mtyp == 0) {
1079
0
            assert(pcol == 0);
1080
0
            new_comps[i] = old_comps[cmp];
1081
0
        } else {
1082
0
            assert(i == pcol);
1083
0
            new_comps[pcol] = old_comps[cmp];
1084
0
        }
1085
1086
        /* Palette mapping: */
1087
0
        new_comps[i].data = (OPJ_INT32*)
1088
0
                            opj_image_data_alloc(sizeof(OPJ_INT32) * old_comps[cmp].w * old_comps[cmp].h);
1089
0
        if (!new_comps[i].data) {
1090
0
            while (i > 0) {
1091
0
                -- i;
1092
0
                opj_image_data_free(new_comps[i].data);
1093
0
            }
1094
0
            opj_free(new_comps);
1095
0
            opj_event_msg(p_manager, EVT_ERROR,
1096
0
                          "Memory allocation failure in opj_jp2_apply_pclr().\n");
1097
0
            return OPJ_FALSE;
1098
0
        }
1099
0
        new_comps[i].prec = channel_size[i];
1100
0
        new_comps[i].sgnd = channel_sign[i];
1101
0
    }
1102
1103
0
    top_k = color->jp2_pclr->nr_entries - 1;
1104
1105
0
    for (i = 0; i < nr_channels; ++i) {
1106
        /* Palette mapping: */
1107
0
        cmp = cmap[i].cmp;
1108
0
        pcol = cmap[i].pcol;
1109
0
        src = old_comps[cmp].data;
1110
0
        assert(src); /* verified above */
1111
0
        max = new_comps[i].w * new_comps[i].h;
1112
1113
        /* Direct use: */
1114
0
        if (cmap[i].mtyp == 0) {
1115
0
            dst = new_comps[i].data;
1116
0
            assert(dst);
1117
0
            for (j = 0; j < max; ++j) {
1118
0
                dst[j] = src[j];
1119
0
            }
1120
0
        } else {
1121
0
            assert(i == pcol);
1122
0
            dst = new_comps[pcol].data;
1123
0
            assert(dst);
1124
0
            for (j = 0; j < max; ++j) {
1125
                /* The index */
1126
0
                if ((k = src[j]) < 0) {
1127
0
                    k = 0;
1128
0
                } else if (k > top_k) {
1129
0
                    k = top_k;
1130
0
                }
1131
1132
                /* The colour */
1133
0
                dst[j] = (OPJ_INT32)entries[k * nr_channels + pcol];
1134
0
            }
1135
0
        }
1136
0
    }
1137
1138
0
    max = image->numcomps;
1139
0
    for (j = 0; j < max; ++j) {
1140
0
        if (old_comps[j].data) {
1141
0
            opj_image_data_free(old_comps[j].data);
1142
0
        }
1143
0
    }
1144
1145
0
    opj_free(old_comps);
1146
0
    image->comps = new_comps;
1147
0
    image->numcomps = nr_channels;
1148
1149
0
    return OPJ_TRUE;
1150
0
}/* apply_pclr() */
1151
1152
static OPJ_BOOL opj_jp2_read_pclr(opj_jp2_t *jp2,
1153
                                  OPJ_BYTE * p_pclr_header_data,
1154
                                  OPJ_UINT32 p_pclr_header_size,
1155
                                  opj_event_mgr_t * p_manager
1156
                                 )
1157
11
{
1158
11
    opj_jp2_pclr_t *jp2_pclr;
1159
11
    OPJ_BYTE *channel_size, *channel_sign;
1160
11
    OPJ_UINT32 *entries;
1161
11
    OPJ_UINT16 nr_entries, nr_channels;
1162
11
    OPJ_UINT16 i, j;
1163
11
    OPJ_UINT32 l_value;
1164
11
    OPJ_BYTE *orig_header_data = p_pclr_header_data;
1165
1166
    /* preconditions */
1167
11
    assert(p_pclr_header_data != 00);
1168
11
    assert(jp2 != 00);
1169
11
    assert(p_manager != 00);
1170
11
    (void)p_pclr_header_size;
1171
1172
11
    if (jp2->color.jp2_pclr) {
1173
0
        return OPJ_FALSE;
1174
0
    }
1175
1176
11
    if (p_pclr_header_size < 3) {
1177
0
        return OPJ_FALSE;
1178
0
    }
1179
1180
11
    opj_read_bytes(p_pclr_header_data, &l_value, 2);    /* NE */
1181
11
    p_pclr_header_data += 2;
1182
11
    nr_entries = (OPJ_UINT16) l_value;
1183
11
    if ((nr_entries == 0U) || (nr_entries > 1024U)) {
1184
0
        opj_event_msg(p_manager, EVT_ERROR, "Invalid PCLR box. Reports %d entries\n",
1185
0
                      (int)nr_entries);
1186
0
        return OPJ_FALSE;
1187
0
    }
1188
1189
11
    opj_read_bytes(p_pclr_header_data, &l_value, 1);    /* NPC */
1190
11
    ++p_pclr_header_data;
1191
11
    nr_channels = (OPJ_UINT16) l_value;
1192
11
    if (nr_channels == 0U) {
1193
0
        opj_event_msg(p_manager, EVT_ERROR,
1194
0
                      "Invalid PCLR box. Reports 0 palette columns\n");
1195
0
        return OPJ_FALSE;
1196
0
    }
1197
1198
11
    if (p_pclr_header_size < 3 + (OPJ_UINT32)nr_channels) {
1199
0
        return OPJ_FALSE;
1200
0
    }
1201
1202
11
    entries = (OPJ_UINT32*) opj_malloc(sizeof(OPJ_UINT32) * nr_channels *
1203
11
                                       nr_entries);
1204
11
    if (!entries) {
1205
0
        return OPJ_FALSE;
1206
0
    }
1207
11
    channel_size = (OPJ_BYTE*) opj_malloc(nr_channels);
1208
11
    if (!channel_size) {
1209
0
        opj_free(entries);
1210
0
        return OPJ_FALSE;
1211
0
    }
1212
11
    channel_sign = (OPJ_BYTE*) opj_malloc(nr_channels);
1213
11
    if (!channel_sign) {
1214
0
        opj_free(entries);
1215
0
        opj_free(channel_size);
1216
0
        return OPJ_FALSE;
1217
0
    }
1218
1219
11
    jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
1220
11
    if (!jp2_pclr) {
1221
0
        opj_free(entries);
1222
0
        opj_free(channel_size);
1223
0
        opj_free(channel_sign);
1224
0
        return OPJ_FALSE;
1225
0
    }
1226
1227
11
    jp2_pclr->channel_sign = channel_sign;
1228
11
    jp2_pclr->channel_size = channel_size;
1229
11
    jp2_pclr->entries = entries;
1230
11
    jp2_pclr->nr_entries = nr_entries;
1231
11
    jp2_pclr->nr_channels = (OPJ_BYTE) l_value;
1232
11
    jp2_pclr->cmap = NULL;
1233
1234
11
    jp2->color.jp2_pclr = jp2_pclr;
1235
1236
44
    for (i = 0; i < nr_channels; ++i) {
1237
33
        opj_read_bytes(p_pclr_header_data, &l_value, 1);    /* Bi */
1238
33
        ++p_pclr_header_data;
1239
1240
33
        channel_size[i] = (OPJ_BYTE)((l_value & 0x7f) + 1);
1241
33
        channel_sign[i] = (l_value & 0x80) ? 1 : 0;
1242
33
    }
1243
1244
187
    for (j = 0; j < nr_entries; ++j) {
1245
704
        for (i = 0; i < nr_channels; ++i) {
1246
528
            OPJ_UINT32 bytes_to_read = (OPJ_UINT32)((channel_size[i] + 7) >> 3);
1247
1248
528
            if (bytes_to_read > sizeof(OPJ_UINT32)) {
1249
0
                bytes_to_read = sizeof(OPJ_UINT32);
1250
0
            }
1251
528
            if ((ptrdiff_t)p_pclr_header_size < (ptrdiff_t)(p_pclr_header_data -
1252
528
                    orig_header_data) + (ptrdiff_t)bytes_to_read) {
1253
0
                return OPJ_FALSE;
1254
0
            }
1255
1256
528
            opj_read_bytes(p_pclr_header_data, &l_value, bytes_to_read);    /* Cji */
1257
528
            p_pclr_header_data += bytes_to_read;
1258
528
            *entries = (OPJ_UINT32) l_value;
1259
528
            entries++;
1260
528
        }
1261
176
    }
1262
1263
11
    return OPJ_TRUE;
1264
11
}
1265
1266
static OPJ_BOOL opj_jp2_read_cmap(opj_jp2_t * jp2,
1267
                                  OPJ_BYTE * p_cmap_header_data,
1268
                                  OPJ_UINT32 p_cmap_header_size,
1269
                                  opj_event_mgr_t * p_manager
1270
                                 )
1271
11
{
1272
11
    opj_jp2_cmap_comp_t *cmap;
1273
11
    OPJ_BYTE i, nr_channels;
1274
11
    OPJ_UINT32 l_value;
1275
1276
    /* preconditions */
1277
11
    assert(jp2 != 00);
1278
11
    assert(p_cmap_header_data != 00);
1279
11
    assert(p_manager != 00);
1280
11
    (void)p_cmap_header_size;
1281
1282
    /* Need nr_channels: */
1283
11
    if (jp2->color.jp2_pclr == NULL) {
1284
0
        opj_event_msg(p_manager, EVT_ERROR,
1285
0
                      "Need to read a PCLR box before the CMAP box.\n");
1286
0
        return OPJ_FALSE;
1287
0
    }
1288
1289
    /* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
1290
     * inside a JP2 Header box' :
1291
    */
1292
11
    if (jp2->color.jp2_pclr->cmap) {
1293
0
        opj_event_msg(p_manager, EVT_ERROR, "Only one CMAP box is allowed.\n");
1294
0
        return OPJ_FALSE;
1295
0
    }
1296
1297
11
    nr_channels = jp2->color.jp2_pclr->nr_channels;
1298
11
    if (p_cmap_header_size < (OPJ_UINT32)nr_channels * 4) {
1299
0
        opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CMAP box.\n");
1300
0
        return OPJ_FALSE;
1301
0
    }
1302
1303
11
    cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(
1304
11
                opj_jp2_cmap_comp_t));
1305
11
    if (!cmap) {
1306
0
        return OPJ_FALSE;
1307
0
    }
1308
1309
1310
44
    for (i = 0; i < nr_channels; ++i) {
1311
33
        opj_read_bytes(p_cmap_header_data, &l_value, 2);            /* CMP^i */
1312
33
        p_cmap_header_data += 2;
1313
33
        cmap[i].cmp = (OPJ_UINT16) l_value;
1314
1315
33
        opj_read_bytes(p_cmap_header_data, &l_value, 1);            /* MTYP^i */
1316
33
        ++p_cmap_header_data;
1317
33
        cmap[i].mtyp = (OPJ_BYTE) l_value;
1318
1319
33
        opj_read_bytes(p_cmap_header_data, &l_value, 1);            /* PCOL^i */
1320
33
        ++p_cmap_header_data;
1321
33
        cmap[i].pcol = (OPJ_BYTE) l_value;
1322
33
    }
1323
1324
11
    jp2->color.jp2_pclr->cmap = cmap;
1325
1326
11
    return OPJ_TRUE;
1327
11
}
1328
1329
static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color,
1330
                               opj_event_mgr_t *manager)
1331
7
{
1332
7
    opj_jp2_cdef_info_t *info;
1333
7
    OPJ_UINT16 i, n, cn, asoc, acn;
1334
1335
7
    info = color->jp2_cdef->info;
1336
7
    n = color->jp2_cdef->n;
1337
1338
21
    for (i = 0; i < n; ++i) {
1339
        /* WATCH: acn = asoc - 1 ! */
1340
14
        asoc = info[i].asoc;
1341
14
        cn = info[i].cn;
1342
1343
14
        if (cn >= image->numcomps) {
1344
0
            opj_event_msg(manager, EVT_WARNING, "opj_jp2_apply_cdef: cn=%d, numcomps=%d\n",
1345
0
                          cn, image->numcomps);
1346
0
            continue;
1347
0
        }
1348
14
        if (asoc == 0 || asoc == 65535) {
1349
7
            image->comps[cn].alpha = info[i].typ;
1350
7
            continue;
1351
7
        }
1352
1353
7
        acn = (OPJ_UINT16)(asoc - 1);
1354
7
        if (acn >= image->numcomps) {
1355
0
            opj_event_msg(manager, EVT_WARNING, "opj_jp2_apply_cdef: acn=%d, numcomps=%d\n",
1356
0
                          acn, image->numcomps);
1357
0
            continue;
1358
0
        }
1359
1360
        /* Swap only if color channel */
1361
7
        if ((cn != acn) && (info[i].typ == 0)) {
1362
0
            opj_image_comp_t saved;
1363
0
            OPJ_UINT16 j;
1364
1365
0
            memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
1366
0
            memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
1367
0
            memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
1368
1369
            /* Swap channels in following channel definitions, don't bother with j <= i that are already processed */
1370
0
            for (j = (OPJ_UINT16)(i + 1U); j < n ; ++j) {
1371
0
                if (info[j].cn == cn) {
1372
0
                    info[j].cn = acn;
1373
0
                } else if (info[j].cn == acn) {
1374
0
                    info[j].cn = cn;
1375
0
                }
1376
                /* asoc is related to color index. Do not update. */
1377
0
            }
1378
0
        }
1379
1380
7
        image->comps[cn].alpha = info[i].typ;
1381
7
    }
1382
1383
7
    if (color->jp2_cdef->info) {
1384
7
        opj_free(color->jp2_cdef->info);
1385
7
    }
1386
1387
7
    opj_free(color->jp2_cdef);
1388
7
    color->jp2_cdef = NULL;
1389
1390
7
}/* jp2_apply_cdef() */
1391
1392
static OPJ_BOOL opj_jp2_read_cdef(opj_jp2_t * jp2,
1393
                                  OPJ_BYTE * p_cdef_header_data,
1394
                                  OPJ_UINT32 p_cdef_header_size,
1395
                                  opj_event_mgr_t * p_manager
1396
                                 )
1397
10
{
1398
10
    opj_jp2_cdef_info_t *cdef_info;
1399
10
    OPJ_UINT16 i;
1400
10
    OPJ_UINT32 l_value;
1401
1402
    /* preconditions */
1403
10
    assert(jp2 != 00);
1404
10
    assert(p_cdef_header_data != 00);
1405
10
    assert(p_manager != 00);
1406
10
    (void)p_cdef_header_size;
1407
1408
    /* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
1409
     * inside a JP2 Header box.'*/
1410
10
    if (jp2->color.jp2_cdef) {
1411
0
        return OPJ_FALSE;
1412
0
    }
1413
1414
10
    if (p_cdef_header_size < 2) {
1415
0
        opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
1416
0
        return OPJ_FALSE;
1417
0
    }
1418
1419
10
    opj_read_bytes(p_cdef_header_data, &l_value, 2);        /* N */
1420
10
    p_cdef_header_data += 2;
1421
1422
10
    if ((OPJ_UINT16)l_value == 0) { /* szukw000: FIXME */
1423
0
        opj_event_msg(p_manager, EVT_ERROR,
1424
0
                      "Number of channel description is equal to zero in CDEF box.\n");
1425
0
        return OPJ_FALSE;
1426
0
    }
1427
1428
10
    if (p_cdef_header_size < 2 + (OPJ_UINT32)(OPJ_UINT16)l_value * 6) {
1429
0
        opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
1430
0
        return OPJ_FALSE;
1431
0
    }
1432
1433
10
    cdef_info = (opj_jp2_cdef_info_t*) opj_malloc(l_value * sizeof(
1434
10
                    opj_jp2_cdef_info_t));
1435
10
    if (!cdef_info) {
1436
0
        return OPJ_FALSE;
1437
0
    }
1438
1439
10
    jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
1440
10
    if (!jp2->color.jp2_cdef) {
1441
0
        opj_free(cdef_info);
1442
0
        return OPJ_FALSE;
1443
0
    }
1444
10
    jp2->color.jp2_cdef->info = cdef_info;
1445
10
    jp2->color.jp2_cdef->n = (OPJ_UINT16) l_value;
1446
1447
30
    for (i = 0; i < jp2->color.jp2_cdef->n; ++i) {
1448
20
        opj_read_bytes(p_cdef_header_data, &l_value, 2);            /* Cn^i */
1449
20
        p_cdef_header_data += 2;
1450
20
        cdef_info[i].cn = (OPJ_UINT16) l_value;
1451
1452
20
        opj_read_bytes(p_cdef_header_data, &l_value, 2);            /* Typ^i */
1453
20
        p_cdef_header_data += 2;
1454
20
        cdef_info[i].typ = (OPJ_UINT16) l_value;
1455
1456
20
        opj_read_bytes(p_cdef_header_data, &l_value, 2);            /* Asoc^i */
1457
20
        p_cdef_header_data += 2;
1458
20
        cdef_info[i].asoc = (OPJ_UINT16) l_value;
1459
20
    }
1460
1461
10
    return OPJ_TRUE;
1462
10
}
1463
1464
static OPJ_BOOL opj_jp2_read_colr(opj_jp2_t *jp2,
1465
                                  OPJ_BYTE * p_colr_header_data,
1466
                                  OPJ_UINT32 p_colr_header_size,
1467
                                  opj_event_mgr_t * p_manager
1468
                                 )
1469
12.8k
{
1470
12.8k
    OPJ_UINT32 l_value;
1471
1472
    /* preconditions */
1473
12.8k
    assert(jp2 != 00);
1474
12.8k
    assert(p_colr_header_data != 00);
1475
12.8k
    assert(p_manager != 00);
1476
1477
12.8k
    if (p_colr_header_size < 3) {
1478
0
        opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size)\n");
1479
0
        return OPJ_FALSE;
1480
0
    }
1481
1482
    /* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
1483
     * Specification boxes after the first.'
1484
    */
1485
12.8k
    if (jp2->color.jp2_has_colr) {
1486
0
        opj_event_msg(p_manager, EVT_INFO,
1487
0
                      "A conforming JP2 reader shall ignore all Colour Specification boxes after the first, so we ignore this one.\n");
1488
0
        p_colr_header_data += p_colr_header_size;
1489
0
        return OPJ_TRUE;
1490
0
    }
1491
1492
12.8k
    opj_read_bytes(p_colr_header_data, &jp2->meth, 1);          /* METH */
1493
12.8k
    ++p_colr_header_data;
1494
1495
12.8k
    opj_read_bytes(p_colr_header_data, &jp2->precedence, 1);    /* PRECEDENCE */
1496
12.8k
    ++p_colr_header_data;
1497
1498
12.8k
    opj_read_bytes(p_colr_header_data, &jp2->approx, 1);        /* APPROX */
1499
12.8k
    ++p_colr_header_data;
1500
1501
12.8k
    if (jp2->meth == 1) {
1502
12.8k
        if (p_colr_header_size < 7) {
1503
0
            opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size: %d)\n",
1504
0
                          p_colr_header_size);
1505
0
            return OPJ_FALSE;
1506
0
        }
1507
12.8k
        if ((p_colr_header_size > 7) &&
1508
12.8k
                (jp2->enumcs != 14)) { /* handled below for CIELab) */
1509
            /* testcase Altona_Technical_v20_x4.pdf */
1510
0
            opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (bad size: %d)\n",
1511
0
                          p_colr_header_size);
1512
0
        }
1513
1514
12.8k
        opj_read_bytes(p_colr_header_data, &jp2->enumcs, 4);        /* EnumCS */
1515
1516
12.8k
        p_colr_header_data += 4;
1517
1518
12.8k
        if (jp2->enumcs == 14) { /* CIELab */
1519
0
            OPJ_UINT32 *cielab;
1520
0
            OPJ_UINT32 rl, ol, ra, oa, rb, ob, il;
1521
1522
0
            cielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32));
1523
0
            if (cielab == NULL) {
1524
0
                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for cielab\n");
1525
0
                return OPJ_FALSE;
1526
0
            }
1527
0
            cielab[0] = 14; /* enumcs */
1528
1529
            /* default values */
1530
0
            rl = ra = rb = ol = oa = ob = 0;
1531
0
            il = 0x00443530; /* D50 */
1532
0
            cielab[1] = 0x44454600;/* DEF */
1533
1534
0
            if (p_colr_header_size == 35) {
1535
0
                opj_read_bytes(p_colr_header_data, &rl, 4);
1536
0
                p_colr_header_data += 4;
1537
0
                opj_read_bytes(p_colr_header_data, &ol, 4);
1538
0
                p_colr_header_data += 4;
1539
0
                opj_read_bytes(p_colr_header_data, &ra, 4);
1540
0
                p_colr_header_data += 4;
1541
0
                opj_read_bytes(p_colr_header_data, &oa, 4);
1542
0
                p_colr_header_data += 4;
1543
0
                opj_read_bytes(p_colr_header_data, &rb, 4);
1544
0
                p_colr_header_data += 4;
1545
0
                opj_read_bytes(p_colr_header_data, &ob, 4);
1546
0
                p_colr_header_data += 4;
1547
0
                opj_read_bytes(p_colr_header_data, &il, 4);
1548
0
                p_colr_header_data += 4;
1549
1550
0
                cielab[1] = 0;
1551
0
            } else if (p_colr_header_size != 7) {
1552
0
                opj_event_msg(p_manager, EVT_WARNING,
1553
0
                              "Bad COLR header box (CIELab, bad size: %d)\n", p_colr_header_size);
1554
0
            }
1555
0
            cielab[2] = rl;
1556
0
            cielab[4] = ra;
1557
0
            cielab[6] = rb;
1558
0
            cielab[3] = ol;
1559
0
            cielab[5] = oa;
1560
0
            cielab[7] = ob;
1561
0
            cielab[8] = il;
1562
1563
0
            jp2->color.icc_profile_buf = (OPJ_BYTE*)cielab;
1564
0
            jp2->color.icc_profile_len = 0;
1565
0
        }
1566
12.8k
        jp2->color.jp2_has_colr = 1;
1567
12.8k
    } else if (jp2->meth == 2) {
1568
        /* ICC profile */
1569
0
        OPJ_INT32 it_icc_value = 0;
1570
0
        OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;
1571
1572
0
        jp2->color.icc_profile_len = (OPJ_UINT32)icc_len;
1573
0
        jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_calloc(1, (size_t)icc_len);
1574
0
        if (!jp2->color.icc_profile_buf) {
1575
0
            jp2->color.icc_profile_len = 0;
1576
0
            return OPJ_FALSE;
1577
0
        }
1578
1579
0
        for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value) {
1580
0
            opj_read_bytes(p_colr_header_data, &l_value, 1);    /* icc values */
1581
0
            ++p_colr_header_data;
1582
0
            jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_value;
1583
0
        }
1584
1585
0
        jp2->color.jp2_has_colr = 1;
1586
0
    } else if (jp2->meth > 2) {
1587
        /*  ISO/IEC 15444-1:2004 (E), Table I.9 Legal METH values:
1588
        conforming JP2 reader shall ignore the entire Colour Specification box.*/
1589
0
        opj_event_msg(p_manager, EVT_INFO,
1590
0
                      "COLR BOX meth value is not a regular value (%d), "
1591
0
                      "so we will ignore the entire Colour Specification box. \n", jp2->meth);
1592
0
    }
1593
1594
12.8k
    return OPJ_TRUE;
1595
12.8k
}
1596
1597
static OPJ_BOOL opj_jp2_apply_color_postprocessing(opj_jp2_t *jp2,
1598
        opj_image_t* p_image,
1599
        opj_event_mgr_t * p_manager)
1600
5.03k
{
1601
5.03k
    if (jp2->j2k->m_specific_param.m_decoder.m_numcomps_to_decode) {
1602
        /* Bypass all JP2 component transforms */
1603
0
        return OPJ_TRUE;
1604
0
    }
1605
1606
5.03k
    if (!jp2->ignore_pclr_cmap_cdef) {
1607
5.03k
        if (!opj_jp2_check_color(p_image, &(jp2->color), p_manager)) {
1608
0
            return OPJ_FALSE;
1609
0
        }
1610
1611
5.03k
        if (jp2->color.jp2_pclr) {
1612
            /* Part 1, I.5.3.4: Either both or none : */
1613
0
            if (!jp2->color.jp2_pclr->cmap) {
1614
0
                opj_jp2_free_pclr(&(jp2->color));
1615
0
            } else {
1616
0
                if (!opj_jp2_apply_pclr(p_image, &(jp2->color), p_manager)) {
1617
0
                    return OPJ_FALSE;
1618
0
                }
1619
0
            }
1620
0
        }
1621
1622
        /* Apply the color space if needed */
1623
5.03k
        if (jp2->color.jp2_cdef) {
1624
7
            opj_jp2_apply_cdef(p_image, &(jp2->color), p_manager);
1625
7
        }
1626
5.03k
    }
1627
1628
5.03k
    return OPJ_TRUE;
1629
5.03k
}
1630
1631
OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
1632
                        opj_stream_private_t *p_stream,
1633
                        opj_image_t* p_image,
1634
                        opj_event_mgr_t * p_manager)
1635
12.4k
{
1636
12.4k
    if (!p_image) {
1637
0
        return OPJ_FALSE;
1638
0
    }
1639
1640
    /* J2K decoding */
1641
12.4k
    if (! opj_j2k_decode(jp2->j2k, p_stream, p_image, p_manager)) {
1642
7.45k
        opj_event_msg(p_manager, EVT_ERROR,
1643
7.45k
                      "Failed to decode the codestream in the JP2 file\n");
1644
7.45k
        return OPJ_FALSE;
1645
7.45k
    }
1646
1647
5.03k
    return opj_jp2_apply_color_postprocessing(jp2, p_image, p_manager);
1648
12.4k
}
1649
1650
static OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
1651
                                   opj_stream_private_t *stream,
1652
                                   opj_event_mgr_t * p_manager
1653
                                  )
1654
0
{
1655
0
    opj_jp2_img_header_writer_handler_t l_writers [4];
1656
0
    opj_jp2_img_header_writer_handler_t * l_current_writer;
1657
1658
0
    OPJ_INT32 i, l_nb_pass;
1659
    /* size of data for super box*/
1660
0
    OPJ_UINT32 l_jp2h_size = 8;
1661
0
    OPJ_BOOL l_result = OPJ_TRUE;
1662
1663
    /* to store the data of the super box */
1664
0
    OPJ_BYTE l_jp2h_data [8];
1665
1666
    /* preconditions */
1667
0
    assert(stream != 00);
1668
0
    assert(jp2 != 00);
1669
0
    assert(p_manager != 00);
1670
1671
0
    memset(l_writers, 0, sizeof(l_writers));
1672
1673
0
    if (jp2->bpc == 255) {
1674
0
        l_nb_pass = 3;
1675
0
        l_writers[0].handler = opj_jp2_write_ihdr;
1676
0
        l_writers[1].handler = opj_jp2_write_bpcc;
1677
0
        l_writers[2].handler = opj_jp2_write_colr;
1678
0
    } else {
1679
0
        l_nb_pass = 2;
1680
0
        l_writers[0].handler = opj_jp2_write_ihdr;
1681
0
        l_writers[1].handler = opj_jp2_write_colr;
1682
0
    }
1683
1684
0
    if (jp2->color.jp2_cdef != NULL) {
1685
0
        l_writers[l_nb_pass].handler = opj_jp2_write_cdef;
1686
0
        l_nb_pass++;
1687
0
    }
1688
1689
    /* write box header */
1690
    /* write JP2H type */
1691
0
    opj_write_bytes(l_jp2h_data + 4, JP2_JP2H, 4);
1692
1693
0
    l_current_writer = l_writers;
1694
0
    for (i = 0; i < l_nb_pass; ++i) {
1695
0
        l_current_writer->m_data = l_current_writer->handler(jp2,
1696
0
                                   &(l_current_writer->m_size));
1697
0
        if (l_current_writer->m_data == 00) {
1698
0
            opj_event_msg(p_manager, EVT_ERROR,
1699
0
                          "Not enough memory to hold JP2 Header data\n");
1700
0
            l_result = OPJ_FALSE;
1701
0
            break;
1702
0
        }
1703
1704
0
        l_jp2h_size += l_current_writer->m_size;
1705
0
        ++l_current_writer;
1706
0
    }
1707
1708
0
    if (! l_result) {
1709
0
        l_current_writer = l_writers;
1710
0
        for (i = 0; i < l_nb_pass; ++i) {
1711
0
            if (l_current_writer->m_data != 00) {
1712
0
                opj_free(l_current_writer->m_data);
1713
0
            }
1714
0
            ++l_current_writer;
1715
0
        }
1716
1717
0
        return OPJ_FALSE;
1718
0
    }
1719
1720
    /* write super box size */
1721
0
    opj_write_bytes(l_jp2h_data, l_jp2h_size, 4);
1722
1723
    /* write super box data on stream */
1724
0
    if (opj_stream_write_data(stream, l_jp2h_data, 8, p_manager) != 8) {
1725
0
        opj_event_msg(p_manager, EVT_ERROR,
1726
0
                      "Stream error while writing JP2 Header box\n");
1727
0
        l_result = OPJ_FALSE;
1728
0
    }
1729
1730
0
    if (l_result) {
1731
0
        l_current_writer = l_writers;
1732
0
        for (i = 0; i < l_nb_pass; ++i) {
1733
0
            if (opj_stream_write_data(stream, l_current_writer->m_data,
1734
0
                                      l_current_writer->m_size, p_manager) != l_current_writer->m_size) {
1735
0
                opj_event_msg(p_manager, EVT_ERROR,
1736
0
                              "Stream error while writing JP2 Header box\n");
1737
0
                l_result = OPJ_FALSE;
1738
0
                break;
1739
0
            }
1740
0
            ++l_current_writer;
1741
0
        }
1742
0
    }
1743
1744
0
    l_current_writer = l_writers;
1745
1746
    /* cleanup */
1747
0
    for (i = 0; i < l_nb_pass; ++i) {
1748
0
        if (l_current_writer->m_data != 00) {
1749
0
            opj_free(l_current_writer->m_data);
1750
0
        }
1751
0
        ++l_current_writer;
1752
0
    }
1753
1754
0
    return l_result;
1755
0
}
1756
1757
static OPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,
1758
                                   opj_stream_private_t *cio,
1759
                                   opj_event_mgr_t * p_manager)
1760
0
{
1761
0
    OPJ_UINT32 i;
1762
0
    OPJ_UINT32 l_ftyp_size;
1763
0
    OPJ_BYTE * l_ftyp_data, * l_current_data_ptr;
1764
0
    OPJ_BOOL l_result;
1765
1766
    /* preconditions */
1767
0
    assert(cio != 00);
1768
0
    assert(jp2 != 00);
1769
0
    assert(p_manager != 00);
1770
0
    l_ftyp_size = 16 + 4 * jp2->numcl;
1771
1772
0
    l_ftyp_data = (OPJ_BYTE *) opj_calloc(1, l_ftyp_size);
1773
1774
0
    if (l_ftyp_data == 00) {
1775
0
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
1776
0
        return OPJ_FALSE;
1777
0
    }
1778
1779
0
    l_current_data_ptr = l_ftyp_data;
1780
1781
0
    opj_write_bytes(l_current_data_ptr, l_ftyp_size, 4); /* box size */
1782
0
    l_current_data_ptr += 4;
1783
1784
0
    opj_write_bytes(l_current_data_ptr, JP2_FTYP, 4); /* FTYP */
1785
0
    l_current_data_ptr += 4;
1786
1787
0
    opj_write_bytes(l_current_data_ptr, jp2->brand, 4); /* BR */
1788
0
    l_current_data_ptr += 4;
1789
1790
0
    opj_write_bytes(l_current_data_ptr, jp2->minversion, 4); /* MinV */
1791
0
    l_current_data_ptr += 4;
1792
1793
0
    for (i = 0; i < jp2->numcl; i++)  {
1794
0
        opj_write_bytes(l_current_data_ptr, jp2->cl[i], 4); /* CL */
1795
0
    }
1796
1797
0
    l_result = (opj_stream_write_data(cio, l_ftyp_data, l_ftyp_size,
1798
0
                                      p_manager) == l_ftyp_size);
1799
0
    if (! l_result) {
1800
0
        opj_event_msg(p_manager, EVT_ERROR,
1801
0
                      "Error while writing ftyp data to stream\n");
1802
0
    }
1803
1804
0
    opj_free(l_ftyp_data);
1805
1806
0
    return l_result;
1807
0
}
1808
1809
static OPJ_BOOL opj_jp2_write_jp2c(opj_jp2_t *jp2,
1810
                                   opj_stream_private_t *cio,
1811
                                   opj_event_mgr_t * p_manager)
1812
0
{
1813
0
    OPJ_OFF_T j2k_codestream_exit;
1814
0
    OPJ_BYTE l_data_header [8];
1815
1816
    /* preconditions */
1817
0
    assert(jp2 != 00);
1818
0
    assert(cio != 00);
1819
0
    assert(p_manager != 00);
1820
0
    assert(opj_stream_has_seek(cio));
1821
1822
0
    j2k_codestream_exit = opj_stream_tell(cio);
1823
0
    opj_write_bytes(l_data_header,
1824
0
                    (OPJ_UINT32)(j2k_codestream_exit - jp2->j2k_codestream_offset),
1825
0
                    4); /* size of codestream */
1826
0
    opj_write_bytes(l_data_header + 4, JP2_JP2C,
1827
0
                    4);                                     /* JP2C */
1828
1829
0
    if (! opj_stream_seek(cio, jp2->j2k_codestream_offset, p_manager)) {
1830
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
1831
0
        return OPJ_FALSE;
1832
0
    }
1833
1834
0
    if (opj_stream_write_data(cio, l_data_header, 8, p_manager) != 8) {
1835
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
1836
0
        return OPJ_FALSE;
1837
0
    }
1838
1839
0
    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
1840
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
1841
0
        return OPJ_FALSE;
1842
0
    }
1843
1844
0
    return OPJ_TRUE;
1845
0
}
1846
1847
static OPJ_BOOL opj_jp2_write_jp(opj_jp2_t *jp2,
1848
                                 opj_stream_private_t *cio,
1849
                                 opj_event_mgr_t * p_manager)
1850
0
{
1851
    /* 12 bytes will be read */
1852
0
    OPJ_BYTE l_signature_data [12];
1853
1854
    /* preconditions */
1855
0
    assert(cio != 00);
1856
0
    assert(jp2 != 00);
1857
0
    assert(p_manager != 00);
1858
1859
0
    OPJ_UNUSED(jp2);
1860
1861
    /* write box length */
1862
0
    opj_write_bytes(l_signature_data, 12, 4);
1863
    /* writes box type */
1864
0
    opj_write_bytes(l_signature_data + 4, JP2_JP, 4);
1865
    /* writes magic number*/
1866
0
    opj_write_bytes(l_signature_data + 8, 0x0d0a870a, 4);
1867
1868
0
    if (opj_stream_write_data(cio, l_signature_data, 12, p_manager) != 12) {
1869
0
        return OPJ_FALSE;
1870
0
    }
1871
1872
0
    return OPJ_TRUE;
1873
0
}
1874
1875
/* ----------------------------------------------------------------------- */
1876
/* JP2 decoder interface                                             */
1877
/* ----------------------------------------------------------------------- */
1878
1879
void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
1880
13.3k
{
1881
    /* setup the J2K codec */
1882
13.3k
    opj_j2k_setup_decoder(jp2->j2k, parameters);
1883
1884
    /* further JP2 initializations go here */
1885
13.3k
    jp2->color.jp2_has_colr = 0;
1886
13.3k
    jp2->ignore_pclr_cmap_cdef = parameters->flags &
1887
13.3k
                                 OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
1888
13.3k
}
1889
1890
void opj_jp2_decoder_set_strict_mode(opj_jp2_t *jp2, OPJ_BOOL strict)
1891
0
{
1892
0
    opj_j2k_decoder_set_strict_mode(jp2->j2k, strict);
1893
0
}
1894
1895
OPJ_BOOL opj_jp2_set_threads(opj_jp2_t *jp2, OPJ_UINT32 num_threads)
1896
0
{
1897
0
    return opj_j2k_set_threads(jp2->j2k, num_threads);
1898
0
}
1899
1900
/* ----------------------------------------------------------------------- */
1901
/* JP2 encoder interface                                             */
1902
/* ----------------------------------------------------------------------- */
1903
1904
OPJ_BOOL opj_jp2_setup_encoder(opj_jp2_t *jp2,
1905
                               opj_cparameters_t *parameters,
1906
                               opj_image_t *image,
1907
                               opj_event_mgr_t * p_manager)
1908
0
{
1909
0
    OPJ_UINT32 i;
1910
0
    OPJ_UINT32 depth_0;
1911
0
    OPJ_UINT32 sign;
1912
0
    OPJ_UINT32 alpha_count;
1913
0
    OPJ_UINT32 color_channels = 0U;
1914
0
    OPJ_UINT32 alpha_channel = 0U;
1915
1916
1917
0
    if (!jp2 || !parameters || !image) {
1918
0
        return OPJ_FALSE;
1919
0
    }
1920
1921
    /* setup the J2K codec */
1922
    /* ------------------- */
1923
1924
    /* Check if number of components respects standard */
1925
0
    if (image->numcomps < 1 || image->numcomps > 16384) {
1926
0
        opj_event_msg(p_manager, EVT_ERROR,
1927
0
                      "Invalid number of components specified while setting up JP2 encoder\n");
1928
0
        return OPJ_FALSE;
1929
0
    }
1930
1931
0
    if (opj_j2k_setup_encoder(jp2->j2k, parameters, image,
1932
0
                              p_manager) == OPJ_FALSE) {
1933
0
        return OPJ_FALSE;
1934
0
    }
1935
1936
    /* setup the JP2 codec */
1937
    /* ------------------- */
1938
1939
    /* Profile box */
1940
1941
0
    jp2->brand = JP2_JP2;   /* BR */
1942
0
    jp2->minversion = 0;    /* MinV */
1943
0
    jp2->numcl = 1;
1944
0
    jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
1945
0
    if (!jp2->cl) {
1946
0
        opj_event_msg(p_manager, EVT_ERROR,
1947
0
                      "Not enough memory when setup the JP2 encoder\n");
1948
0
        return OPJ_FALSE;
1949
0
    }
1950
0
    jp2->cl[0] = JP2_JP2;   /* CL0 : JP2 */
1951
1952
    /* Image Header box */
1953
1954
0
    jp2->numcomps = image->numcomps;    /* NC */
1955
0
    jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(
1956
0
                     opj_jp2_comps_t));
1957
0
    if (!jp2->comps) {
1958
0
        opj_event_msg(p_manager, EVT_ERROR,
1959
0
                      "Not enough memory when setup the JP2 encoder\n");
1960
        /* Memory of jp2->cl will be freed by opj_jp2_destroy */
1961
0
        return OPJ_FALSE;
1962
0
    }
1963
1964
0
    jp2->h = image->y1 - image->y0;     /* HEIGHT */
1965
0
    jp2->w = image->x1 - image->x0;     /* WIDTH */
1966
    /* BPC */
1967
0
    depth_0 = image->comps[0].prec - 1;
1968
0
    sign = image->comps[0].sgnd;
1969
0
    jp2->bpc = depth_0 + (sign << 7);
1970
0
    for (i = 1; i < image->numcomps; i++) {
1971
0
        OPJ_UINT32 depth = image->comps[i].prec - 1;
1972
0
        sign = image->comps[i].sgnd;
1973
0
        if (depth_0 != depth) {
1974
0
            jp2->bpc = 255;
1975
0
        }
1976
0
    }
1977
0
    jp2->C = 7;         /* C : Always 7 */
1978
0
    jp2->UnkC = 0;      /* UnkC, colorspace specified in colr box */
1979
0
    jp2->IPR = 0;       /* IPR, no intellectual property */
1980
1981
    /* BitsPerComponent box */
1982
0
    for (i = 0; i < image->numcomps; i++) {
1983
0
        jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
1984
0
    }
1985
1986
    /* Colour Specification box */
1987
0
    if (image->icc_profile_len) {
1988
0
        jp2->meth = 2;
1989
0
        jp2->enumcs = 0;
1990
0
    } else {
1991
0
        jp2->meth = 1;
1992
0
        if (image->color_space == 1) {
1993
0
            jp2->enumcs = 16;    /* sRGB as defined by IEC 61966-2-1 */
1994
0
        } else if (image->color_space == 2) {
1995
0
            jp2->enumcs = 17;    /* greyscale */
1996
0
        } else if (image->color_space == 3) {
1997
0
            jp2->enumcs = 18;    /* YUV */
1998
0
        }
1999
0
    }
2000
2001
    /* Channel Definition box */
2002
    /* FIXME not provided by parameters */
2003
    /* We try to do what we can... */
2004
0
    alpha_count = 0U;
2005
0
    for (i = 0; i < image->numcomps; i++) {
2006
0
        if (image->comps[i].alpha != 0) {
2007
0
            alpha_count++;
2008
0
            alpha_channel = i;
2009
0
        }
2010
0
    }
2011
0
    if (alpha_count == 1U) { /* no way to deal with more than 1 alpha channel */
2012
0
        switch (jp2->enumcs) {
2013
0
        case 16:
2014
0
        case 18:
2015
0
            color_channels = 3;
2016
0
            break;
2017
0
        case 17:
2018
0
            color_channels = 1;
2019
0
            break;
2020
0
        default:
2021
0
            alpha_count = 0U;
2022
0
            break;
2023
0
        }
2024
0
        if (alpha_count == 0U) {
2025
0
            opj_event_msg(p_manager, EVT_WARNING,
2026
0
                          "Alpha channel specified but unknown enumcs. No cdef box will be created.\n");
2027
0
        } else if (image->numcomps < (color_channels + 1)) {
2028
0
            opj_event_msg(p_manager, EVT_WARNING,
2029
0
                          "Alpha channel specified but not enough image components for an automatic cdef box creation.\n");
2030
0
            alpha_count = 0U;
2031
0
        } else if ((OPJ_UINT32)alpha_channel < color_channels) {
2032
0
            opj_event_msg(p_manager, EVT_WARNING,
2033
0
                          "Alpha channel position conflicts with color channel. No cdef box will be created.\n");
2034
0
            alpha_count = 0U;
2035
0
        }
2036
0
    } else if (alpha_count > 1) {
2037
0
        opj_event_msg(p_manager, EVT_WARNING,
2038
0
                      "Multiple alpha channels specified. No cdef box will be created.\n");
2039
0
    }
2040
0
    if (alpha_count == 1U) { /* if here, we know what we can do */
2041
0
        jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
2042
0
        if (!jp2->color.jp2_cdef) {
2043
0
            opj_event_msg(p_manager, EVT_ERROR,
2044
0
                          "Not enough memory to setup the JP2 encoder\n");
2045
0
            return OPJ_FALSE;
2046
0
        }
2047
        /* no memset needed, all values will be overwritten except if jp2->color.jp2_cdef->info allocation fails, */
2048
        /* in which case jp2->color.jp2_cdef->info will be NULL => valid for destruction */
2049
0
        jp2->color.jp2_cdef->info = (opj_jp2_cdef_info_t*) opj_malloc(
2050
0
                                        image->numcomps * sizeof(opj_jp2_cdef_info_t));
2051
0
        if (!jp2->color.jp2_cdef->info) {
2052
            /* memory will be freed by opj_jp2_destroy */
2053
0
            opj_event_msg(p_manager, EVT_ERROR,
2054
0
                          "Not enough memory to setup the JP2 encoder\n");
2055
0
            return OPJ_FALSE;
2056
0
        }
2057
0
        jp2->color.jp2_cdef->n = (OPJ_UINT16)
2058
0
                                 image->numcomps; /* cast is valid : image->numcomps [1,16384] */
2059
0
        for (i = 0U; i < color_channels; i++) {
2060
0
            jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)
2061
0
                                              i; /* cast is valid : image->numcomps [1,16384] */
2062
0
            jp2->color.jp2_cdef->info[i].typ = 0U;
2063
0
            jp2->color.jp2_cdef->info[i].asoc = (OPJ_UINT16)(i +
2064
0
                                                1U); /* No overflow + cast is valid : image->numcomps [1,16384] */
2065
0
        }
2066
0
        for (; i < image->numcomps; i++) {
2067
0
            if (image->comps[i].alpha != 0) { /* we'll be here exactly once */
2068
0
                jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)
2069
0
                                                  i; /* cast is valid : image->numcomps [1,16384] */
2070
0
                jp2->color.jp2_cdef->info[i].typ = 1U; /* Opacity channel */
2071
0
                jp2->color.jp2_cdef->info[i].asoc =
2072
0
                    0U; /* Apply alpha channel to the whole image */
2073
0
            } else {
2074
                /* Unknown channel */
2075
0
                jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)
2076
0
                                                  i; /* cast is valid : image->numcomps [1,16384] */
2077
0
                jp2->color.jp2_cdef->info[i].typ = 65535U;
2078
0
                jp2->color.jp2_cdef->info[i].asoc = 65535U;
2079
0
            }
2080
0
        }
2081
0
    }
2082
2083
0
    jp2->precedence = 0;    /* PRECEDENCE */
2084
0
    jp2->approx = 0;        /* APPROX */
2085
2086
0
    jp2->jpip_on = parameters->jpip_on;
2087
2088
0
    return OPJ_TRUE;
2089
0
}
2090
2091
OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,
2092
                        opj_stream_private_t *stream,
2093
                        opj_event_mgr_t * p_manager)
2094
0
{
2095
0
    return opj_j2k_encode(jp2->j2k, stream, p_manager);
2096
0
}
2097
2098
OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,
2099
                                opj_stream_private_t *cio,
2100
                                opj_event_mgr_t * p_manager
2101
                               )
2102
0
{
2103
    /* preconditions */
2104
0
    assert(jp2 != 00);
2105
0
    assert(cio != 00);
2106
0
    assert(p_manager != 00);
2107
2108
    /* customization of the end encoding */
2109
0
    if (! opj_jp2_setup_end_header_reading(jp2, p_manager)) {
2110
0
        return OPJ_FALSE;
2111
0
    }
2112
2113
    /* write header */
2114
0
    if (! opj_jp2_exec(jp2, jp2->m_procedure_list, cio, p_manager)) {
2115
0
        return OPJ_FALSE;
2116
0
    }
2117
2118
0
    return opj_j2k_end_decompress(jp2->j2k, cio, p_manager);
2119
0
}
2120
2121
OPJ_BOOL opj_jp2_end_compress(opj_jp2_t *jp2,
2122
                              opj_stream_private_t *cio,
2123
                              opj_event_mgr_t * p_manager
2124
                             )
2125
0
{
2126
    /* preconditions */
2127
0
    assert(jp2 != 00);
2128
0
    assert(cio != 00);
2129
0
    assert(p_manager != 00);
2130
2131
    /* customization of the end encoding */
2132
0
    if (! opj_jp2_setup_end_header_writing(jp2, p_manager)) {
2133
0
        return OPJ_FALSE;
2134
0
    }
2135
2136
0
    if (! opj_j2k_end_compress(jp2->j2k, cio, p_manager)) {
2137
0
        return OPJ_FALSE;
2138
0
    }
2139
2140
    /* write header */
2141
0
    return opj_jp2_exec(jp2, jp2->m_procedure_list, cio, p_manager);
2142
0
}
2143
2144
static OPJ_BOOL opj_jp2_setup_end_header_writing(opj_jp2_t *jp2,
2145
        opj_event_mgr_t * p_manager)
2146
0
{
2147
    /* preconditions */
2148
0
    assert(jp2 != 00);
2149
0
    assert(p_manager != 00);
2150
2151
0
#ifdef USE_JPIP
2152
0
    if (jp2->jpip_on) {
2153
0
        if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2154
0
                                               (opj_procedure)opj_jpip_write_iptr, p_manager)) {
2155
0
            return OPJ_FALSE;
2156
0
        }
2157
0
    }
2158
0
#endif
2159
0
    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2160
0
                                           (opj_procedure)opj_jp2_write_jp2c, p_manager)) {
2161
0
        return OPJ_FALSE;
2162
0
    }
2163
    /* DEVELOPER CORNER, add your custom procedures */
2164
0
#ifdef USE_JPIP
2165
0
    if (jp2->jpip_on) {
2166
0
        if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2167
0
                                               (opj_procedure)opj_jpip_write_cidx, p_manager)) {
2168
0
            return OPJ_FALSE;
2169
0
        }
2170
0
        if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2171
0
                                               (opj_procedure)opj_jpip_write_fidx, p_manager)) {
2172
0
            return OPJ_FALSE;
2173
0
        }
2174
0
    }
2175
0
#endif
2176
0
    return OPJ_TRUE;
2177
0
}
2178
2179
static OPJ_BOOL opj_jp2_setup_end_header_reading(opj_jp2_t *jp2,
2180
        opj_event_mgr_t * p_manager)
2181
0
{
2182
    /* preconditions */
2183
0
    assert(jp2 != 00);
2184
0
    assert(p_manager != 00);
2185
2186
0
    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2187
0
                                           (opj_procedure)opj_jp2_read_header_procedure, p_manager)) {
2188
0
        return OPJ_FALSE;
2189
0
    }
2190
    /* DEVELOPER CORNER, add your custom procedures */
2191
2192
0
    return OPJ_TRUE;
2193
0
}
2194
2195
static OPJ_BOOL opj_jp2_default_validation(opj_jp2_t * jp2,
2196
        opj_stream_private_t *cio,
2197
        opj_event_mgr_t * p_manager
2198
                                          )
2199
0
{
2200
0
    OPJ_BOOL l_is_valid = OPJ_TRUE;
2201
0
    OPJ_UINT32 i;
2202
2203
    /* preconditions */
2204
0
    assert(jp2 != 00);
2205
0
    assert(cio != 00);
2206
0
    assert(p_manager != 00);
2207
2208
0
    OPJ_UNUSED(p_manager);
2209
2210
    /* JPEG2000 codec validation */
2211
2212
    /* STATE checking */
2213
    /* make sure the state is at 0 */
2214
0
    l_is_valid &= (jp2->jp2_state == JP2_STATE_NONE);
2215
2216
    /* make sure not reading a jp2h ???? WEIRD */
2217
0
    l_is_valid &= (jp2->jp2_img_state == JP2_IMG_STATE_NONE);
2218
2219
    /* POINTER validation */
2220
    /* make sure a j2k codec is present */
2221
0
    l_is_valid &= (jp2->j2k != 00);
2222
2223
    /* make sure a procedure list is present */
2224
0
    l_is_valid &= (jp2->m_procedure_list != 00);
2225
2226
    /* make sure a validation list is present */
2227
0
    l_is_valid &= (jp2->m_validation_list != 00);
2228
2229
    /* PARAMETER VALIDATION */
2230
    /* number of components */
2231
0
    l_is_valid &= (jp2->numcl > 0);
2232
    /* width */
2233
0
    l_is_valid &= (jp2->h > 0);
2234
    /* height */
2235
0
    l_is_valid &= (jp2->w > 0);
2236
    /* precision */
2237
0
    for (i = 0; i < jp2->numcomps; ++i) {
2238
0
        l_is_valid &= ((jp2->comps[i].bpcc & 0x7FU) <
2239
0
                       38U); /* 0 is valid, ignore sign for check */
2240
0
    }
2241
2242
    /* METH */
2243
0
    l_is_valid &= ((jp2->meth > 0) && (jp2->meth < 3));
2244
2245
    /* stream validation */
2246
    /* back and forth is needed */
2247
0
    l_is_valid &= opj_stream_has_seek(cio);
2248
2249
0
    return l_is_valid;
2250
0
}
2251
2252
static OPJ_BOOL opj_jp2_read_header_procedure(opj_jp2_t *jp2,
2253
        opj_stream_private_t *stream,
2254
        opj_event_mgr_t * p_manager
2255
                                             )
2256
13.3k
{
2257
13.3k
    opj_jp2_box_t box;
2258
13.3k
    OPJ_UINT32 l_nb_bytes_read;
2259
13.3k
    const opj_jp2_header_handler_t * l_current_handler;
2260
13.3k
    const opj_jp2_header_handler_t * l_current_handler_misplaced;
2261
13.3k
    OPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE;
2262
13.3k
    OPJ_UINT32 l_current_data_size;
2263
13.3k
    OPJ_BYTE * l_current_data = 00;
2264
2265
    /* preconditions */
2266
13.3k
    assert(stream != 00);
2267
13.3k
    assert(jp2 != 00);
2268
13.3k
    assert(p_manager != 00);
2269
2270
13.3k
    l_current_data = (OPJ_BYTE*)opj_calloc(1, l_last_data_size);
2271
2272
13.3k
    if (l_current_data == 00) {
2273
0
        opj_event_msg(p_manager, EVT_ERROR,
2274
0
                      "Not enough memory to handle jpeg2000 file header\n");
2275
0
        return OPJ_FALSE;
2276
0
    }
2277
2278
59.3k
    while (opj_jp2_read_boxhdr(&box, &l_nb_bytes_read, stream, p_manager)) {
2279
        /* is it the codestream box ? */
2280
59.3k
        if (box.type == JP2_JP2C) {
2281
12.7k
            if (jp2->jp2_state & JP2_STATE_HEADER) {
2282
12.7k
                jp2->jp2_state |= JP2_STATE_CODESTREAM;
2283
12.7k
                opj_free(l_current_data);
2284
12.7k
                return OPJ_TRUE;
2285
12.7k
            } else {
2286
0
                opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n");
2287
0
                opj_free(l_current_data);
2288
0
                return OPJ_FALSE;
2289
0
            }
2290
46.5k
        } else if (box.length == 0) {
2291
0
            opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
2292
0
            opj_free(l_current_data);
2293
0
            return OPJ_FALSE;
2294
0
        }
2295
        /* testcase 1851.pdf.SIGSEGV.ce9.948 */
2296
46.5k
        else if (box.length < l_nb_bytes_read) {
2297
0
            opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length,
2298
0
                          box.type);
2299
0
            opj_free(l_current_data);
2300
0
            return OPJ_FALSE;
2301
0
        }
2302
2303
46.5k
        l_current_handler = opj_jp2_find_handler(box.type);
2304
46.5k
        l_current_handler_misplaced = opj_jp2_img_find_handler(box.type);
2305
46.5k
        l_current_data_size = box.length - l_nb_bytes_read;
2306
2307
46.5k
        if ((l_current_handler != 00) || (l_current_handler_misplaced != 00)) {
2308
38.6k
            if (l_current_handler == 00) {
2309
0
                opj_event_msg(p_manager, EVT_WARNING,
2310
0
                              "Found a misplaced '%c%c%c%c' box outside jp2h box\n",
2311
0
                              (OPJ_BYTE)(box.type >> 24), (OPJ_BYTE)(box.type >> 16),
2312
0
                              (OPJ_BYTE)(box.type >> 8), (OPJ_BYTE)(box.type >> 0));
2313
0
                if (jp2->jp2_state & JP2_STATE_HEADER) {
2314
                    /* read anyway, we already have jp2h */
2315
0
                    l_current_handler = l_current_handler_misplaced;
2316
0
                } else {
2317
0
                    opj_event_msg(p_manager, EVT_WARNING,
2318
0
                                  "JPEG2000 Header box not read yet, '%c%c%c%c' box will be ignored\n",
2319
0
                                  (OPJ_BYTE)(box.type >> 24), (OPJ_BYTE)(box.type >> 16),
2320
0
                                  (OPJ_BYTE)(box.type >> 8), (OPJ_BYTE)(box.type >> 0));
2321
0
                    jp2->jp2_state |= JP2_STATE_UNKNOWN;
2322
0
                    if (opj_stream_skip(stream, l_current_data_size,
2323
0
                                        p_manager) != l_current_data_size) {
2324
0
                        opj_event_msg(p_manager, EVT_ERROR,
2325
0
                                      "Problem with skipping JPEG2000 box, stream error\n");
2326
0
                        opj_free(l_current_data);
2327
0
                        return OPJ_FALSE;
2328
0
                    }
2329
0
                    continue;
2330
0
                }
2331
0
            }
2332
38.6k
            if ((OPJ_OFF_T)l_current_data_size > opj_stream_get_number_byte_left(stream)) {
2333
                /* do not even try to malloc if we can't read */
2334
5
                opj_event_msg(p_manager, EVT_ERROR,
2335
5
                              "Invalid box size %d for box '%c%c%c%c'. Need %d bytes, %d bytes remaining \n",
2336
5
                              box.length, (OPJ_BYTE)(box.type >> 24), (OPJ_BYTE)(box.type >> 16),
2337
5
                              (OPJ_BYTE)(box.type >> 8), (OPJ_BYTE)(box.type >> 0), l_current_data_size,
2338
5
                              (OPJ_UINT32)opj_stream_get_number_byte_left(stream));
2339
5
                opj_free(l_current_data);
2340
5
                return OPJ_FALSE;
2341
5
            }
2342
38.6k
            if (l_current_data_size > l_last_data_size) {
2343
0
                OPJ_BYTE* new_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,
2344
0
                                             l_current_data_size);
2345
0
                if (!new_current_data) {
2346
0
                    opj_free(l_current_data);
2347
0
                    opj_event_msg(p_manager, EVT_ERROR,
2348
0
                                  "Not enough memory to handle jpeg2000 box\n");
2349
0
                    return OPJ_FALSE;
2350
0
                }
2351
0
                l_current_data = new_current_data;
2352
0
                l_last_data_size = l_current_data_size;
2353
0
            }
2354
2355
38.6k
            l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(stream, l_current_data,
2356
38.6k
                              l_current_data_size, p_manager);
2357
38.6k
            if (l_nb_bytes_read != l_current_data_size) {
2358
0
                opj_event_msg(p_manager, EVT_ERROR,
2359
0
                              "Problem with reading JPEG2000 box, stream error\n");
2360
0
                opj_free(l_current_data);
2361
0
                return OPJ_FALSE;
2362
0
            }
2363
2364
38.6k
            if (! l_current_handler->handler(jp2, l_current_data, l_current_data_size,
2365
38.6k
                                             p_manager)) {
2366
24
                opj_free(l_current_data);
2367
24
                return OPJ_FALSE;
2368
24
            }
2369
38.6k
        } else {
2370
7.81k
            if (!(jp2->jp2_state & JP2_STATE_SIGNATURE)) {
2371
432
                opj_event_msg(p_manager, EVT_ERROR,
2372
432
                              "Malformed JP2 file format: first box must be JPEG 2000 signature box\n");
2373
432
                opj_free(l_current_data);
2374
432
                return OPJ_FALSE;
2375
432
            }
2376
7.38k
            if (!(jp2->jp2_state & JP2_STATE_FILE_TYPE)) {
2377
1
                opj_event_msg(p_manager, EVT_ERROR,
2378
1
                              "Malformed JP2 file format: second box must be file type box\n");
2379
1
                opj_free(l_current_data);
2380
1
                return OPJ_FALSE;
2381
1
            }
2382
7.38k
            jp2->jp2_state |= JP2_STATE_UNKNOWN;
2383
7.38k
            if (opj_stream_skip(stream, l_current_data_size,
2384
7.38k
                                p_manager) != l_current_data_size) {
2385
81
                if (jp2->jp2_state & JP2_STATE_CODESTREAM) {
2386
                    /* If we already read the codestream, do not error out */
2387
                    /* Needed for data/input/nonregression/issue254.jp2 */
2388
81
                    opj_event_msg(p_manager, EVT_WARNING,
2389
81
                                  "Problem with skipping JPEG2000 box, stream error\n");
2390
81
                    opj_free(l_current_data);
2391
81
                    return OPJ_TRUE;
2392
81
                } else {
2393
0
                    opj_event_msg(p_manager, EVT_ERROR,
2394
0
                                  "Problem with skipping JPEG2000 box, stream error\n");
2395
0
                    opj_free(l_current_data);
2396
0
                    return OPJ_FALSE;
2397
0
                }
2398
81
            }
2399
7.38k
        }
2400
46.5k
    }
2401
2402
12
    opj_free(l_current_data);
2403
2404
12
    return OPJ_TRUE;
2405
13.3k
}
2406
2407
/**
2408
 * Executes the given procedures on the given codec.
2409
 *
2410
 * @param   p_procedure_list    the list of procedures to execute
2411
 * @param   jp2                 the jpeg2000 file codec to execute the procedures on.
2412
 * @param   stream                  the stream to execute the procedures on.
2413
 * @param   p_manager           the user manager.
2414
 *
2415
 * @return  true                if all the procedures were successfully executed.
2416
 */
2417
static OPJ_BOOL opj_jp2_exec(opj_jp2_t * jp2,
2418
                             opj_procedure_list_t * p_procedure_list,
2419
                             opj_stream_private_t *stream,
2420
                             opj_event_mgr_t * p_manager
2421
                            )
2422
2423
26.7k
{
2424
26.7k
    OPJ_BOOL(** l_procedure)(opj_jp2_t * jp2, opj_stream_private_t *,
2425
26.7k
                             opj_event_mgr_t *) = 00;
2426
26.7k
    OPJ_BOOL l_result = OPJ_TRUE;
2427
26.7k
    OPJ_UINT32 l_nb_proc, i;
2428
2429
    /* preconditions */
2430
26.7k
    assert(p_procedure_list != 00);
2431
26.7k
    assert(jp2 != 00);
2432
26.7k
    assert(stream != 00);
2433
26.7k
    assert(p_manager != 00);
2434
2435
26.7k
    l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
2436
26.7k
    l_procedure = (OPJ_BOOL(**)(opj_jp2_t * jp2, opj_stream_private_t *,
2437
26.7k
                                opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
2438
2439
40.0k
    for (i = 0; i < l_nb_proc; ++i) {
2440
13.3k
        l_result = l_result && (*l_procedure)(jp2, stream, p_manager);
2441
13.3k
        ++l_procedure;
2442
13.3k
    }
2443
2444
    /* and clear the procedure list at the end. */
2445
26.7k
    opj_procedure_list_clear(p_procedure_list);
2446
26.7k
    return l_result;
2447
26.7k
}
2448
2449
OPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,
2450
                                opj_stream_private_t *stream,
2451
                                opj_image_t * p_image,
2452
                                opj_event_mgr_t * p_manager
2453
                               )
2454
0
{
2455
    /* preconditions */
2456
0
    assert(jp2 != 00);
2457
0
    assert(stream != 00);
2458
0
    assert(p_manager != 00);
2459
2460
    /* customization of the validation */
2461
0
    if (! opj_jp2_setup_encoding_validation(jp2, p_manager)) {
2462
0
        return OPJ_FALSE;
2463
0
    }
2464
2465
    /* validation of the parameters codec */
2466
0
    if (! opj_jp2_exec(jp2, jp2->m_validation_list, stream, p_manager)) {
2467
0
        return OPJ_FALSE;
2468
0
    }
2469
2470
    /* customization of the encoding */
2471
0
    if (! opj_jp2_setup_header_writing(jp2, p_manager)) {
2472
0
        return OPJ_FALSE;
2473
0
    }
2474
2475
    /* write header */
2476
0
    if (! opj_jp2_exec(jp2, jp2->m_procedure_list, stream, p_manager)) {
2477
0
        return OPJ_FALSE;
2478
0
    }
2479
2480
0
    return opj_j2k_start_compress(jp2->j2k, stream, p_image, p_manager);
2481
0
}
2482
2483
static const opj_jp2_header_handler_t * opj_jp2_find_handler(OPJ_UINT32 p_id)
2484
46.5k
{
2485
46.5k
    OPJ_UINT32 i, l_handler_size = sizeof(jp2_header) / sizeof(
2486
46.5k
                                       opj_jp2_header_handler_t);
2487
2488
108k
    for (i = 0; i < l_handler_size; ++i) {
2489
100k
        if (jp2_header[i].id == p_id) {
2490
38.6k
            return &jp2_header[i];
2491
38.6k
        }
2492
100k
    }
2493
7.81k
    return NULL;
2494
46.5k
}
2495
2496
/**
2497
 * Finds the image execution function related to the given box id.
2498
 *
2499
 * @param   p_id    the id of the handler to fetch.
2500
 *
2501
 * @return  the given handler or 00 if it could not be found.
2502
 */
2503
static const opj_jp2_header_handler_t * opj_jp2_img_find_handler(
2504
    OPJ_UINT32 p_id)
2505
72.2k
{
2506
72.2k
    OPJ_UINT32 i, l_handler_size = sizeof(jp2_img_header) / sizeof(
2507
72.2k
                                       opj_jp2_header_handler_t);
2508
364k
    for (i = 0; i < l_handler_size; ++i) {
2509
317k
        if (jp2_img_header[i].id == p_id) {
2510
25.7k
            return &jp2_img_header[i];
2511
25.7k
        }
2512
317k
    }
2513
2514
46.5k
    return NULL;
2515
72.2k
}
2516
2517
/**
2518
 * Reads a jpeg2000 file signature box.
2519
 *
2520
 * @param   p_header_data   the data contained in the signature box.
2521
 * @param   jp2             the jpeg2000 file codec.
2522
 * @param   p_header_size   the size of the data contained in the signature box.
2523
 * @param   p_manager       the user event manager.
2524
 *
2525
 * @return true if the file signature box is valid.
2526
 */
2527
static OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,
2528
                                OPJ_BYTE * p_header_data,
2529
                                OPJ_UINT32 p_header_size,
2530
                                opj_event_mgr_t * p_manager
2531
                               )
2532
2533
12.9k
{
2534
12.9k
    OPJ_UINT32 l_magic_number;
2535
2536
    /* preconditions */
2537
12.9k
    assert(p_header_data != 00);
2538
12.9k
    assert(jp2 != 00);
2539
12.9k
    assert(p_manager != 00);
2540
2541
12.9k
    if (jp2->jp2_state != JP2_STATE_NONE) {
2542
0
        opj_event_msg(p_manager, EVT_ERROR,
2543
0
                      "The signature box must be the first box in the file.\n");
2544
0
        return OPJ_FALSE;
2545
0
    }
2546
2547
    /* assure length of data is correct (4 -> magic number) */
2548
12.9k
    if (p_header_size != 4) {
2549
0
        opj_event_msg(p_manager, EVT_ERROR, "Error with JP signature Box size\n");
2550
0
        return OPJ_FALSE;
2551
0
    }
2552
2553
    /* rearrange data */
2554
12.9k
    opj_read_bytes(p_header_data, &l_magic_number, 4);
2555
12.9k
    if (l_magic_number != 0x0d0a870a) {
2556
0
        opj_event_msg(p_manager, EVT_ERROR,
2557
0
                      "Error with JP Signature : bad magic number\n");
2558
0
        return OPJ_FALSE;
2559
0
    }
2560
2561
12.9k
    jp2->jp2_state |= JP2_STATE_SIGNATURE;
2562
2563
12.9k
    return OPJ_TRUE;
2564
12.9k
}
2565
2566
/**
2567
 * Reads a a FTYP box - File type box
2568
 *
2569
 * @param   p_header_data   the data contained in the FTYP box.
2570
 * @param   jp2             the jpeg2000 file codec.
2571
 * @param   p_header_size   the size of the data contained in the FTYP box.
2572
 * @param   p_manager       the user event manager.
2573
 *
2574
 * @return true if the FTYP box is valid.
2575
 */
2576
static OPJ_BOOL opj_jp2_read_ftyp(opj_jp2_t *jp2,
2577
                                  OPJ_BYTE * p_header_data,
2578
                                  OPJ_UINT32 p_header_size,
2579
                                  opj_event_mgr_t * p_manager
2580
                                 )
2581
12.9k
{
2582
12.9k
    OPJ_UINT32 i, l_remaining_bytes;
2583
2584
    /* preconditions */
2585
12.9k
    assert(p_header_data != 00);
2586
12.9k
    assert(jp2 != 00);
2587
12.9k
    assert(p_manager != 00);
2588
2589
12.9k
    if (jp2->jp2_state != JP2_STATE_SIGNATURE) {
2590
0
        opj_event_msg(p_manager, EVT_ERROR,
2591
0
                      "The ftyp box must be the second box in the file.\n");
2592
0
        return OPJ_FALSE;
2593
0
    }
2594
2595
    /* assure length of data is correct */
2596
12.9k
    if (p_header_size < 8) {
2597
0
        opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
2598
0
        return OPJ_FALSE;
2599
0
    }
2600
2601
12.9k
    opj_read_bytes(p_header_data, &jp2->brand, 4);      /* BR */
2602
12.9k
    p_header_data += 4;
2603
2604
12.9k
    opj_read_bytes(p_header_data, &jp2->minversion, 4);     /* MinV */
2605
12.9k
    p_header_data += 4;
2606
2607
12.9k
    l_remaining_bytes = p_header_size - 8;
2608
2609
    /* the number of remaining bytes should be a multiple of 4 */
2610
12.9k
    if ((l_remaining_bytes & 0x3) != 0) {
2611
0
        opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
2612
0
        return OPJ_FALSE;
2613
0
    }
2614
2615
    /* div by 4 */
2616
12.9k
    jp2->numcl = l_remaining_bytes >> 2;
2617
12.9k
    if (jp2->numcl) {
2618
12.9k
        jp2->cl = (OPJ_UINT32 *) opj_calloc(jp2->numcl, sizeof(OPJ_UINT32));
2619
12.9k
        if (jp2->cl == 00) {
2620
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory with FTYP Box\n");
2621
0
            return OPJ_FALSE;
2622
0
        }
2623
12.9k
    }
2624
2625
40.4k
    for (i = 0; i < jp2->numcl; ++i) {
2626
27.4k
        opj_read_bytes(p_header_data, &jp2->cl[i], 4);      /* CLi */
2627
27.4k
        p_header_data += 4;
2628
27.4k
    }
2629
2630
12.9k
    jp2->jp2_state |= JP2_STATE_FILE_TYPE;
2631
2632
12.9k
    return OPJ_TRUE;
2633
12.9k
}
2634
2635
static OPJ_BOOL opj_jp2_skip_jp2c(opj_jp2_t *jp2,
2636
                                  opj_stream_private_t *stream,
2637
                                  opj_event_mgr_t * p_manager)
2638
0
{
2639
    /* preconditions */
2640
0
    assert(jp2 != 00);
2641
0
    assert(stream != 00);
2642
0
    assert(p_manager != 00);
2643
2644
0
    jp2->j2k_codestream_offset = opj_stream_tell(stream);
2645
2646
0
    if (opj_stream_skip(stream, 8, p_manager) != 8) {
2647
0
        return OPJ_FALSE;
2648
0
    }
2649
2650
0
    return OPJ_TRUE;
2651
0
}
2652
2653
static OPJ_BOOL opj_jpip_skip_iptr(opj_jp2_t *jp2,
2654
                                   opj_stream_private_t *stream,
2655
                                   opj_event_mgr_t * p_manager)
2656
0
{
2657
    /* preconditions */
2658
0
    assert(jp2 != 00);
2659
0
    assert(stream != 00);
2660
0
    assert(p_manager != 00);
2661
2662
0
    jp2->jpip_iptr_offset = opj_stream_tell(stream);
2663
2664
0
    if (opj_stream_skip(stream, 24, p_manager) != 24) {
2665
0
        return OPJ_FALSE;
2666
0
    }
2667
2668
0
    return OPJ_TRUE;
2669
0
}
2670
2671
/**
2672
 * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
2673
 *
2674
 * @param   p_header_data   the data contained in the file header box.
2675
 * @param   jp2             the jpeg2000 file codec.
2676
 * @param   p_header_size   the size of the data contained in the file header box.
2677
 * @param   p_manager       the user event manager.
2678
 *
2679
 * @return true if the JP2 Header box was successfully recognized.
2680
*/
2681
static OPJ_BOOL opj_jp2_read_jp2h(opj_jp2_t *jp2,
2682
                                  OPJ_BYTE *p_header_data,
2683
                                  OPJ_UINT32 p_header_size,
2684
                                  opj_event_mgr_t * p_manager
2685
                                 )
2686
12.8k
{
2687
12.8k
    OPJ_UINT32 l_box_size = 0, l_current_data_size = 0;
2688
12.8k
    opj_jp2_box_t box;
2689
12.8k
    const opj_jp2_header_handler_t * l_current_handler;
2690
12.8k
    OPJ_BOOL l_has_ihdr = 0;
2691
2692
    /* preconditions */
2693
12.8k
    assert(p_header_data != 00);
2694
12.8k
    assert(jp2 != 00);
2695
12.8k
    assert(p_manager != 00);
2696
2697
    /* make sure the box is well placed */
2698
12.8k
    if ((jp2->jp2_state & JP2_STATE_FILE_TYPE) != JP2_STATE_FILE_TYPE) {
2699
0
        opj_event_msg(p_manager, EVT_ERROR,
2700
0
                      "The  box must be the first box in the file.\n");
2701
0
        return OPJ_FALSE;
2702
0
    }
2703
2704
12.8k
    jp2->jp2_img_state = JP2_IMG_STATE_NONE;
2705
2706
    /* iterate while remaining data */
2707
38.5k
    while (p_header_size > 0) {
2708
2709
25.7k
        if (! opj_jp2_read_boxhdr_char(&box, p_header_data, &l_box_size, p_header_size,
2710
25.7k
                                       p_manager)) {
2711
5
            opj_event_msg(p_manager, EVT_ERROR,
2712
5
                          "Stream error while reading JP2 Header box\n");
2713
5
            return OPJ_FALSE;
2714
5
        }
2715
2716
25.7k
        if (box.length > p_header_size) {
2717
19
            opj_event_msg(p_manager, EVT_ERROR,
2718
19
                          "Stream error while reading JP2 Header box: box length is inconsistent.\n");
2719
19
            return OPJ_FALSE;
2720
19
        }
2721
2722
25.7k
        l_current_handler = opj_jp2_img_find_handler(box.type);
2723
25.7k
        l_current_data_size = box.length - l_box_size;
2724
25.7k
        p_header_data += l_box_size;
2725
2726
25.7k
        if (l_current_handler != 00) {
2727
25.7k
            if (! l_current_handler->handler(jp2, p_header_data, l_current_data_size,
2728
25.7k
                                             p_manager)) {
2729
0
                return OPJ_FALSE;
2730
0
            }
2731
25.7k
        } else {
2732
3
            jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;
2733
3
        }
2734
2735
25.7k
        if (box.type == JP2_IHDR) {
2736
12.8k
            l_has_ihdr = 1;
2737
12.8k
        }
2738
2739
25.7k
        p_header_data += l_current_data_size;
2740
25.7k
        p_header_size -= box.length;
2741
25.7k
    }
2742
2743
12.8k
    if (l_has_ihdr == 0) {
2744
0
        opj_event_msg(p_manager, EVT_ERROR,
2745
0
                      "Stream error while reading JP2 Header box: no 'ihdr' box.\n");
2746
0
        return OPJ_FALSE;
2747
0
    }
2748
2749
12.8k
    jp2->jp2_state |= JP2_STATE_HEADER;
2750
12.8k
    jp2->has_jp2h = 1;
2751
2752
12.8k
    return OPJ_TRUE;
2753
12.8k
}
2754
2755
static OPJ_BOOL opj_jp2_read_boxhdr_char(opj_jp2_box_t *box,
2756
        OPJ_BYTE * p_data,
2757
        OPJ_UINT32 * p_number_bytes_read,
2758
        OPJ_UINT32 p_box_max_size,
2759
        opj_event_mgr_t * p_manager
2760
                                        )
2761
25.7k
{
2762
25.7k
    OPJ_UINT32 l_value;
2763
2764
    /* preconditions */
2765
25.7k
    assert(p_data != 00);
2766
25.7k
    assert(box != 00);
2767
25.7k
    assert(p_number_bytes_read != 00);
2768
25.7k
    assert(p_manager != 00);
2769
2770
25.7k
    if (p_box_max_size < 8) {
2771
0
        opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of less than 8 bytes\n");
2772
0
        return OPJ_FALSE;
2773
0
    }
2774
2775
    /* process read data */
2776
25.7k
    opj_read_bytes(p_data, &l_value, 4);
2777
25.7k
    p_data += 4;
2778
25.7k
    box->length = (OPJ_UINT32)(l_value);
2779
2780
25.7k
    opj_read_bytes(p_data, &l_value, 4);
2781
25.7k
    p_data += 4;
2782
25.7k
    box->type = (OPJ_UINT32)(l_value);
2783
2784
25.7k
    *p_number_bytes_read = 8;
2785
2786
    /* do we have a "special very large box ?" */
2787
    /* read then the XLBox */
2788
25.7k
    if (box->length == 1) {
2789
0
        OPJ_UINT32 l_xl_part_size;
2790
2791
0
        if (p_box_max_size < 16) {
2792
0
            opj_event_msg(p_manager, EVT_ERROR,
2793
0
                          "Cannot handle XL box of less than 16 bytes\n");
2794
0
            return OPJ_FALSE;
2795
0
        }
2796
2797
0
        opj_read_bytes(p_data, &l_xl_part_size, 4);
2798
0
        p_data += 4;
2799
0
        *p_number_bytes_read += 4;
2800
2801
0
        if (l_xl_part_size != 0) {
2802
0
            opj_event_msg(p_manager, EVT_ERROR,
2803
0
                          "Cannot handle box sizes higher than 2^32\n");
2804
0
            return OPJ_FALSE;
2805
0
        }
2806
2807
0
        opj_read_bytes(p_data, &l_value, 4);
2808
0
        *p_number_bytes_read += 4;
2809
0
        box->length = (OPJ_UINT32)(l_value);
2810
2811
0
        if (box->length == 0) {
2812
0
            opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
2813
0
            return OPJ_FALSE;
2814
0
        }
2815
25.7k
    } else if (box->length == 0) {
2816
5
        opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
2817
5
        return OPJ_FALSE;
2818
5
    }
2819
25.7k
    if (box->length < *p_number_bytes_read) {
2820
0
        opj_event_msg(p_manager, EVT_ERROR, "Box length is inconsistent.\n");
2821
0
        return OPJ_FALSE;
2822
0
    }
2823
25.7k
    return OPJ_TRUE;
2824
25.7k
}
2825
2826
OPJ_BOOL opj_jp2_read_header(opj_stream_private_t *p_stream,
2827
                             opj_jp2_t *jp2,
2828
                             opj_image_t ** p_image,
2829
                             opj_event_mgr_t * p_manager
2830
                            )
2831
13.3k
{
2832
13.3k
    int ret;
2833
2834
    /* preconditions */
2835
13.3k
    assert(jp2 != 00);
2836
13.3k
    assert(p_stream != 00);
2837
13.3k
    assert(p_manager != 00);
2838
2839
    /* customization of the validation */
2840
13.3k
    if (! opj_jp2_setup_decoding_validation(jp2, p_manager)) {
2841
0
        return OPJ_FALSE;
2842
0
    }
2843
2844
    /* customization of the encoding */
2845
13.3k
    if (! opj_jp2_setup_header_reading(jp2, p_manager)) {
2846
0
        return OPJ_FALSE;
2847
0
    }
2848
2849
    /* validation of the parameters codec */
2850
13.3k
    if (! opj_jp2_exec(jp2, jp2->m_validation_list, p_stream, p_manager)) {
2851
0
        return OPJ_FALSE;
2852
0
    }
2853
2854
    /* read header */
2855
13.3k
    if (! opj_jp2_exec(jp2, jp2->m_procedure_list, p_stream, p_manager)) {
2856
462
        return OPJ_FALSE;
2857
462
    }
2858
12.8k
    if (jp2->has_jp2h == 0) {
2859
57
        opj_event_msg(p_manager, EVT_ERROR, "JP2H box missing. Required.\n");
2860
57
        return OPJ_FALSE;
2861
57
    }
2862
12.8k
    if (jp2->has_ihdr == 0) {
2863
0
        opj_event_msg(p_manager, EVT_ERROR, "IHDR box_missing. Required.\n");
2864
0
        return OPJ_FALSE;
2865
0
    }
2866
2867
12.8k
    ret = opj_j2k_read_header(p_stream,
2868
12.8k
                              jp2->j2k,
2869
12.8k
                              p_image,
2870
12.8k
                              p_manager);
2871
2872
12.8k
    if (p_image && *p_image) {
2873
        /* Set Image Color Space */
2874
12.4k
        if (jp2->enumcs == 16) {
2875
5.99k
            (*p_image)->color_space = OPJ_CLRSPC_SRGB;
2876
6.49k
        } else if (jp2->enumcs == 17) {
2877
6.48k
            (*p_image)->color_space = OPJ_CLRSPC_GRAY;
2878
6.48k
        } else if (jp2->enumcs == 18) {
2879
0
            (*p_image)->color_space = OPJ_CLRSPC_SYCC;
2880
6
        } else if (jp2->enumcs == 24) {
2881
2
            (*p_image)->color_space = OPJ_CLRSPC_EYCC;
2882
4
        } else if (jp2->enumcs == 12) {
2883
0
            (*p_image)->color_space = OPJ_CLRSPC_CMYK;
2884
4
        } else {
2885
4
            (*p_image)->color_space = OPJ_CLRSPC_UNKNOWN;
2886
4
        }
2887
2888
12.4k
        if (jp2->color.icc_profile_buf) {
2889
0
            (*p_image)->icc_profile_buf = jp2->color.icc_profile_buf;
2890
0
            (*p_image)->icc_profile_len = jp2->color.icc_profile_len;
2891
0
            jp2->color.icc_profile_buf = NULL;
2892
0
        }
2893
12.4k
    }
2894
12.8k
    return ret;
2895
12.8k
}
2896
2897
static OPJ_BOOL opj_jp2_setup_encoding_validation(opj_jp2_t *jp2,
2898
        opj_event_mgr_t * p_manager)
2899
0
{
2900
    /* preconditions */
2901
0
    assert(jp2 != 00);
2902
0
    assert(p_manager != 00);
2903
2904
0
    if (! opj_procedure_list_add_procedure(jp2->m_validation_list,
2905
0
                                           (opj_procedure)opj_jp2_default_validation, p_manager)) {
2906
0
        return OPJ_FALSE;
2907
0
    }
2908
    /* DEVELOPER CORNER, add your custom validation procedure */
2909
2910
0
    return OPJ_TRUE;
2911
0
}
2912
2913
static OPJ_BOOL opj_jp2_setup_decoding_validation(opj_jp2_t *jp2,
2914
        opj_event_mgr_t * p_manager)
2915
13.3k
{
2916
    /* preconditions */
2917
13.3k
    assert(jp2 != 00);
2918
13.3k
    assert(p_manager != 00);
2919
2920
13.3k
    OPJ_UNUSED(jp2);
2921
13.3k
    OPJ_UNUSED(p_manager);
2922
2923
    /* DEVELOPER CORNER, add your custom validation procedure */
2924
2925
13.3k
    return OPJ_TRUE;
2926
13.3k
}
2927
2928
static OPJ_BOOL opj_jp2_setup_header_writing(opj_jp2_t *jp2,
2929
        opj_event_mgr_t * p_manager)
2930
0
{
2931
    /* preconditions */
2932
0
    assert(jp2 != 00);
2933
0
    assert(p_manager != 00);
2934
2935
0
    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2936
0
                                           (opj_procedure)opj_jp2_write_jp, p_manager)) {
2937
0
        return OPJ_FALSE;
2938
0
    }
2939
0
    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2940
0
                                           (opj_procedure)opj_jp2_write_ftyp, p_manager)) {
2941
0
        return OPJ_FALSE;
2942
0
    }
2943
0
    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2944
0
                                           (opj_procedure)opj_jp2_write_jp2h, p_manager)) {
2945
0
        return OPJ_FALSE;
2946
0
    }
2947
0
    if (jp2->jpip_on) {
2948
0
        if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2949
0
                                               (opj_procedure)opj_jpip_skip_iptr, p_manager)) {
2950
0
            return OPJ_FALSE;
2951
0
        }
2952
0
    }
2953
0
    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2954
0
                                           (opj_procedure)opj_jp2_skip_jp2c, p_manager)) {
2955
0
        return OPJ_FALSE;
2956
0
    }
2957
2958
    /* DEVELOPER CORNER, insert your custom procedures */
2959
2960
0
    return OPJ_TRUE;
2961
0
}
2962
2963
static OPJ_BOOL opj_jp2_setup_header_reading(opj_jp2_t *jp2,
2964
        opj_event_mgr_t * p_manager)
2965
13.3k
{
2966
    /* preconditions */
2967
13.3k
    assert(jp2 != 00);
2968
13.3k
    assert(p_manager != 00);
2969
2970
13.3k
    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
2971
13.3k
                                           (opj_procedure)opj_jp2_read_header_procedure, p_manager)) {
2972
0
        return OPJ_FALSE;
2973
0
    }
2974
2975
    /* DEVELOPER CORNER, add your custom procedures */
2976
2977
13.3k
    return OPJ_TRUE;
2978
13.3k
}
2979
2980
OPJ_BOOL opj_jp2_read_tile_header(opj_jp2_t * p_jp2,
2981
                                  OPJ_UINT32 * p_tile_index,
2982
                                  OPJ_UINT32 * p_data_size,
2983
                                  OPJ_INT32 * p_tile_x0,
2984
                                  OPJ_INT32 * p_tile_y0,
2985
                                  OPJ_INT32 * p_tile_x1,
2986
                                  OPJ_INT32 * p_tile_y1,
2987
                                  OPJ_UINT32 * p_nb_comps,
2988
                                  OPJ_BOOL * p_go_on,
2989
                                  opj_stream_private_t *p_stream,
2990
                                  opj_event_mgr_t * p_manager
2991
                                 )
2992
0
{
2993
0
    return opj_j2k_read_tile_header(p_jp2->j2k,
2994
0
                                    p_tile_index,
2995
0
                                    p_data_size,
2996
0
                                    p_tile_x0, p_tile_y0,
2997
0
                                    p_tile_x1, p_tile_y1,
2998
0
                                    p_nb_comps,
2999
0
                                    p_go_on,
3000
0
                                    p_stream,
3001
0
                                    p_manager);
3002
0
}
3003
3004
OPJ_BOOL opj_jp2_write_tile(opj_jp2_t *p_jp2,
3005
                            OPJ_UINT32 p_tile_index,
3006
                            OPJ_BYTE * p_data,
3007
                            OPJ_UINT32 p_data_size,
3008
                            opj_stream_private_t *p_stream,
3009
                            opj_event_mgr_t * p_manager
3010
                           )
3011
3012
0
{
3013
0
    return opj_j2k_write_tile(p_jp2->j2k, p_tile_index, p_data, p_data_size,
3014
0
                              p_stream, p_manager);
3015
0
}
3016
3017
OPJ_BOOL opj_jp2_decode_tile(opj_jp2_t * p_jp2,
3018
                             OPJ_UINT32 p_tile_index,
3019
                             OPJ_BYTE * p_data,
3020
                             OPJ_UINT32 p_data_size,
3021
                             opj_stream_private_t *p_stream,
3022
                             opj_event_mgr_t * p_manager
3023
                            )
3024
0
{
3025
0
    return opj_j2k_decode_tile(p_jp2->j2k, p_tile_index, p_data, p_data_size,
3026
0
                               p_stream, p_manager);
3027
0
}
3028
3029
void opj_jp2_destroy(opj_jp2_t *jp2)
3030
13.3k
{
3031
13.3k
    if (jp2) {
3032
        /* destroy the J2K codec */
3033
13.3k
        opj_j2k_destroy(jp2->j2k);
3034
13.3k
        jp2->j2k = 00;
3035
3036
13.3k
        if (jp2->comps) {
3037
12.8k
            opj_free(jp2->comps);
3038
12.8k
            jp2->comps = 00;
3039
12.8k
        }
3040
3041
13.3k
        if (jp2->cl) {
3042
12.9k
            opj_free(jp2->cl);
3043
12.9k
            jp2->cl = 00;
3044
12.9k
        }
3045
3046
13.3k
        if (jp2->color.icc_profile_buf) {
3047
0
            opj_free(jp2->color.icc_profile_buf);
3048
0
            jp2->color.icc_profile_buf = 00;
3049
0
        }
3050
3051
13.3k
        if (jp2->color.jp2_cdef) {
3052
3
            if (jp2->color.jp2_cdef->info) {
3053
3
                opj_free(jp2->color.jp2_cdef->info);
3054
3
                jp2->color.jp2_cdef->info = NULL;
3055
3
            }
3056
3057
3
            opj_free(jp2->color.jp2_cdef);
3058
3
            jp2->color.jp2_cdef = 00;
3059
3
        }
3060
3061
13.3k
        if (jp2->color.jp2_pclr) {
3062
11
            if (jp2->color.jp2_pclr->cmap) {
3063
11
                opj_free(jp2->color.jp2_pclr->cmap);
3064
11
                jp2->color.jp2_pclr->cmap = NULL;
3065
11
            }
3066
11
            if (jp2->color.jp2_pclr->channel_sign) {
3067
11
                opj_free(jp2->color.jp2_pclr->channel_sign);
3068
11
                jp2->color.jp2_pclr->channel_sign = NULL;
3069
11
            }
3070
11
            if (jp2->color.jp2_pclr->channel_size) {
3071
11
                opj_free(jp2->color.jp2_pclr->channel_size);
3072
11
                jp2->color.jp2_pclr->channel_size = NULL;
3073
11
            }
3074
11
            if (jp2->color.jp2_pclr->entries) {
3075
11
                opj_free(jp2->color.jp2_pclr->entries);
3076
11
                jp2->color.jp2_pclr->entries = NULL;
3077
11
            }
3078
3079
11
            opj_free(jp2->color.jp2_pclr);
3080
11
            jp2->color.jp2_pclr = 00;
3081
11
        }
3082
3083
13.3k
        if (jp2->m_validation_list) {
3084
13.3k
            opj_procedure_list_destroy(jp2->m_validation_list);
3085
13.3k
            jp2->m_validation_list = 00;
3086
13.3k
        }
3087
3088
13.3k
        if (jp2->m_procedure_list) {
3089
13.3k
            opj_procedure_list_destroy(jp2->m_procedure_list);
3090
13.3k
            jp2->m_procedure_list = 00;
3091
13.3k
        }
3092
3093
13.3k
        opj_free(jp2);
3094
13.3k
    }
3095
13.3k
}
3096
3097
OPJ_BOOL opj_jp2_set_decoded_components(opj_jp2_t *p_jp2,
3098
                                        OPJ_UINT32 numcomps,
3099
                                        const OPJ_UINT32* comps_indices,
3100
                                        opj_event_mgr_t * p_manager)
3101
0
{
3102
0
    return opj_j2k_set_decoded_components(p_jp2->j2k,
3103
0
                                          numcomps, comps_indices,
3104
0
                                          p_manager);
3105
0
}
3106
3107
OPJ_BOOL opj_jp2_set_decode_area(opj_jp2_t *p_jp2,
3108
                                 opj_image_t* p_image,
3109
                                 OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
3110
                                 OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
3111
                                 opj_event_mgr_t * p_manager
3112
                                )
3113
0
{
3114
0
    return opj_j2k_set_decode_area(p_jp2->j2k, p_image, p_start_x, p_start_y,
3115
0
                                   p_end_x, p_end_y, p_manager);
3116
0
}
3117
3118
OPJ_BOOL opj_jp2_get_tile(opj_jp2_t *p_jp2,
3119
                          opj_stream_private_t *p_stream,
3120
                          opj_image_t* p_image,
3121
                          opj_event_mgr_t * p_manager,
3122
                          OPJ_UINT32 tile_index
3123
                         )
3124
0
{
3125
0
    if (!p_image) {
3126
0
        return OPJ_FALSE;
3127
0
    }
3128
3129
0
    opj_event_msg(p_manager, EVT_WARNING,
3130
0
                  "JP2 box which are after the codestream will not be read by this function.\n");
3131
3132
0
    if (! opj_j2k_get_tile(p_jp2->j2k, p_stream, p_image, p_manager, tile_index)) {
3133
0
        opj_event_msg(p_manager, EVT_ERROR,
3134
0
                      "Failed to decode the codestream in the JP2 file\n");
3135
0
        return OPJ_FALSE;
3136
0
    }
3137
3138
0
    return opj_jp2_apply_color_postprocessing(p_jp2, p_image, p_manager);
3139
0
}
3140
3141
/* ----------------------------------------------------------------------- */
3142
/* JP2 encoder interface                                             */
3143
/* ----------------------------------------------------------------------- */
3144
3145
opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder)
3146
13.3k
{
3147
13.3k
    opj_jp2_t *jp2 = (opj_jp2_t*)opj_calloc(1, sizeof(opj_jp2_t));
3148
13.3k
    if (jp2) {
3149
3150
        /* create the J2K codec */
3151
13.3k
        if (! p_is_decoder) {
3152
0
            jp2->j2k = opj_j2k_create_compress();
3153
13.3k
        } else {
3154
13.3k
            jp2->j2k = opj_j2k_create_decompress();
3155
13.3k
        }
3156
3157
13.3k
        if (jp2->j2k == 00) {
3158
0
            opj_jp2_destroy(jp2);
3159
0
            return 00;
3160
0
        }
3161
3162
        /* Color structure */
3163
13.3k
        jp2->color.icc_profile_buf = NULL;
3164
13.3k
        jp2->color.icc_profile_len = 0;
3165
13.3k
        jp2->color.jp2_cdef = NULL;
3166
13.3k
        jp2->color.jp2_pclr = NULL;
3167
13.3k
        jp2->color.jp2_has_colr = 0;
3168
3169
        /* validation list creation */
3170
13.3k
        jp2->m_validation_list = opj_procedure_list_create();
3171
13.3k
        if (! jp2->m_validation_list) {
3172
0
            opj_jp2_destroy(jp2);
3173
0
            return 00;
3174
0
        }
3175
3176
        /* execution list creation */
3177
13.3k
        jp2->m_procedure_list = opj_procedure_list_create();
3178
13.3k
        if (! jp2->m_procedure_list) {
3179
0
            opj_jp2_destroy(jp2);
3180
0
            return 00;
3181
0
        }
3182
13.3k
    }
3183
3184
13.3k
    return jp2;
3185
13.3k
}
3186
3187
void jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream)
3188
0
{
3189
    /* preconditions */
3190
0
    assert(p_jp2 != 00);
3191
3192
0
    j2k_dump(p_jp2->j2k,
3193
0
             flag,
3194
0
             out_stream);
3195
0
}
3196
3197
opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2)
3198
0
{
3199
0
    return j2k_get_cstr_index(p_jp2->j2k);
3200
0
}
3201
3202
opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2)
3203
0
{
3204
0
    return j2k_get_cstr_info(p_jp2->j2k);
3205
0
}
3206
3207
OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,
3208
        OPJ_UINT32 res_factor,
3209
        opj_event_mgr_t * p_manager)
3210
0
{
3211
0
    return opj_j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);
3212
0
}
3213
3214
/* ----------------------------------------------------------------------- */
3215
3216
OPJ_BOOL opj_jp2_encoder_set_extra_options(
3217
    opj_jp2_t *p_jp2,
3218
    const char* const* p_options,
3219
    opj_event_mgr_t * p_manager)
3220
0
{
3221
0
    return opj_j2k_encoder_set_extra_options(p_jp2->j2k, p_options, p_manager);
3222
0
}
3223
3224
/* ----------------------------------------------------------------------- */
3225
3226
/* JPIP specific */
3227
3228
#ifdef USE_JPIP
3229
static OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,
3230
                                    opj_stream_private_t *cio,
3231
                                    opj_event_mgr_t * p_manager)
3232
0
{
3233
0
    OPJ_OFF_T j2k_codestream_exit;
3234
0
    OPJ_BYTE l_data_header [24];
3235
3236
    /* preconditions */
3237
0
    assert(jp2 != 00);
3238
0
    assert(cio != 00);
3239
0
    assert(p_manager != 00);
3240
0
    assert(opj_stream_has_seek(cio));
3241
3242
0
    j2k_codestream_exit = opj_stream_tell(cio);
3243
0
    opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
3244
0
    opj_write_bytes(l_data_header + 4, JPIP_IPTR,
3245
0
                    4);                                      /* IPTR */
3246
#if 0
3247
    opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
3248
    opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
3249
#else
3250
0
    opj_write_double(l_data_header + 4 + 4, 0); /* offset */
3251
0
    opj_write_double(l_data_header + 8 + 8, 0); /* length */
3252
0
#endif
3253
3254
0
    if (! opj_stream_seek(cio, jp2->jpip_iptr_offset, p_manager)) {
3255
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
3256
0
        return OPJ_FALSE;
3257
0
    }
3258
3259
0
    if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
3260
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
3261
0
        return OPJ_FALSE;
3262
0
    }
3263
3264
0
    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
3265
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
3266
0
        return OPJ_FALSE;
3267
0
    }
3268
3269
0
    return OPJ_TRUE;
3270
0
}
3271
3272
static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
3273
                                    opj_stream_private_t *cio,
3274
                                    opj_event_mgr_t * p_manager)
3275
0
{
3276
0
    OPJ_OFF_T j2k_codestream_exit;
3277
0
    OPJ_BYTE l_data_header [24];
3278
3279
0
    OPJ_UNUSED(jp2);
3280
3281
    /* preconditions */
3282
0
    assert(jp2 != 00);
3283
0
    assert(cio != 00);
3284
0
    assert(p_manager != 00);
3285
0
    assert(opj_stream_has_seek(cio));
3286
3287
0
    opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
3288
0
    opj_write_bytes(l_data_header + 4, JPIP_FIDX,
3289
0
                    4);                                      /* IPTR */
3290
0
    opj_write_double(l_data_header + 4 + 4, 0); /* offset */
3291
0
    opj_write_double(l_data_header + 8 + 8, 0); /* length */
3292
3293
0
    if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
3294
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
3295
0
        return OPJ_FALSE;
3296
0
    }
3297
3298
0
    j2k_codestream_exit = opj_stream_tell(cio);
3299
0
    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
3300
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
3301
0
        return OPJ_FALSE;
3302
0
    }
3303
3304
0
    return OPJ_TRUE;
3305
0
}
3306
3307
static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
3308
                                    opj_stream_private_t *cio,
3309
                                    opj_event_mgr_t * p_manager)
3310
0
{
3311
0
    OPJ_OFF_T j2k_codestream_exit;
3312
0
    OPJ_BYTE l_data_header [24];
3313
3314
0
    OPJ_UNUSED(jp2);
3315
3316
    /* preconditions */
3317
0
    assert(jp2 != 00);
3318
0
    assert(cio != 00);
3319
0
    assert(p_manager != 00);
3320
0
    assert(opj_stream_has_seek(cio));
3321
3322
0
    j2k_codestream_exit = opj_stream_tell(cio);
3323
0
    opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
3324
0
    opj_write_bytes(l_data_header + 4, JPIP_CIDX,
3325
0
                    4);                                      /* IPTR */
3326
#if 0
3327
    opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
3328
    opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
3329
#else
3330
0
    opj_write_double(l_data_header + 4 + 4, 0); /* offset */
3331
0
    opj_write_double(l_data_header + 8 + 8, 0); /* length */
3332
0
#endif
3333
3334
0
    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
3335
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
3336
0
        return OPJ_FALSE;
3337
0
    }
3338
3339
0
    if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
3340
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
3341
0
        return OPJ_FALSE;
3342
0
    }
3343
3344
0
    j2k_codestream_exit = opj_stream_tell(cio);
3345
0
    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
3346
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
3347
0
        return OPJ_FALSE;
3348
0
    }
3349
3350
0
    return OPJ_TRUE;
3351
0
}
3352
3353
#if 0
3354
static void write_prxy(int offset_jp2c, int length_jp2c, int offset_idx,
3355
                       int length_idx, opj_stream_private_t *cio,
3356
                       opj_event_mgr_t * p_manager)
3357
{
3358
    OPJ_BYTE l_data_header [8];
3359
    OPJ_OFF_T len, lenp;
3360
3361
    lenp = opj_stream_tell(cio);
3362
    opj_stream_skip(cio, 4, p_manager);         /* L [at the end] */
3363
    opj_write_bytes(l_data_header, JPIP_PRXY, 4); /* IPTR           */
3364
    opj_stream_write_data(cio, l_data_header, 4, p_manager);
3365
3366
    opj_write_bytes(l_data_header, offset_jp2c, 8);  /* OOFF           */
3367
    opj_stream_write_data(cio, l_data_header, 8, p_manager);
3368
    opj_write_bytes(l_data_header, length_jp2c, 4);  /* OBH part 1     */
3369
    opj_write_bytes(l_data_header + 4, JP2_JP2C, 4); /* OBH part 2     */
3370
    opj_stream_write_data(cio, l_data_header, 8, p_manager);
3371
3372
    opj_write_bytes(l_data_header, 1, 1); /* NI             */
3373
    opj_stream_write_data(cio, l_data_header, 1, p_manager);
3374
3375
    opj_write_bytes(l_data_header, offset_idx, 8);   /* IOFF           */
3376
    opj_stream_write_data(cio, l_data_header, 8, p_manager);
3377
    opj_write_bytes(l_data_header, length_idx, 4);   /* IBH part 1     */
3378
    opj_write_bytes(l_data_header + 4, JPIP_CIDX, 4);  /* IBH part 2     */
3379
    opj_stream_write_data(cio, l_data_header, 8, p_manager);
3380
3381
    len = opj_stream_tell(cio) - lenp;
3382
    opj_stream_skip(cio, lenp, p_manager);
3383
    opj_write_bytes(l_data_header, len, 4); /* L              */
3384
    opj_stream_write_data(cio, l_data_header, 4, p_manager);
3385
    opj_stream_seek(cio, lenp + len, p_manager);
3386
}
3387
#endif
3388
3389
3390
#if 0
3391
static int write_fidx(int offset_jp2c, int length_jp2c, int offset_idx,
3392
                      int length_idx, opj_stream_private_t *cio,
3393
                      opj_event_mgr_t * p_manager)
3394
{
3395
    OPJ_BYTE l_data_header [4];
3396
    OPJ_OFF_T len, lenp;
3397
3398
    lenp = opj_stream_tell(cio);
3399
    opj_stream_skip(cio, 4, p_manager);
3400
    opj_write_bytes(l_data_header, JPIP_FIDX, 4); /* FIDX */
3401
    opj_stream_write_data(cio, l_data_header, 4, p_manager);
3402
3403
    write_prxy(offset_jp2c, length_jp2c, offset_idx, length_idx, cio, p_manager);
3404
3405
    len = opj_stream_tell(cio) - lenp;
3406
    opj_stream_skip(cio, lenp, p_manager);
3407
    opj_write_bytes(l_data_header, len, 4); /* L              */
3408
    opj_stream_write_data(cio, l_data_header, 4, p_manager);
3409
    opj_stream_seek(cio, lenp + len, p_manager);
3410
3411
    return len;
3412
}
3413
#endif
3414
#endif /* USE_JPIP */