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