Home | History | Annotate | Download | only in libopenjpeg20
      1 /*
      2  * The copyright in this software is being made available under the 2-clauses
      3  * BSD License, included below. This software may be subject to other third
      4  * party and contributor rights, including patent rights, and no such rights
      5  * are granted under this license.
      6  *
      7  * Copyright (c) 2005, Herve Drolon, FreeImage Team
      8  * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
      9  * Copyright (c) 2012, CS Systemes d'Information, France
     10  * All rights reserved.
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  * 1. Redistributions of source code must retain the above copyright
     16  *    notice, this list of conditions and the following disclaimer.
     17  * 2. Redistributions in binary form must reproduce the above copyright
     18  *    notice, this list of conditions and the following disclaimer in the
     19  *    documentation and/or other materials provided with the distribution.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
     22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31  * POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 #ifdef _WIN32
     35 #include <windows.h>
     36 #endif /* _WIN32 */
     37 
     38 #include "opj_includes.h"
     39 
     40 
     41 /* ---------------------------------------------------------------------- */
     42 /* Functions to set the message handlers */
     43 
     44 OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(	opj_codec_t * p_codec,
     45 											opj_msg_callback p_callback,
     46 											void * p_user_data)
     47 {
     48 	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
     49 	if(! l_codec){
     50 		return OPJ_FALSE;
     51 	}
     52 
     53 	l_codec->m_event_mgr.info_handler = p_callback;
     54 	l_codec->m_event_mgr.m_info_data = p_user_data;
     55 
     56 	return OPJ_TRUE;
     57 }
     58 
     59 OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(	opj_codec_t * p_codec,
     60 												opj_msg_callback p_callback,
     61 												void * p_user_data)
     62 {
     63 	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
     64 	if (! l_codec) {
     65 		return OPJ_FALSE;
     66 	}
     67 
     68 	l_codec->m_event_mgr.warning_handler = p_callback;
     69 	l_codec->m_event_mgr.m_warning_data = p_user_data;
     70 
     71 	return OPJ_TRUE;
     72 }
     73 
     74 OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec,
     75 											opj_msg_callback p_callback,
     76 											void * p_user_data)
     77 {
     78 	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
     79 	if (! l_codec) {
     80 		return OPJ_FALSE;
     81 	}
     82 
     83 	l_codec->m_event_mgr.error_handler = p_callback;
     84 	l_codec->m_event_mgr.m_error_data = p_user_data;
     85 
     86 	return OPJ_TRUE;
     87 }
     88 
     89 /* ---------------------------------------------------------------------- */
     90 
     91 static OPJ_SIZE_T opj_read_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)
     92 {
     93 	OPJ_SIZE_T l_nb_read = fread(p_buffer,1,p_nb_bytes,p_file);
     94 	return l_nb_read ? l_nb_read : (OPJ_SIZE_T)-1;
     95 }
     96 
     97 static OPJ_UINT64 opj_get_data_length_from_file (FILE * p_file)
     98 {
     99 	OPJ_OFF_T file_length = 0;
    100 
    101 	OPJ_FSEEK(p_file, 0, SEEK_END);
    102 	file_length = (OPJ_OFF_T)OPJ_FTELL(p_file);
    103 	OPJ_FSEEK(p_file, 0, SEEK_SET);
    104 
    105 	return (OPJ_UINT64)file_length;
    106 }
    107 
    108 static OPJ_SIZE_T opj_write_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)
    109 {
    110 	return fwrite(p_buffer,1,p_nb_bytes,p_file);
    111 }
    112 
    113 static OPJ_OFF_T opj_skip_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
    114 {
    115 	if (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_CUR)) {
    116 		return -1;
    117 	}
    118 
    119 	return p_nb_bytes;
    120 }
    121 
    122 static OPJ_BOOL opj_seek_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
    123 {
    124 	if (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_SET)) {
    125 		return OPJ_FALSE;
    126 	}
    127 
    128 	return OPJ_TRUE;
    129 }
    130 
    131 /* ---------------------------------------------------------------------- */
    132 #ifdef _WIN32
    133 #ifndef OPJ_STATIC
    134 BOOL APIENTRY
    135 DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    136 
    137 	OPJ_ARG_NOT_USED(lpReserved);
    138 	OPJ_ARG_NOT_USED(hModule);
    139 
    140 	switch (ul_reason_for_call) {
    141 		case DLL_PROCESS_ATTACH :
    142 			break;
    143 		case DLL_PROCESS_DETACH :
    144 			break;
    145 		case DLL_THREAD_ATTACH :
    146 		case DLL_THREAD_DETACH :
    147 			break;
    148     }
    149 
    150     return TRUE;
    151 }
    152 #endif /* OPJ_STATIC */
    153 #endif /* _WIN32 */
    154 
    155 /* ---------------------------------------------------------------------- */
    156 
    157 const char* OPJ_CALLCONV opj_version(void) {
    158     return OPJ_PACKAGE_VERSION;
    159 }
    160 
    161 /* ---------------------------------------------------------------------- */
    162 /* DECOMPRESSION FUNCTIONS*/
    163 
    164 opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT p_format)
    165 {
    166 	opj_codec_private_t *l_codec = 00;
    167 
    168 	l_codec = (opj_codec_private_t*) opj_calloc(1, sizeof(opj_codec_private_t));
    169 	if (!l_codec){
    170 		return 00;
    171 	}
    172 	memset(l_codec, 0, sizeof(opj_codec_private_t));
    173 
    174 	l_codec->is_decompressor = 1;
    175 
    176 	switch (p_format) {
    177 		case OPJ_CODEC_J2K:
    178 			l_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) j2k_dump;
    179 
    180 			l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) j2k_get_cstr_info;
    181 
    182 			l_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) j2k_get_cstr_index;
    183 
    184 			l_codec->m_codec_data.m_decompression.opj_decode =
    185 					(OPJ_BOOL (*) (	void *,
    186 									struct opj_stream_private *,
    187 									opj_image_t*, struct opj_event_mgr * )) opj_j2k_decode;
    188 
    189 			l_codec->m_codec_data.m_decompression.opj_end_decompress =
    190 					(OPJ_BOOL (*) (	void *,
    191 									struct opj_stream_private *,
    192 									struct opj_event_mgr *)) opj_j2k_end_decompress;
    193 
    194 			l_codec->m_codec_data.m_decompression.opj_read_header =
    195 					(OPJ_BOOL (*) (	struct opj_stream_private *,
    196 									void *,
    197 									opj_image_t **,
    198 									struct opj_event_mgr * )) opj_j2k_read_header;
    199 
    200 			l_codec->m_codec_data.m_decompression.opj_destroy =
    201 					(void (*) (void *))opj_j2k_destroy;
    202 
    203 			l_codec->m_codec_data.m_decompression.opj_setup_decoder =
    204 					(void (*) (void * , opj_dparameters_t * )) opj_j2k_setup_decoder;
    205 
    206 			l_codec->m_codec_data.m_decompression.opj_read_tile_header =
    207 					(OPJ_BOOL (*) (	void *,
    208 									OPJ_UINT32*,
    209 									OPJ_UINT32*,
    210 									OPJ_INT32*, OPJ_INT32*,
    211 									OPJ_INT32*, OPJ_INT32*,
    212 									OPJ_UINT32*,
    213 									OPJ_BOOL*,
    214 									struct opj_stream_private *,
    215 									struct opj_event_mgr * )) opj_j2k_read_tile_header;
    216 
    217 			l_codec->m_codec_data.m_decompression.opj_decode_tile_data =
    218 					(OPJ_BOOL (*) ( void *,
    219                                     OPJ_UINT32,
    220                                     OPJ_BYTE*,
    221                                     OPJ_UINT32,
    222                                     struct opj_stream_private *,
    223                                     struct opj_event_mgr *)) opj_j2k_decode_tile;
    224 
    225 			l_codec->m_codec_data.m_decompression.opj_set_decode_area =
    226 					(OPJ_BOOL (*) ( void *,
    227                                     opj_image_t*,
    228                                     OPJ_INT32, OPJ_INT32, OPJ_INT32, OPJ_INT32,
    229                                     struct opj_event_mgr *)) opj_j2k_set_decode_area;
    230 
    231 			l_codec->m_codec_data.m_decompression.opj_get_decoded_tile =
    232                     (OPJ_BOOL (*) ( void *p_codec,
    233 								    opj_stream_private_t *p_cio,
    234 								    opj_image_t *p_image,
    235 								    struct opj_event_mgr * p_manager,
    236 								    OPJ_UINT32 tile_index)) opj_j2k_get_tile;
    237 
    238 			l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor =
    239                     (OPJ_BOOL (*) ( void * p_codec,
    240 									OPJ_UINT32 res_factor,
    241 									struct opj_event_mgr * p_manager)) opj_j2k_set_decoded_resolution_factor;
    242 
    243 			l_codec->m_codec = opj_j2k_create_decompress();
    244 
    245 			if (! l_codec->m_codec) {
    246 				opj_free(l_codec);
    247 				return NULL;
    248 			}
    249 
    250 			break;
    251 
    252 		case OPJ_CODEC_JP2:
    253 			/* get a JP2 decoder handle */
    254 			l_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) jp2_dump;
    255 
    256 			l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) jp2_get_cstr_info;
    257 
    258 			l_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) jp2_get_cstr_index;
    259 
    260 			l_codec->m_codec_data.m_decompression.opj_decode =
    261 					(OPJ_BOOL (*) (	void *,
    262 									struct opj_stream_private *,
    263 									opj_image_t*,
    264 									struct opj_event_mgr * )) opj_jp2_decode;
    265 
    266 			l_codec->m_codec_data.m_decompression.opj_end_decompress =
    267                     (OPJ_BOOL (*) ( void *,
    268                                     struct opj_stream_private *,
    269                                     struct opj_event_mgr *)) opj_jp2_end_decompress;
    270 
    271 			l_codec->m_codec_data.m_decompression.opj_read_header =
    272                     (OPJ_BOOL (*) ( struct opj_stream_private *,
    273 					                void *,
    274 					                opj_image_t **,
    275 					                struct opj_event_mgr * )) opj_jp2_read_header;
    276 
    277 			l_codec->m_codec_data.m_decompression.opj_read_tile_header =
    278                     (OPJ_BOOL (*) ( void *,
    279 					                OPJ_UINT32*,
    280 					                OPJ_UINT32*,
    281 					                OPJ_INT32*,
    282 					                OPJ_INT32*,
    283 					                OPJ_INT32 * ,
    284 					                OPJ_INT32 * ,
    285 					                OPJ_UINT32 * ,
    286 					                OPJ_BOOL *,
    287 					                struct opj_stream_private *,
    288 					                struct opj_event_mgr * )) opj_jp2_read_tile_header;
    289 
    290 			l_codec->m_codec_data.m_decompression.opj_decode_tile_data =
    291                     (OPJ_BOOL (*) ( void *,
    292                                     OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,
    293                                     struct opj_stream_private *,
    294                                     struct opj_event_mgr * )) opj_jp2_decode_tile;
    295 
    296 			l_codec->m_codec_data.m_decompression.opj_destroy = (void (*) (void *))opj_jp2_destroy;
    297 
    298 			l_codec->m_codec_data.m_decompression.opj_setup_decoder =
    299                     (void (*) (void * ,opj_dparameters_t * )) opj_jp2_setup_decoder;
    300 
    301 			l_codec->m_codec_data.m_decompression.opj_set_decode_area =
    302                     (OPJ_BOOL (*) ( void *,
    303                                     opj_image_t*,
    304                                     OPJ_INT32,OPJ_INT32,OPJ_INT32,OPJ_INT32,
    305                                     struct opj_event_mgr * )) opj_jp2_set_decode_area;
    306 
    307 			l_codec->m_codec_data.m_decompression.opj_get_decoded_tile =
    308                     (OPJ_BOOL (*) ( void *p_codec,
    309 									opj_stream_private_t *p_cio,
    310 									opj_image_t *p_image,
    311 									struct opj_event_mgr * p_manager,
    312 									OPJ_UINT32 tile_index)) opj_jp2_get_tile;
    313 
    314 			l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor =
    315                     (OPJ_BOOL (*) ( void * p_codec,
    316 						    		OPJ_UINT32 res_factor,
    317 							    	opj_event_mgr_t * p_manager)) opj_jp2_set_decoded_resolution_factor;
    318 
    319 			l_codec->m_codec = opj_jp2_create(OPJ_TRUE);
    320 
    321 			if (! l_codec->m_codec) {
    322 				opj_free(l_codec);
    323 				return 00;
    324 			}
    325 
    326 			break;
    327 		case OPJ_CODEC_UNKNOWN:
    328 		case OPJ_CODEC_JPT:
    329 		default:
    330 			opj_free(l_codec);
    331 			return 00;
    332 	}
    333 
    334 	opj_set_default_event_handler(&(l_codec->m_event_mgr));
    335 	return (opj_codec_t*) l_codec;
    336 }
    337 
    338 void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {
    339 	if(parameters) {
    340 		memset(parameters, 0, sizeof(opj_dparameters_t));
    341 		/* default decoding parameters */
    342 		parameters->cp_layer = 0;
    343 		parameters->cp_reduce = 0;
    344 
    345 		parameters->decod_format = -1;
    346 		parameters->cod_format = -1;
    347 		parameters->flags = 0;
    348 /* UniPG>> */
    349 #ifdef USE_JPWL
    350 		parameters->jpwl_correct = OPJ_FALSE;
    351 		parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
    352 		parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
    353 #endif /* USE_JPWL */
    354 /* <<UniPG */
    355 	}
    356 }
    357 
    358 OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
    359                                         opj_dparameters_t *parameters
    360 										)
    361 {
    362 	if (p_codec && parameters) {
    363 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    364 
    365 		if (! l_codec->is_decompressor) {
    366 			opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR,
    367                 "Codec provided to the opj_setup_decoder function is not a decompressor handler.\n");
    368 			return OPJ_FALSE;
    369 		}
    370 
    371 		l_codec->m_codec_data.m_decompression.opj_setup_decoder(l_codec->m_codec,
    372 																parameters);
    373 		return OPJ_TRUE;
    374 	}
    375 	return OPJ_FALSE;
    376 }
    377 
    378 OPJ_BOOL OPJ_CALLCONV opj_read_header (	opj_stream_t *p_stream,
    379 										opj_codec_t *p_codec,
    380 										opj_image_t **p_image )
    381 {
    382 	if (p_codec && p_stream) {
    383 		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
    384 		opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
    385 
    386 		if(! l_codec->is_decompressor) {
    387 			opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR,
    388                 "Codec provided to the opj_read_header function is not a decompressor handler.\n");
    389 			return OPJ_FALSE;
    390 		}
    391 
    392 		return l_codec->m_codec_data.m_decompression.opj_read_header(	l_stream,
    393 																		l_codec->m_codec,
    394 																		p_image,
    395 																		&(l_codec->m_event_mgr) );
    396 	}
    397 
    398 	return OPJ_FALSE;
    399 }
    400 
    401 OPJ_BOOL OPJ_CALLCONV opj_decode(   opj_codec_t *p_codec,
    402                                     opj_stream_t *p_stream,
    403                                     opj_image_t* p_image)
    404 {
    405 	if (p_codec && p_stream) {
    406 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    407 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    408 
    409 		if (! l_codec->is_decompressor) {
    410 			return OPJ_FALSE;
    411 		}
    412 
    413 		return l_codec->m_codec_data.m_decompression.opj_decode(l_codec->m_codec,
    414 																l_stream,
    415 																p_image,
    416 																&(l_codec->m_event_mgr) );
    417 	}
    418 
    419 	return OPJ_FALSE;
    420 }
    421 
    422 OPJ_BOOL OPJ_CALLCONV opj_set_decode_area(	opj_codec_t *p_codec,
    423 											opj_image_t* p_image,
    424 											OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
    425 											OPJ_INT32 p_end_x, OPJ_INT32 p_end_y
    426 											)
    427 {
    428 	if (p_codec) {
    429 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    430 
    431 		if (! l_codec->is_decompressor) {
    432 			return OPJ_FALSE;
    433 		}
    434 
    435 		return  l_codec->m_codec_data.m_decompression.opj_set_decode_area(	l_codec->m_codec,
    436 																			p_image,
    437 																			p_start_x, p_start_y,
    438 																			p_end_x, p_end_y,
    439 																			&(l_codec->m_event_mgr) );
    440 	}
    441 	return OPJ_FALSE;
    442 }
    443 
    444 OPJ_BOOL OPJ_CALLCONV opj_read_tile_header(	opj_codec_t *p_codec,
    445 											opj_stream_t * p_stream,
    446 											OPJ_UINT32 * p_tile_index,
    447 											OPJ_UINT32 * p_data_size,
    448 											OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
    449 											OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
    450 											OPJ_UINT32 * p_nb_comps,
    451 											OPJ_BOOL * p_should_go_on)
    452 {
    453 	if (p_codec && p_stream && p_data_size && p_tile_index) {
    454 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    455 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    456 
    457 		if (! l_codec->is_decompressor) {
    458 			return OPJ_FALSE;
    459 		}
    460 
    461 		return l_codec->m_codec_data.m_decompression.opj_read_tile_header(	l_codec->m_codec,
    462 																			p_tile_index,
    463 																			p_data_size,
    464 																			p_tile_x0, p_tile_y0,
    465 																			p_tile_x1, p_tile_y1,
    466 																			p_nb_comps,
    467 																			p_should_go_on,
    468 																			l_stream,
    469 																			&(l_codec->m_event_mgr));
    470 	}
    471 	return OPJ_FALSE;
    472 }
    473 
    474 OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(	opj_codec_t *p_codec,
    475 											OPJ_UINT32 p_tile_index,
    476 											OPJ_BYTE * p_data,
    477 											OPJ_UINT32 p_data_size,
    478 											opj_stream_t *p_stream
    479 											)
    480 {
    481 	if (p_codec && p_data && p_stream) {
    482 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    483 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    484 
    485 		if (! l_codec->is_decompressor) {
    486 			return OPJ_FALSE;
    487 		}
    488 
    489 		return l_codec->m_codec_data.m_decompression.opj_decode_tile_data(	l_codec->m_codec,
    490 																			p_tile_index,
    491 																			p_data,
    492 																			p_data_size,
    493 																			l_stream,
    494 																			&(l_codec->m_event_mgr) );
    495 	}
    496 	return OPJ_FALSE;
    497 }
    498 
    499 OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(	opj_codec_t *p_codec,
    500 											opj_stream_t *p_stream,
    501 											opj_image_t *p_image,
    502 											OPJ_UINT32 tile_index)
    503 {
    504 	if (p_codec && p_stream) {
    505 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    506 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    507 
    508 		if (! l_codec->is_decompressor) {
    509 			return OPJ_FALSE;
    510 		}
    511 
    512 		return l_codec->m_codec_data.m_decompression.opj_get_decoded_tile(	l_codec->m_codec,
    513 																			l_stream,
    514 																			p_image,
    515 																			&(l_codec->m_event_mgr),
    516 																			tile_index);
    517 	}
    518 
    519 	return OPJ_FALSE;
    520 }
    521 
    522 OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec,
    523 														OPJ_UINT32 res_factor )
    524 {
    525 	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    526 
    527 	if ( !l_codec ){
    528 		fprintf(stderr, "[ERROR] Input parameters of the setup_decoder function are incorrect.\n");
    529 		return OPJ_FALSE;
    530 	}
    531 
    532 	l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor(l_codec->m_codec,
    533 																			res_factor,
    534 																			&(l_codec->m_event_mgr) );
    535 	return OPJ_TRUE;
    536 }
    537 
    538 /* ---------------------------------------------------------------------- */
    539 /* COMPRESSION FUNCTIONS*/
    540 
    541 opj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT p_format)
    542 {
    543 	opj_codec_private_t *l_codec = 00;
    544 
    545 	l_codec = (opj_codec_private_t*)opj_calloc(1, sizeof(opj_codec_private_t));
    546 	if (!l_codec) {
    547 		return 00;
    548 	}
    549 	memset(l_codec, 0, sizeof(opj_codec_private_t));
    550 
    551 	l_codec->is_decompressor = 0;
    552 
    553 	switch(p_format) {
    554 		case OPJ_CODEC_J2K:
    555 			l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,
    556 																			struct opj_stream_private *,
    557 																			struct opj_event_mgr * )) opj_j2k_encode;
    558 
    559 			l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) (	void *,
    560 																					struct opj_stream_private *,
    561 																					struct opj_event_mgr *)) opj_j2k_end_compress;
    562 
    563 			l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,
    564 																					struct opj_stream_private *,
    565 																					struct opj_image * ,
    566 																					struct opj_event_mgr *)) opj_j2k_start_compress;
    567 
    568 			l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,
    569 																				OPJ_UINT32,
    570 																				OPJ_BYTE*,
    571 																				OPJ_UINT32,
    572 																				struct opj_stream_private *,
    573 																				struct opj_event_mgr *) ) opj_j2k_write_tile;
    574 
    575 			l_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_j2k_destroy;
    576 
    577 			l_codec->m_codec_data.m_compression.opj_setup_encoder = (void (*) (	void *,
    578 																				opj_cparameters_t *,
    579 																				struct opj_image *,
    580 																				struct opj_event_mgr * )) opj_j2k_setup_encoder;
    581 
    582 			l_codec->m_codec = opj_j2k_create_compress();
    583 			if (! l_codec->m_codec) {
    584 				opj_free(l_codec);
    585 				return 00;
    586 			}
    587 
    588 			break;
    589 
    590 		case OPJ_CODEC_JP2:
    591 			/* get a JP2 decoder handle */
    592 			l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,
    593 																			struct opj_stream_private *,
    594 																			struct opj_event_mgr * )) opj_jp2_encode;
    595 
    596 			l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) (	void *,
    597 																					struct opj_stream_private *,
    598 																					struct opj_event_mgr *)) opj_jp2_end_compress;
    599 
    600 			l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,
    601 																					struct opj_stream_private *,
    602 																					struct opj_image * ,
    603 																					struct opj_event_mgr *))  opj_jp2_start_compress;
    604 
    605 			l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,
    606 																				OPJ_UINT32,
    607 																				OPJ_BYTE*,
    608 																				OPJ_UINT32,
    609 																				struct opj_stream_private *,
    610 																				struct opj_event_mgr *)) opj_jp2_write_tile;
    611 
    612 			l_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_jp2_destroy;
    613 
    614 			l_codec->m_codec_data.m_compression.opj_setup_encoder = (void (*) (	void *,
    615 																				opj_cparameters_t *,
    616 																				struct opj_image *,
    617 																				struct opj_event_mgr * )) opj_jp2_setup_encoder;
    618 
    619 			l_codec->m_codec = opj_jp2_create(OPJ_FALSE);
    620 			if (! l_codec->m_codec) {
    621 				opj_free(l_codec);
    622 				return 00;
    623 			}
    624 
    625 			break;
    626 
    627 		case OPJ_CODEC_UNKNOWN:
    628 		case OPJ_CODEC_JPT:
    629 		default:
    630 			opj_free(l_codec);
    631 			return 00;
    632 	}
    633 
    634 	opj_set_default_event_handler(&(l_codec->m_event_mgr));
    635 	return (opj_codec_t*) l_codec;
    636 }
    637 
    638 void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
    639 	if(parameters) {
    640 		memset(parameters, 0, sizeof(opj_cparameters_t));
    641 		/* default coding parameters */
    642 		parameters->cp_cinema = OPJ_OFF;
    643 		parameters->max_comp_size = 0;
    644 		parameters->numresolution = 6;
    645 		parameters->cp_rsiz = OPJ_STD_RSIZ;
    646 		parameters->cblockw_init = 64;
    647 		parameters->cblockh_init = 64;
    648 		parameters->prog_order = OPJ_LRCP;
    649 		parameters->roi_compno = -1;		/* no ROI */
    650 		parameters->subsampling_dx = 1;
    651 		parameters->subsampling_dy = 1;
    652 		parameters->tp_on = 0;
    653 		parameters->decod_format = -1;
    654 		parameters->cod_format = -1;
    655 		parameters->tcp_rates[0] = 0;
    656 		parameters->tcp_numlayers = 0;
    657 		parameters->cp_disto_alloc = 0;
    658 		parameters->cp_fixed_alloc = 0;
    659 		parameters->cp_fixed_quality = 0;
    660 		parameters->jpip_on = OPJ_FALSE;
    661 /* UniPG>> */
    662 #ifdef USE_JPWL
    663 		parameters->jpwl_epc_on = OPJ_FALSE;
    664 		parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
    665 		{
    666 			int i;
    667 			for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
    668 				parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */
    669 				parameters->jpwl_hprot_TPH[i] = 0; /* absent */
    670 			}
    671 		};
    672 		{
    673 			int i;
    674 			for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
    675 				parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */
    676 				parameters->jpwl_pprot_packno[i] = -1; /* unassigned */
    677 				parameters->jpwl_pprot[i] = 0; /* absent */
    678 			}
    679 		};
    680 		parameters->jpwl_sens_size = 0; /* 0 means no ESD */
    681 		parameters->jpwl_sens_addr = 0; /* 0 means auto */
    682 		parameters->jpwl_sens_range = 0; /* 0 means packet */
    683 		parameters->jpwl_sens_MH = -1; /* -1 means unassigned */
    684 		{
    685 			int i;
    686 			for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
    687 				parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */
    688 				parameters->jpwl_sens_TPH[i] = -1; /* absent */
    689 			}
    690 		};
    691 #endif /* USE_JPWL */
    692 /* <<UniPG */
    693 	}
    694 }
    695 
    696 OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec,
    697 										opj_cparameters_t *parameters,
    698 										opj_image_t *p_image)
    699 {
    700 	if (p_codec && parameters && p_image) {
    701 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    702 
    703 		if (! l_codec->is_decompressor) {
    704 			l_codec->m_codec_data.m_compression.opj_setup_encoder(	l_codec->m_codec,
    705 																	parameters,
    706 																	p_image,
    707 																	&(l_codec->m_event_mgr) );
    708 			return OPJ_TRUE;
    709 		}
    710 	}
    711 
    712 	return OPJ_FALSE;
    713 }
    714 
    715 OPJ_BOOL OPJ_CALLCONV opj_start_compress (	opj_codec_t *p_codec,
    716 											opj_image_t * p_image,
    717 											opj_stream_t *p_stream)
    718 {
    719 	if (p_codec && p_stream) {
    720 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    721 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    722 
    723 		if (! l_codec->is_decompressor) {
    724 			return l_codec->m_codec_data.m_compression.opj_start_compress(	l_codec->m_codec,
    725 																			l_stream,
    726 																			p_image,
    727 																			&(l_codec->m_event_mgr));
    728 		}
    729 	}
    730 
    731 	return OPJ_FALSE;
    732 }
    733 
    734 OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_info, opj_stream_t *p_stream)
    735 {
    736 	if (p_info && p_stream) {
    737 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_info;
    738 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    739 
    740 		if (! l_codec->is_decompressor) {
    741 			return l_codec->m_codec_data.m_compression.opj_encode(	l_codec->m_codec,
    742 															l_stream,
    743 															&(l_codec->m_event_mgr));
    744 		}
    745 	}
    746 
    747 	return OPJ_FALSE;
    748 
    749 }
    750 
    751 OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,
    752 										opj_stream_t *p_stream)
    753 {
    754 	if (p_codec && p_stream) {
    755 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    756 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    757 
    758 		if (! l_codec->is_decompressor) {
    759 			return l_codec->m_codec_data.m_compression.opj_end_compress(l_codec->m_codec,
    760 																		l_stream,
    761 																		&(l_codec->m_event_mgr));
    762 		}
    763 	}
    764 	return OPJ_FALSE;
    765 
    766 }
    767 
    768 OPJ_BOOL OPJ_CALLCONV opj_end_decompress (	opj_codec_t *p_codec,
    769 											opj_stream_t *p_stream)
    770 {
    771 	if (p_codec && p_stream) {
    772 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    773 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    774 
    775 		if (! l_codec->is_decompressor) {
    776 			return OPJ_FALSE;
    777 		}
    778 
    779 		return l_codec->m_codec_data.m_decompression.opj_end_decompress(l_codec->m_codec,
    780 																		l_stream,
    781 																		&(l_codec->m_event_mgr) );
    782 	}
    783 
    784 	return OPJ_FALSE;
    785 }
    786 
    787 OPJ_BOOL OPJ_CALLCONV opj_set_MCT(opj_cparameters_t *parameters,
    788                                   OPJ_FLOAT32 * pEncodingMatrix,
    789                                   OPJ_INT32 * p_dc_shift,OPJ_UINT32 pNbComp)
    790 {
    791 	OPJ_UINT32 l_matrix_size = pNbComp * pNbComp * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
    792 	OPJ_UINT32 l_dc_shift_size = pNbComp * (OPJ_UINT32)sizeof(OPJ_INT32);
    793 	OPJ_UINT32 l_mct_total_size = l_matrix_size + l_dc_shift_size;
    794 
    795 	/* add MCT capability */
    796 	OPJ_INT32 rsiz = (OPJ_INT32)parameters->cp_rsiz | (OPJ_INT32)OPJ_MCT;
    797 	parameters->cp_rsiz = (OPJ_RSIZ_CAPABILITIES)rsiz;
    798 	parameters->irreversible = 1;
    799 
    800 	/* use array based MCT */
    801 	parameters->tcp_mct = 2;
    802 	parameters->mct_data = opj_malloc(l_mct_total_size);
    803 	if (! parameters->mct_data) {
    804 		return OPJ_FALSE;
    805 	}
    806 
    807 	memcpy(parameters->mct_data,pEncodingMatrix,l_matrix_size);
    808 	memcpy(((OPJ_BYTE *) parameters->mct_data) +  l_matrix_size,p_dc_shift,l_dc_shift_size);
    809 
    810 	return OPJ_TRUE;
    811 }
    812 
    813 OPJ_BOOL OPJ_CALLCONV opj_write_tile (	opj_codec_t *p_codec,
    814 										OPJ_UINT32 p_tile_index,
    815 										OPJ_BYTE * p_data,
    816 										OPJ_UINT32 p_data_size,
    817 										opj_stream_t *p_stream )
    818 {
    819 	if (p_codec && p_stream && p_data) {
    820 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    821 		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
    822 
    823 		if (l_codec->is_decompressor) {
    824 			return OPJ_FALSE;
    825 		}
    826 
    827 		return l_codec->m_codec_data.m_compression.opj_write_tile(	l_codec->m_codec,
    828 																	p_tile_index,
    829 																	p_data,
    830 																	p_data_size,
    831 																	l_stream,
    832 																	&(l_codec->m_event_mgr) );
    833 	}
    834 
    835 	return OPJ_FALSE;
    836 }
    837 
    838 /* ---------------------------------------------------------------------- */
    839 
    840 void OPJ_CALLCONV opj_destroy_codec(opj_codec_t *p_codec)
    841 {
    842 	if (p_codec) {
    843 		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
    844 
    845 		if (l_codec->is_decompressor) {
    846 			l_codec->m_codec_data.m_decompression.opj_destroy(l_codec->m_codec);
    847 		}
    848 		else {
    849 			l_codec->m_codec_data.m_compression.opj_destroy(l_codec->m_codec);
    850 		}
    851 
    852 		l_codec->m_codec = 00;
    853 		opj_free(l_codec);
    854 	}
    855 }
    856 
    857 /* ---------------------------------------------------------------------- */
    858 
    859 void OPJ_CALLCONV opj_dump_codec(	opj_codec_t *p_codec,
    860 									OPJ_INT32 info_flag,
    861 									FILE* output_stream)
    862 {
    863 	if (p_codec) {
    864 		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
    865 
    866 		l_codec->opj_dump_codec(l_codec->m_codec, info_flag, output_stream);
    867 		return;
    868 	}
    869 
    870 	fprintf(stderr, "[ERROR] Input parameter of the dump_codec function are incorrect.\n");
    871 	return;
    872 }
    873 
    874 opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec)
    875 {
    876 	if (p_codec) {
    877 		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
    878 
    879 		return l_codec->opj_get_codec_info(l_codec->m_codec);
    880 	}
    881 
    882 	return NULL;
    883 }
    884 
    885 void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info) {
    886 	if (cstr_info) {
    887 
    888 		if ((*cstr_info)->m_default_tile_info.tccp_info){
    889 			opj_free((*cstr_info)->m_default_tile_info.tccp_info);
    890 		}
    891 
    892 		if ((*cstr_info)->tile_info){
    893 			/* FIXME not used for the moment*/
    894 		}
    895 
    896 		opj_free((*cstr_info));
    897 		(*cstr_info) = NULL;
    898 	}
    899 }
    900 
    901 opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec)
    902 {
    903 	if (p_codec) {
    904 		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
    905 
    906 		return l_codec->opj_get_codec_index(l_codec->m_codec);
    907 	}
    908 
    909 	return NULL;
    910 }
    911 
    912 void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index)
    913 {
    914 	if (*p_cstr_index){
    915 		j2k_destroy_cstr_index(*p_cstr_index);
    916 		(*p_cstr_index) = NULL;
    917 	}
    918 }
    919 
    920 opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream_v3 (const char *fname, OPJ_BOOL p_is_read_stream)
    921 {
    922     return opj_stream_create_file_stream_v3(fname, OPJ_J2K_STREAM_CHUNK_SIZE, p_is_read_stream);
    923 }
    924 
    925 opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream_v3 (
    926         const char *fname,
    927 		OPJ_SIZE_T p_size,
    928         OPJ_BOOL p_is_read_stream)
    929 {
    930     opj_stream_t* l_stream = 00;
    931     FILE *p_file;
    932     const char *mode;
    933 
    934     if (! fname) {
    935         return NULL;
    936     }
    937 
    938     if(p_is_read_stream) mode = "rb"; else mode = "wb";
    939 
    940     p_file = fopen(fname, mode);
    941 
    942     if (! p_file) {
    943 	    return NULL;
    944     }
    945 
    946     l_stream = opj_stream_create(p_size,p_is_read_stream);
    947     if (! l_stream) {
    948         fclose(p_file);
    949         return NULL;
    950     }
    951 
    952     opj_stream_set_user_data_v3(l_stream, p_file, (opj_stream_free_user_data_fn) fclose);
    953     opj_stream_set_user_data_length(l_stream, opj_get_data_length_from_file(p_file));
    954     opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_file);
    955     opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_file);
    956     opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_file);
    957     opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_file);
    958 
    959     return l_stream;
    960 }
    961