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) 2002-2014, Universite catholique de Louvain (UCL), Belgium
      8  * Copyright (c) 2002-2014, Professor Benoit Macq
      9  * Copyright (c) 2001-2003, David Janssens
     10  * Copyright (c) 2002-2003, Yannick Verschueren
     11  * Copyright (c) 2003-2007, Francois-Olivier Devaux
     12  * Copyright (c) 2003-2014, Antonin Descampe
     13  * Copyright (c) 2005, Herve Drolon, FreeImage Team
     14  * Copyright (c) 2006-2007, Parvatha Elangovan
     15  * All rights reserved.
     16  *
     17  * Redistribution and use in source and binary forms, with or without
     18  * modification, are permitted provided that the following conditions
     19  * are met:
     20  * 1. Redistributions of source code must retain the above copyright
     21  *    notice, this list of conditions and the following disclaimer.
     22  * 2. Redistributions in binary form must reproduce the above copyright
     23  *    notice, this list of conditions and the following disclaimer in the
     24  *    documentation and/or other materials provided with the distribution.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
     27  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  * POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 
     39 #include "opj_includes.h"
     40 
     41 /** @defgroup PI PI - Implementation of a packet iterator */
     42 /*@{*/
     43 
     44 /** @name Local static functions */
     45 /*@{*/
     46 
     47 /**
     48 Get next packet in layer-resolution-component-precinct order.
     49 @param pi packet iterator to modify
     50 @return returns false if pi pointed to the last packet or else returns true
     51 */
     52 static OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi);
     53 /**
     54 Get next packet in resolution-layer-component-precinct order.
     55 @param pi packet iterator to modify
     56 @return returns false if pi pointed to the last packet or else returns true
     57 */
     58 static OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi);
     59 /**
     60 Get next packet in resolution-precinct-component-layer order.
     61 @param pi packet iterator to modify
     62 @return returns false if pi pointed to the last packet or else returns true
     63 */
     64 static OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi);
     65 /**
     66 Get next packet in precinct-component-resolution-layer order.
     67 @param pi packet iterator to modify
     68 @return returns false if pi pointed to the last packet or else returns true
     69 */
     70 static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi);
     71 /**
     72 Get next packet in component-precinct-resolution-layer order.
     73 @param pi packet iterator to modify
     74 @return returns false if pi pointed to the last packet or else returns true
     75 */
     76 static OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi);
     77 
     78 /**
     79  * Updates the coding parameters if the encoding is used with Progression order changes and final (or cinema parameters are used).
     80  *
     81  * @param	p_cp		the coding parameters to modify
     82  * @param	p_tileno	the tile index being concerned.
     83  * @param	p_tx0		X0 parameter for the tile
     84  * @param	p_tx1		X1 parameter for the tile
     85  * @param	p_ty0		Y0 parameter for the tile
     86  * @param	p_ty1		Y1 parameter for the tile
     87  * @param	p_max_prec	the maximum precision for all the bands of the tile
     88  * @param	p_max_res	the maximum number of resolutions for all the poc inside the tile.
     89  * @param	p_dx_min		the minimum dx of all the components of all the resolutions for the tile.
     90  * @param	p_dy_min		the minimum dy of all the components of all the resolutions for the tile.
     91  */
     92 static void opj_pi_update_encode_poc_and_final ( opj_cp_t *p_cp,
     93                                                  OPJ_UINT32 p_tileno,
     94                                                  OPJ_INT32 p_tx0,
     95                                                  OPJ_INT32 p_tx1,
     96                                                  OPJ_INT32 p_ty0,
     97                                                  OPJ_INT32 p_ty1,
     98                                                  OPJ_UINT32 p_max_prec,
     99                                                  OPJ_UINT32 p_max_res,
    100                                                  OPJ_UINT32 p_dx_min,
    101                                                  OPJ_UINT32 p_dy_min);
    102 
    103 /**
    104  * Updates the coding parameters if the encoding is not used with Progression order changes and final (and cinema parameters are used).
    105  *
    106  * @param	p_cp		the coding parameters to modify
    107  * @param	p_num_comps		the number of components
    108  * @param	p_tileno	the tile index being concerned.
    109  * @param	p_tx0		X0 parameter for the tile
    110  * @param	p_tx1		X1 parameter for the tile
    111  * @param	p_ty0		Y0 parameter for the tile
    112  * @param	p_ty1		Y1 parameter for the tile
    113  * @param	p_max_prec	the maximum precision for all the bands of the tile
    114  * @param	p_max_res	the maximum number of resolutions for all the poc inside the tile.
    115  * @param	p_dx_min		the minimum dx of all the components of all the resolutions for the tile.
    116  * @param	p_dy_min		the minimum dy of all the components of all the resolutions for the tile.
    117  */
    118 static void opj_pi_update_encode_not_poc (  opj_cp_t *p_cp,
    119                                             OPJ_UINT32 p_num_comps,
    120                                             OPJ_UINT32 p_tileno,
    121                                             OPJ_INT32 p_tx0,
    122                                             OPJ_INT32 p_tx1,
    123                                             OPJ_INT32 p_ty0,
    124                                             OPJ_INT32 p_ty1,
    125                                             OPJ_UINT32 p_max_prec,
    126                                             OPJ_UINT32 p_max_res,
    127                                             OPJ_UINT32 p_dx_min,
    128                                             OPJ_UINT32 p_dy_min);
    129 /**
    130  * Gets the encoding parameters needed to update the coding parameters and all the pocs.
    131  *
    132  * @param	p_image			the image being encoded.
    133  * @param	p_cp			the coding parameters.
    134  * @param	tileno			the tile index of the tile being encoded.
    135  * @param	p_tx0			pointer that will hold the X0 parameter for the tile
    136  * @param	p_tx1			pointer that will hold the X1 parameter for the tile
    137  * @param	p_ty0			pointer that will hold the Y0 parameter for the tile
    138  * @param	p_ty1			pointer that will hold the Y1 parameter for the tile
    139  * @param	p_max_prec		pointer that will hold the the maximum precision for all the bands of the tile
    140  * @param	p_max_res		pointer that will hold the the maximum number of resolutions for all the poc inside the tile.
    141  * @param	p_dx_min			pointer that will hold the the minimum dx of all the components of all the resolutions for the tile.
    142  * @param	p_dy_min			pointer that will hold the the minimum dy of all the components of all the resolutions for the tile.
    143  */
    144 static void opj_get_encoding_parameters(const opj_image_t *p_image,
    145                                         const opj_cp_t *p_cp,
    146                                         OPJ_UINT32  tileno,
    147                                         OPJ_INT32  * p_tx0,
    148                                         OPJ_INT32 * p_tx1,
    149                                         OPJ_INT32 * p_ty0,
    150                                         OPJ_INT32 * p_ty1,
    151                                         OPJ_UINT32 * p_dx_min,
    152                                         OPJ_UINT32 * p_dy_min,
    153                                         OPJ_UINT32 * p_max_prec,
    154                                         OPJ_UINT32 * p_max_res );
    155 
    156 /**
    157  * Gets the encoding parameters needed to update the coding parameters and all the pocs.
    158  * The precinct widths, heights, dx and dy for each component at each resolution will be stored as well.
    159  * the last parameter of the function should be an array of pointers of size nb components, each pointer leading
    160  * to an area of size 4 * max_res. The data is stored inside this area with the following pattern :
    161  * dx_compi_res0 , dy_compi_res0 , w_compi_res0, h_compi_res0 , dx_compi_res1 , dy_compi_res1 , w_compi_res1, h_compi_res1 , ...
    162  *
    163  * @param	p_image			the image being encoded.
    164  * @param	p_cp			the coding parameters.
    165  * @param	tileno			the tile index of the tile being encoded.
    166  * @param	p_tx0			pointer that will hold the X0 parameter for the tile
    167  * @param	p_tx1			pointer that will hold the X1 parameter for the tile
    168  * @param	p_ty0			pointer that will hold the Y0 parameter for the tile
    169  * @param	p_ty1			pointer that will hold the Y1 parameter for the tile
    170  * @param	p_max_prec		pointer that will hold the the maximum precision for all the bands of the tile
    171  * @param	p_max_res		pointer that will hold the the maximum number of resolutions for all the poc inside the tile.
    172  * @param	p_dx_min		pointer that will hold the the minimum dx of all the components of all the resolutions for the tile.
    173  * @param	p_dy_min		pointer that will hold the the minimum dy of all the components of all the resolutions for the tile.
    174  * @param	p_resolutions	pointer to an area corresponding to the one described above.
    175  */
    176 static void opj_get_all_encoding_parameters(const opj_image_t *p_image,
    177                                             const opj_cp_t *p_cp,
    178                                             OPJ_UINT32 tileno,
    179                                             OPJ_INT32 * p_tx0,
    180                                             OPJ_INT32 * p_tx1,
    181                                             OPJ_INT32 * p_ty0,
    182                                             OPJ_INT32 * p_ty1,
    183                                             OPJ_UINT32 * p_dx_min,
    184                                             OPJ_UINT32 * p_dy_min,
    185                                             OPJ_UINT32 * p_max_prec,
    186                                             OPJ_UINT32 * p_max_res,
    187                                             OPJ_UINT32 ** p_resolutions );
    188 /**
    189  * Allocates memory for a packet iterator. Data and data sizes are set by this operation.
    190  * No other data is set. The include section of the packet  iterator is not allocated.
    191  *
    192  * @param	p_image		the image used to initialize the packet iterator (in fact only the number of components is relevant.
    193  * @param	p_cp		the coding parameters.
    194  * @param	tileno	the index of the tile from which creating the packet iterator.
    195  */
    196 static opj_pi_iterator_t * opj_pi_create(	const opj_image_t *p_image,
    197                                             const opj_cp_t *p_cp,
    198                                             OPJ_UINT32 tileno );
    199 /**
    200  * FIXME DOC
    201  */
    202 static void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,
    203                                           opj_tcp_t * p_tcp,
    204                                           OPJ_UINT32 p_max_precision,
    205                                           OPJ_UINT32 p_max_res);
    206 /**
    207  * FIXME DOC
    208  */
    209 static void opj_pi_update_decode_poc (  opj_pi_iterator_t * p_pi,
    210                                         opj_tcp_t * p_tcp,
    211                                         OPJ_UINT32 p_max_precision,
    212                                         OPJ_UINT32 p_max_res);
    213 
    214 /**
    215  * FIXME DOC
    216  */
    217 OPJ_BOOL opj_pi_check_next_level(	OPJ_INT32 pos,
    218 								opj_cp_t *cp,
    219 								OPJ_UINT32 tileno,
    220 								OPJ_UINT32 pino,
    221 								const OPJ_CHAR *prog);
    222 
    223 /*@}*/
    224 
    225 /*@}*/
    226 
    227 /*
    228 ==========================================================
    229    local functions
    230 ==========================================================
    231 */
    232 
    233 OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi) {
    234 	opj_pi_comp_t *comp = NULL;
    235 	opj_pi_resolution_t *res = NULL;
    236 	OPJ_UINT32 index = 0;
    237 
    238 	if (!pi->first) {
    239 		comp = &pi->comps[pi->compno];
    240 		res = &comp->resolutions[pi->resno];
    241 		goto LABEL_SKIP;
    242 	} else {
    243 		pi->first = 0;
    244 	}
    245 
    246 	for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
    247 		for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
    248 		pi->resno++) {
    249 			for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
    250 				comp = &pi->comps[pi->compno];
    251 				if (pi->resno >= comp->numresolutions) {
    252 					continue;
    253 				}
    254 				res = &comp->resolutions[pi->resno];
    255 				if (!pi->tp_on){
    256 					pi->poc.precno1 = res->pw * res->ph;
    257 				}
    258 				for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
    259 					index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
    260 					if (!pi->include[index]) {
    261 						pi->include[index] = 1;
    262 						return OPJ_TRUE;
    263 					}
    264 LABEL_SKIP:;
    265 				}
    266 			}
    267 		}
    268 	}
    269 
    270 	return OPJ_FALSE;
    271 }
    272 
    273 OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi) {
    274 	opj_pi_comp_t *comp = NULL;
    275 	opj_pi_resolution_t *res = NULL;
    276 	OPJ_UINT32 index = 0;
    277 
    278 	if (!pi->first) {
    279 		comp = &pi->comps[pi->compno];
    280 		res = &comp->resolutions[pi->resno];
    281 		goto LABEL_SKIP;
    282 	} else {
    283 		pi->first = 0;
    284 	}
    285 
    286 	for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
    287 		for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
    288 			for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
    289 				comp = &pi->comps[pi->compno];
    290 				if (pi->resno >= comp->numresolutions) {
    291 					continue;
    292 				}
    293 				res = &comp->resolutions[pi->resno];
    294 				if(!pi->tp_on){
    295 					pi->poc.precno1 = res->pw * res->ph;
    296 				}
    297 				for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
    298 					index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
    299 					if (!pi->include[index]) {
    300 						pi->include[index] = 1;
    301 						return OPJ_TRUE;
    302 					}
    303 LABEL_SKIP:;
    304 				}
    305 			}
    306 		}
    307 	}
    308 
    309 	return OPJ_FALSE;
    310 }
    311 
    312 OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi) {
    313 	opj_pi_comp_t *comp = NULL;
    314 	opj_pi_resolution_t *res = NULL;
    315 	OPJ_UINT32 index = 0;
    316 
    317 	if (!pi->first) {
    318 		goto LABEL_SKIP;
    319 	} else {
    320 		OPJ_UINT32 compno, resno;
    321 		pi->first = 0;
    322 		pi->dx = 0;
    323 		pi->dy = 0;
    324 		for (compno = 0; compno < pi->numcomps; compno++) {
    325 			comp = &pi->comps[compno];
    326 			for (resno = 0; resno < comp->numresolutions; resno++) {
    327 				OPJ_UINT32 dx, dy;
    328 				res = &comp->resolutions[resno];
    329 				dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
    330 				dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
    331 				pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
    332 				pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
    333 			}
    334 		}
    335 	}
    336 if (!pi->tp_on){
    337 			pi->poc.ty0 = pi->ty0;
    338 			pi->poc.tx0 = pi->tx0;
    339 			pi->poc.ty1 = pi->ty1;
    340 			pi->poc.tx1 = pi->tx1;
    341 		}
    342 	for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
    343 		for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
    344 			for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
    345 				for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
    346 					OPJ_UINT32 levelno;
    347 					OPJ_INT32 trx0, try0;
    348 					OPJ_INT32  trx1, try1;
    349 					OPJ_UINT32  rpx, rpy;
    350 					OPJ_INT32  prci, prcj;
    351 					comp = &pi->comps[pi->compno];
    352 					if (pi->resno >= comp->numresolutions) {
    353 						continue;
    354 					}
    355 					res = &comp->resolutions[pi->resno];
    356 					levelno = comp->numresolutions - 1 - pi->resno;
    357 					trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
    358 					try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
    359 					trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
    360 					try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
    361 					rpx = res->pdx + levelno;
    362 					rpy = res->pdy + levelno;
    363 					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
    364 						continue;
    365 					}
    366 					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
    367 						continue;
    368 					}
    369 
    370 					if ((res->pw==0)||(res->ph==0)) continue;
    371 
    372 					if ((trx0==trx1)||(try0==try1)) continue;
    373 
    374 					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
    375 						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
    376 					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
    377 						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
    378 					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
    379 					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
    380 						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
    381 						if (!pi->include[index]) {
    382 							pi->include[index] = 1;
    383 							return OPJ_TRUE;
    384 						}
    385 LABEL_SKIP:;
    386 					}
    387 				}
    388 			}
    389 		}
    390 	}
    391 
    392 	return OPJ_FALSE;
    393 }
    394 
    395 OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi) {
    396 	opj_pi_comp_t *comp = NULL;
    397 	opj_pi_resolution_t *res = NULL;
    398 	OPJ_UINT32 index = 0;
    399 
    400 	if (!pi->first) {
    401 		comp = &pi->comps[pi->compno];
    402 		goto LABEL_SKIP;
    403 	} else {
    404 		OPJ_UINT32 compno, resno;
    405 		pi->first = 0;
    406 		pi->dx = 0;
    407 		pi->dy = 0;
    408 		for (compno = 0; compno < pi->numcomps; compno++) {
    409 			comp = &pi->comps[compno];
    410 			for (resno = 0; resno < comp->numresolutions; resno++) {
    411 				OPJ_UINT32 dx, dy;
    412 				res = &comp->resolutions[resno];
    413 				dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
    414 				dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
    415 				pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
    416 				pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
    417 			}
    418 		}
    419 	}
    420 	if (!pi->tp_on){
    421 			pi->poc.ty0 = pi->ty0;
    422 			pi->poc.tx0 = pi->tx0;
    423 			pi->poc.ty1 = pi->ty1;
    424 			pi->poc.tx1 = pi->tx1;
    425 		}
    426 	for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
    427 		for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
    428 			for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
    429 				comp = &pi->comps[pi->compno];
    430 				for (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
    431 					OPJ_UINT32 levelno;
    432 					OPJ_INT32 trx0, try0;
    433 					OPJ_INT32 trx1, try1;
    434 					OPJ_UINT32 rpx, rpy;
    435 					OPJ_INT32 prci, prcj;
    436 					res = &comp->resolutions[pi->resno];
    437 					levelno = comp->numresolutions - 1 - pi->resno;
    438 					trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
    439 					try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
    440 					trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
    441 					try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
    442 					rpx = res->pdx + levelno;
    443 					rpy = res->pdy + levelno;
    444 					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
    445 						continue;
    446 					}
    447 					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
    448 						continue;
    449 					}
    450 
    451 					if ((res->pw==0)||(res->ph==0)) continue;
    452 
    453 					if ((trx0==trx1)||(try0==try1)) continue;
    454 
    455 					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
    456 						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
    457 					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
    458 						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
    459 					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
    460 					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
    461 						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
    462 						if (!pi->include[index]) {
    463 							pi->include[index] = 1;
    464 							return OPJ_TRUE;
    465 						}
    466 LABEL_SKIP:;
    467 					}
    468 				}
    469 			}
    470 		}
    471 	}
    472 
    473 	return OPJ_FALSE;
    474 }
    475 
    476 OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi) {
    477 	opj_pi_comp_t *comp = NULL;
    478 	opj_pi_resolution_t *res = NULL;
    479 	OPJ_UINT32 index = 0;
    480 
    481 	if (!pi->first) {
    482 		comp = &pi->comps[pi->compno];
    483 		goto LABEL_SKIP;
    484 	} else {
    485 		pi->first = 0;
    486 	}
    487 
    488 	for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
    489 		OPJ_UINT32 resno;
    490 		comp = &pi->comps[pi->compno];
    491 		pi->dx = 0;
    492 		pi->dy = 0;
    493 		for (resno = 0; resno < comp->numresolutions; resno++) {
    494 			OPJ_UINT32 dx, dy;
    495 			res = &comp->resolutions[resno];
    496 			dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
    497 			dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
    498 			pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
    499 			pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
    500 		}
    501 		if (!pi->tp_on){
    502 			pi->poc.ty0 = pi->ty0;
    503 			pi->poc.tx0 = pi->tx0;
    504 			pi->poc.ty1 = pi->ty1;
    505 			pi->poc.tx1 = pi->tx1;
    506 		}
    507 		for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
    508 			for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
    509 				for (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
    510 					OPJ_UINT32 levelno;
    511 					OPJ_INT32 trx0, try0;
    512 					OPJ_INT32 trx1, try1;
    513 					OPJ_UINT32 rpx, rpy;
    514 					OPJ_INT32 prci, prcj;
    515 					res = &comp->resolutions[pi->resno];
    516 					levelno = comp->numresolutions - 1 - pi->resno;
    517 					trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
    518 					try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
    519 					trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
    520 					try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
    521 					rpx = res->pdx + levelno;
    522 					rpy = res->pdy + levelno;
    523 					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
    524 						continue;
    525 					}
    526 					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
    527 						continue;
    528 					}
    529 
    530 					if ((res->pw==0)||(res->ph==0)) continue;
    531 
    532 					if ((trx0==trx1)||(try0==try1)) continue;
    533 
    534 					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
    535 						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
    536 					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
    537 						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
    538 					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
    539 					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
    540 						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
    541 						if (!pi->include[index]) {
    542 							pi->include[index] = 1;
    543 							return OPJ_TRUE;
    544 						}
    545 LABEL_SKIP:;
    546 					}
    547 				}
    548 			}
    549 		}
    550 	}
    551 
    552 	return OPJ_FALSE;
    553 }
    554 
    555 void opj_get_encoding_parameters(	const opj_image_t *p_image,
    556                                     const opj_cp_t *p_cp,
    557                                     OPJ_UINT32 p_tileno,
    558                                     OPJ_INT32 * p_tx0,
    559                                     OPJ_INT32  * p_tx1,
    560                                     OPJ_INT32  * p_ty0,
    561                                     OPJ_INT32  * p_ty1,
    562                                     OPJ_UINT32 * p_dx_min,
    563                                     OPJ_UINT32 * p_dy_min,
    564                                     OPJ_UINT32 * p_max_prec,
    565                                     OPJ_UINT32 * p_max_res )
    566 {
    567 	/* loop */
    568 	OPJ_UINT32  compno, resno;
    569 	/* pointers */
    570 	const opj_tcp_t *l_tcp = 00;
    571 	const opj_tccp_t * l_tccp = 00;
    572 	const opj_image_comp_t * l_img_comp = 00;
    573 
    574 	/* position in x and y of tile */
    575 	OPJ_UINT32 p, q;
    576 
    577 	/* preconditions */
    578 	assert(p_cp != 00);
    579 	assert(p_image != 00);
    580 	assert(p_tileno < p_cp->tw * p_cp->th);
    581 
    582 	/* initializations */
    583 	l_tcp = &p_cp->tcps [p_tileno];
    584 	l_img_comp = p_image->comps;
    585 	l_tccp = l_tcp->tccps;
    586 
    587 	/* here calculation of tx0, tx1, ty0, ty1, maxprec, dx and dy */
    588 	p = p_tileno % p_cp->tw;
    589 	q = p_tileno / p_cp->tw;
    590 
    591 	/* find extent of tile */
    592 	*p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx), (OPJ_INT32)p_image->x0);
    593 	*p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx), (OPJ_INT32)p_image->x1);
    594 	*p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy), (OPJ_INT32)p_image->y0);
    595 	*p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy), (OPJ_INT32)p_image->y1);
    596 
    597 	/* max precision is 0 (can only grow) */
    598 	*p_max_prec = 0;
    599 	*p_max_res = 0;
    600 
    601 	/* take the largest value for dx_min and dy_min */
    602 	*p_dx_min = 0x7fffffff;
    603 	*p_dy_min  = 0x7fffffff;
    604 
    605 	for (compno = 0; compno < p_image->numcomps; ++compno) {
    606 		/* arithmetic variables to calculate */
    607 		OPJ_UINT32 l_level_no;
    608 		OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
    609 		OPJ_INT32 l_px0, l_py0, l_px1, py1;
    610 		OPJ_UINT32 l_pdx, l_pdy;
    611 		OPJ_UINT32 l_pw, l_ph;
    612 		OPJ_UINT32 l_product;
    613 		OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
    614 
    615 		l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
    616 		l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
    617 		l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
    618 		l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
    619 
    620 		if (l_tccp->numresolutions > *p_max_res) {
    621 			*p_max_res = l_tccp->numresolutions;
    622 		}
    623 
    624 		/* use custom size for precincts */
    625 		for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
    626 			OPJ_UINT32 l_dx, l_dy;
    627 
    628 			/* precinct width and height */
    629 			l_pdx = l_tccp->prcw[resno];
    630 			l_pdy = l_tccp->prch[resno];
    631 
    632 			l_dx = l_img_comp->dx * (1u << (l_pdx + l_tccp->numresolutions - 1 - resno));
    633 			l_dy = l_img_comp->dy * (1u << (l_pdy + l_tccp->numresolutions - 1 - resno));
    634 
    635 			/* take the minimum size for dx for each comp and resolution */
    636 			*p_dx_min = opj_uint_min(*p_dx_min, l_dx);
    637 			*p_dy_min = opj_uint_min(*p_dy_min, l_dy);
    638 
    639 			/* various calculations of extents */
    640 			l_level_no = l_tccp->numresolutions - 1 - resno;
    641 
    642 			l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
    643 			l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
    644 			l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
    645 			l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
    646 
    647 			l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
    648 			l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
    649 			l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
    650 
    651 			py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
    652 
    653 			l_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
    654 			l_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);
    655 
    656 			l_product = l_pw * l_ph;
    657 
    658 			/* update precision */
    659 			if (l_product > *p_max_prec) {
    660 				*p_max_prec = l_product;
    661 			}
    662 		}
    663 		++l_img_comp;
    664 		++l_tccp;
    665 	}
    666 }
    667 
    668 
    669 void opj_get_all_encoding_parameters(   const opj_image_t *p_image,
    670                                         const opj_cp_t *p_cp,
    671                                         OPJ_UINT32 tileno,
    672                                         OPJ_INT32 * p_tx0,
    673                                         OPJ_INT32 * p_tx1,
    674                                         OPJ_INT32 * p_ty0,
    675                                         OPJ_INT32 * p_ty1,
    676                                         OPJ_UINT32 * p_dx_min,
    677                                         OPJ_UINT32 * p_dy_min,
    678                                         OPJ_UINT32 * p_max_prec,
    679                                         OPJ_UINT32 * p_max_res,
    680                                         OPJ_UINT32 ** p_resolutions )
    681 {
    682 	/* loop*/
    683 	OPJ_UINT32 compno, resno;
    684 
    685 	/* pointers*/
    686 	const opj_tcp_t *tcp = 00;
    687 	const opj_tccp_t * l_tccp = 00;
    688 	const opj_image_comp_t * l_img_comp = 00;
    689 
    690 	/* to store l_dx, l_dy, w and h for each resolution and component.*/
    691 	OPJ_UINT32 * lResolutionPtr;
    692 
    693 	/* position in x and y of tile*/
    694 	OPJ_UINT32 p, q;
    695 
    696 	/* non-corrected (in regard to image offset) tile offset */
    697 	OPJ_UINT32 l_tx0, l_ty0;
    698 
    699 	/* preconditions in debug*/
    700 	assert(p_cp != 00);
    701 	assert(p_image != 00);
    702 	assert(tileno < p_cp->tw * p_cp->th);
    703 
    704 	/* initializations*/
    705 	tcp = &p_cp->tcps [tileno];
    706 	l_tccp = tcp->tccps;
    707 	l_img_comp = p_image->comps;
    708 
    709 	/* position in x and y of tile*/
    710 	p = tileno % p_cp->tw;
    711 	q = tileno / p_cp->tw;
    712 
    713 	/* here calculation of tx0, tx1, ty0, ty1, maxprec, l_dx and l_dy */
    714 	l_tx0 = p_cp->tx0 + p * p_cp->tdx; /* can't be greater than p_image->x1 so won't overflow */
    715 	*p_tx0 = (OPJ_INT32)opj_uint_max(l_tx0, p_image->x0);
    716 	*p_tx1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, p_cp->tdx), p_image->x1);
    717 	l_ty0 = p_cp->ty0 + q * p_cp->tdy; /* can't be greater than p_image->y1 so won't overflow */
    718 	*p_ty0 = (OPJ_INT32)opj_uint_max(l_ty0, p_image->y0);
    719 	*p_ty1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, p_cp->tdy), p_image->y1);
    720 
    721 	/* max precision and resolution is 0 (can only grow)*/
    722 	*p_max_prec = 0;
    723 	*p_max_res = 0;
    724 
    725 	/* take the largest value for dx_min and dy_min*/
    726 	*p_dx_min = 0x7fffffff;
    727 	*p_dy_min = 0x7fffffff;
    728 
    729 	for (compno = 0; compno < p_image->numcomps; ++compno) {
    730 		/* aritmetic variables to calculate*/
    731 		OPJ_UINT32 l_level_no;
    732 		OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
    733 		OPJ_INT32 l_px0, l_py0, l_px1, py1;
    734 		OPJ_UINT32 l_product;
    735 		OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
    736 		OPJ_UINT32 l_pdx, l_pdy , l_pw , l_ph;
    737 
    738 		lResolutionPtr = p_resolutions[compno];
    739 
    740 		l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
    741 		l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
    742 		l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
    743 		l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
    744 
    745 		if (l_tccp->numresolutions > *p_max_res) {
    746 			*p_max_res = l_tccp->numresolutions;
    747 		}
    748 
    749 		/* use custom size for precincts*/
    750 		l_level_no = l_tccp->numresolutions - 1;
    751 		for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
    752 			OPJ_UINT32 l_dx, l_dy;
    753 
    754 			/* precinct width and height*/
    755 			l_pdx = l_tccp->prcw[resno];
    756 			l_pdy = l_tccp->prch[resno];
    757 			*lResolutionPtr++ = l_pdx;
    758 			*lResolutionPtr++ = l_pdy;
    759 			l_dx = l_img_comp->dx * (1u << (l_pdx + l_level_no));
    760 			l_dy = l_img_comp->dy * (1u << (l_pdy + l_level_no));
    761 			/* take the minimum size for l_dx for each comp and resolution*/
    762 			*p_dx_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dx_min, (OPJ_INT32)l_dx);
    763 			*p_dy_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dy_min, (OPJ_INT32)l_dy);
    764 
    765 			/* various calculations of extents*/
    766 			l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
    767 			l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
    768 			l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
    769 			l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
    770 			l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
    771 			l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
    772 			l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
    773 			py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
    774 			l_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
    775 			l_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);
    776 			*lResolutionPtr++ = l_pw;
    777 			*lResolutionPtr++ = l_ph;
    778 			l_product = l_pw * l_ph;
    779 
    780             /* update precision*/
    781 			if (l_product > *p_max_prec) {
    782 				*p_max_prec = l_product;
    783 			}
    784 
    785 			--l_level_no;
    786 		}
    787 		++l_tccp;
    788 		++l_img_comp;
    789 	}
    790 }
    791 
    792 opj_pi_iterator_t * opj_pi_create(	const opj_image_t *image,
    793                                     const opj_cp_t *cp,
    794                                     OPJ_UINT32 tileno )
    795 {
    796 	/* loop*/
    797 	OPJ_UINT32 pino, compno;
    798 	/* number of poc in the p_pi*/
    799 	OPJ_UINT32 l_poc_bound;
    800 
    801 	/* pointers to tile coding parameters and components.*/
    802 	opj_pi_iterator_t *l_pi = 00;
    803 	opj_tcp_t *tcp = 00;
    804 	const opj_tccp_t *tccp = 00;
    805 
    806 	/* current packet iterator being allocated*/
    807 	opj_pi_iterator_t *l_current_pi = 00;
    808 
    809 	/* preconditions in debug*/
    810 	assert(cp != 00);
    811 	assert(image != 00);
    812 	assert(tileno < cp->tw * cp->th);
    813 
    814 	/* initializations*/
    815 	tcp = &cp->tcps[tileno];
    816 	l_poc_bound = tcp->numpocs+1;
    817 
    818 	/* memory allocations*/
    819 	l_pi = (opj_pi_iterator_t*) opj_calloc((l_poc_bound), sizeof(opj_pi_iterator_t));
    820 	if (!l_pi) {
    821 		return NULL;
    822 	}
    823 
    824 	l_current_pi = l_pi;
    825 	for (pino = 0; pino < l_poc_bound ; ++pino) {
    826 
    827 		l_current_pi->comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));
    828 		if (! l_current_pi->comps) {
    829 			opj_pi_destroy(l_pi, l_poc_bound);
    830 			return NULL;
    831 		}
    832 
    833 		l_current_pi->numcomps = image->numcomps;
    834 
    835 		for (compno = 0; compno < image->numcomps; ++compno) {
    836 			opj_pi_comp_t *comp = &l_current_pi->comps[compno];
    837 
    838 			tccp = &tcp->tccps[compno];
    839 
    840 			comp->resolutions = (opj_pi_resolution_t*) opj_calloc(tccp->numresolutions, sizeof(opj_pi_resolution_t));
    841 			if (!comp->resolutions) {
    842 				opj_pi_destroy(l_pi, l_poc_bound);
    843 				return 00;
    844 			}
    845 
    846 			comp->numresolutions = tccp->numresolutions;
    847 		}
    848 		++l_current_pi;
    849 	}
    850 	return l_pi;
    851 }
    852 
    853 void opj_pi_update_encode_poc_and_final (   opj_cp_t *p_cp,
    854                                             OPJ_UINT32 p_tileno,
    855                                             OPJ_INT32 p_tx0,
    856                                             OPJ_INT32 p_tx1,
    857                                             OPJ_INT32 p_ty0,
    858                                             OPJ_INT32 p_ty1,
    859                                             OPJ_UINT32 p_max_prec,
    860                                             OPJ_UINT32 p_max_res,
    861                                             OPJ_UINT32 p_dx_min,
    862                                             OPJ_UINT32 p_dy_min)
    863 {
    864 	/* loop*/
    865 	OPJ_UINT32 pino;
    866 	/* tile coding parameter*/
    867 	opj_tcp_t *l_tcp = 00;
    868 	/* current poc being updated*/
    869 	opj_poc_t * l_current_poc = 00;
    870 
    871 	/* number of pocs*/
    872 	OPJ_UINT32 l_poc_bound;
    873 
    874     OPJ_ARG_NOT_USED(p_max_res);
    875 
    876 	/* preconditions in debug*/
    877 	assert(p_cp != 00);
    878 	assert(p_tileno < p_cp->tw * p_cp->th);
    879 
    880 	/* initializations*/
    881 	l_tcp = &p_cp->tcps [p_tileno];
    882 	/* number of iterations in the loop */
    883 	l_poc_bound = l_tcp->numpocs+1;
    884 
    885 	/* start at first element, and to make sure the compiler will not make a calculation each time in the loop
    886 	   store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
    887 	l_current_poc = l_tcp->pocs;
    888 
    889 	l_current_poc->compS = l_current_poc->compno0;
    890 	l_current_poc->compE = l_current_poc->compno1;
    891 	l_current_poc->resS = l_current_poc->resno0;
    892 	l_current_poc->resE = l_current_poc->resno1;
    893 	l_current_poc->layE = l_current_poc->layno1;
    894 
    895 	/* special treatment for the first element*/
    896 	l_current_poc->layS = 0;
    897 	l_current_poc->prg  = l_current_poc->prg1;
    898 	l_current_poc->prcS = 0;
    899 
    900 	l_current_poc->prcE = p_max_prec;
    901 	l_current_poc->txS = (OPJ_UINT32)p_tx0;
    902 	l_current_poc->txE = (OPJ_UINT32)p_tx1;
    903 	l_current_poc->tyS = (OPJ_UINT32)p_ty0;
    904 	l_current_poc->tyE = (OPJ_UINT32)p_ty1;
    905 	l_current_poc->dx = p_dx_min;
    906 	l_current_poc->dy = p_dy_min;
    907 
    908 	++ l_current_poc;
    909 	for (pino = 1;pino < l_poc_bound ; ++pino) {
    910 		l_current_poc->compS = l_current_poc->compno0;
    911 		l_current_poc->compE= l_current_poc->compno1;
    912 		l_current_poc->resS = l_current_poc->resno0;
    913 		l_current_poc->resE = l_current_poc->resno1;
    914 		l_current_poc->layE = l_current_poc->layno1;
    915 		l_current_poc->prg  = l_current_poc->prg1;
    916 		l_current_poc->prcS = 0;
    917 		/* special treatment here different from the first element*/
    918 		l_current_poc->layS = (l_current_poc->layE > (l_current_poc-1)->layE) ? l_current_poc->layE : 0;
    919 
    920 		l_current_poc->prcE = p_max_prec;
    921 		l_current_poc->txS = (OPJ_UINT32)p_tx0;
    922 		l_current_poc->txE = (OPJ_UINT32)p_tx1;
    923 		l_current_poc->tyS = (OPJ_UINT32)p_ty0;
    924 		l_current_poc->tyE = (OPJ_UINT32)p_ty1;
    925 		l_current_poc->dx = p_dx_min;
    926 		l_current_poc->dy = p_dy_min;
    927 		++ l_current_poc;
    928 	}
    929 }
    930 
    931 void opj_pi_update_encode_not_poc (	opj_cp_t *p_cp,
    932                                     OPJ_UINT32 p_num_comps,
    933                                     OPJ_UINT32 p_tileno,
    934                                     OPJ_INT32 p_tx0,
    935                                     OPJ_INT32 p_tx1,
    936                                     OPJ_INT32 p_ty0,
    937                                     OPJ_INT32 p_ty1,
    938                                     OPJ_UINT32 p_max_prec,
    939                                     OPJ_UINT32 p_max_res,
    940                                     OPJ_UINT32 p_dx_min,
    941                                     OPJ_UINT32 p_dy_min)
    942 {
    943 	/* loop*/
    944 	OPJ_UINT32 pino;
    945 	/* tile coding parameter*/
    946 	opj_tcp_t *l_tcp = 00;
    947 	/* current poc being updated*/
    948 	opj_poc_t * l_current_poc = 00;
    949 	/* number of pocs*/
    950 	OPJ_UINT32 l_poc_bound;
    951 
    952 	/* preconditions in debug*/
    953 	assert(p_cp != 00);
    954 	assert(p_tileno < p_cp->tw * p_cp->th);
    955 
    956 	/* initializations*/
    957 	l_tcp = &p_cp->tcps [p_tileno];
    958 
    959 	/* number of iterations in the loop */
    960 	l_poc_bound = l_tcp->numpocs+1;
    961 
    962 	/* start at first element, and to make sure the compiler will not make a calculation each time in the loop
    963 	   store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
    964 	l_current_poc = l_tcp->pocs;
    965 
    966 	for (pino = 0; pino < l_poc_bound ; ++pino) {
    967 		l_current_poc->compS = 0;
    968 		l_current_poc->compE = p_num_comps;/*p_image->numcomps;*/
    969 		l_current_poc->resS = 0;
    970 		l_current_poc->resE = p_max_res;
    971 		l_current_poc->layS = 0;
    972 		l_current_poc->layE = l_tcp->numlayers;
    973 		l_current_poc->prg  = l_tcp->prg;
    974 		l_current_poc->prcS = 0;
    975 		l_current_poc->prcE = p_max_prec;
    976 		l_current_poc->txS = (OPJ_UINT32)p_tx0;
    977 		l_current_poc->txE = (OPJ_UINT32)p_tx1;
    978 		l_current_poc->tyS = (OPJ_UINT32)p_ty0;
    979 		l_current_poc->tyE = (OPJ_UINT32)p_ty1;
    980 		l_current_poc->dx = p_dx_min;
    981 		l_current_poc->dy = p_dy_min;
    982 		++ l_current_poc;
    983 	}
    984 }
    985 
    986 void opj_pi_update_decode_poc (opj_pi_iterator_t * p_pi,
    987                                opj_tcp_t * p_tcp,
    988                                OPJ_UINT32 p_max_precision,
    989                                OPJ_UINT32 p_max_res)
    990 {
    991 	/* loop*/
    992 	OPJ_UINT32 pino;
    993 
    994 	/* encoding prameters to set*/
    995 	OPJ_UINT32 l_bound;
    996 
    997 	opj_pi_iterator_t * l_current_pi = 00;
    998 	opj_poc_t* l_current_poc = 0;
    999 
   1000     OPJ_ARG_NOT_USED(p_max_res);
   1001 
   1002 	/* preconditions in debug*/
   1003 	assert(p_pi != 00);
   1004 	assert(p_tcp != 00);
   1005 
   1006 	/* initializations*/
   1007 	l_bound = p_tcp->numpocs+1;
   1008 	l_current_pi = p_pi;
   1009 	l_current_poc = p_tcp->pocs;
   1010 
   1011 	for	(pino = 0;pino<l_bound;++pino) {
   1012 		l_current_pi->poc.prg = l_current_poc->prg; /* Progression Order #0 */
   1013 		l_current_pi->first = 1;
   1014 
   1015 		l_current_pi->poc.resno0 = l_current_poc->resno0; /* Resolution Level Index #0 (Start) */
   1016 		l_current_pi->poc.compno0 = l_current_poc->compno0; /* Component Index #0 (Start) */
   1017 		l_current_pi->poc.layno0 = 0;
   1018 		l_current_pi->poc.precno0 = 0;
   1019 		l_current_pi->poc.resno1 = l_current_poc->resno1; /* Resolution Level Index #0 (End) */
   1020 		l_current_pi->poc.compno1 = l_current_poc->compno1; /* Component Index #0 (End) */
   1021 		l_current_pi->poc.layno1 = l_current_poc->layno1; /* Layer Index #0 (End) */
   1022 		l_current_pi->poc.precno1 = p_max_precision;
   1023 		++l_current_pi;
   1024 		++l_current_poc;
   1025 	}
   1026 }
   1027 
   1028 void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,
   1029                                    opj_tcp_t * p_tcp,
   1030                                    OPJ_UINT32 p_max_precision,
   1031                                    OPJ_UINT32 p_max_res)
   1032 {
   1033 	/* loop*/
   1034 	OPJ_UINT32 pino;
   1035 
   1036 	/* encoding prameters to set*/
   1037 	OPJ_UINT32 l_bound;
   1038 
   1039 	opj_pi_iterator_t * l_current_pi = 00;
   1040 	/* preconditions in debug*/
   1041 	assert(p_tcp != 00);
   1042 	assert(p_pi != 00);
   1043 
   1044 	/* initializations*/
   1045 	l_bound = p_tcp->numpocs+1;
   1046 	l_current_pi = p_pi;
   1047 
   1048 	for (pino = 0;pino<l_bound;++pino) {
   1049 		l_current_pi->poc.prg = p_tcp->prg;
   1050 		l_current_pi->first = 1;
   1051 		l_current_pi->poc.resno0 = 0;
   1052 		l_current_pi->poc.compno0 = 0;
   1053 		l_current_pi->poc.layno0 = 0;
   1054 		l_current_pi->poc.precno0 = 0;
   1055 		l_current_pi->poc.resno1 = p_max_res;
   1056 		l_current_pi->poc.compno1 = l_current_pi->numcomps;
   1057 		l_current_pi->poc.layno1 = p_tcp->numlayers;
   1058 		l_current_pi->poc.precno1 = p_max_precision;
   1059 		++l_current_pi;
   1060 	}
   1061 }
   1062 
   1063 
   1064 
   1065 OPJ_BOOL opj_pi_check_next_level(	OPJ_INT32 pos,
   1066 								opj_cp_t *cp,
   1067 								OPJ_UINT32 tileno,
   1068 								OPJ_UINT32 pino,
   1069 								const OPJ_CHAR *prog)
   1070 {
   1071 	OPJ_INT32 i;
   1072 	opj_tcp_t *tcps =&cp->tcps[tileno];
   1073 	opj_poc_t *tcp = &tcps->pocs[pino];
   1074 
   1075 	if(pos>=0){
   1076 		for(i=pos;pos>=0;i--){
   1077 			switch(prog[i]){
   1078 		    case 'R':
   1079 			    if(tcp->res_t==tcp->resE){
   1080 				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
   1081 					    return OPJ_TRUE;
   1082 				    }else{
   1083 					    return OPJ_FALSE;
   1084 				    }
   1085 			    }else{
   1086 				    return OPJ_TRUE;
   1087 			    }
   1088 			    break;
   1089 		    case 'C':
   1090 			    if(tcp->comp_t==tcp->compE){
   1091 				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
   1092 					    return OPJ_TRUE;
   1093 				    }else{
   1094 					    return OPJ_FALSE;
   1095 				    }
   1096 			    }else{
   1097 				    return OPJ_TRUE;
   1098 			    }
   1099 			    break;
   1100 		    case 'L':
   1101 			    if(tcp->lay_t==tcp->layE){
   1102 				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
   1103 					    return OPJ_TRUE;
   1104 				    }else{
   1105 					    return OPJ_FALSE;
   1106 				    }
   1107 			    }else{
   1108 				    return OPJ_TRUE;
   1109 			    }
   1110 			    break;
   1111 		    case 'P':
   1112 			    switch(tcp->prg){
   1113                     case OPJ_LRCP: /* fall through */
   1114                     case OPJ_RLCP:
   1115 					    if(tcp->prc_t == tcp->prcE){
   1116 						    if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
   1117 							    return OPJ_TRUE;
   1118 						    }else{
   1119 							    return OPJ_FALSE;
   1120 						    }
   1121 					    }else{
   1122 						    return OPJ_TRUE;
   1123 					    }
   1124 					    break;
   1125 			    default:
   1126 				    if(tcp->tx0_t == tcp->txE){
   1127 					    /*TY*/
   1128 					    if(tcp->ty0_t == tcp->tyE){
   1129 						    if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
   1130 							    return OPJ_TRUE;
   1131 						    }else{
   1132 							    return OPJ_FALSE;
   1133 						    }
   1134 					    }else{
   1135 						    return OPJ_TRUE;
   1136 					    }/*TY*/
   1137 				    }else{
   1138 					    return OPJ_TRUE;
   1139 				    }
   1140 				    break;
   1141 			    }/*end case P*/
   1142 		    }/*end switch*/
   1143 		}/*end for*/
   1144 	}/*end if*/
   1145 	return OPJ_FALSE;
   1146 }
   1147 
   1148 
   1149 /*
   1150 ==========================================================
   1151    Packet iterator interface
   1152 ==========================================================
   1153 */
   1154 opj_pi_iterator_t *opj_pi_create_decode(opj_image_t *p_image,
   1155 										opj_cp_t *p_cp,
   1156 										OPJ_UINT32 p_tile_no)
   1157 {
   1158 	/* loop */
   1159 	OPJ_UINT32 pino;
   1160 	OPJ_UINT32 compno, resno;
   1161 
   1162 	/* to store w, h, dx and dy fro all components and resolutions */
   1163 	OPJ_UINT32 * l_tmp_data;
   1164 	OPJ_UINT32 ** l_tmp_ptr;
   1165 
   1166 	/* encoding prameters to set */
   1167 	OPJ_UINT32 l_max_res;
   1168 	OPJ_UINT32 l_max_prec;
   1169 	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
   1170 	OPJ_UINT32 l_dx_min,l_dy_min;
   1171 	OPJ_UINT32 l_bound;
   1172 	OPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;
   1173 	OPJ_UINT32 l_data_stride;
   1174 
   1175 	/* pointers */
   1176 	opj_pi_iterator_t *l_pi = 00;
   1177 	opj_tcp_t *l_tcp = 00;
   1178 	const opj_tccp_t *l_tccp = 00;
   1179 	opj_pi_comp_t *l_current_comp = 00;
   1180 	opj_image_comp_t * l_img_comp = 00;
   1181 	opj_pi_iterator_t * l_current_pi = 00;
   1182 	OPJ_UINT32 * l_encoding_value_ptr = 00;
   1183 
   1184 	/* preconditions in debug */
   1185 	assert(p_cp != 00);
   1186 	assert(p_image != 00);
   1187 	assert(p_tile_no < p_cp->tw * p_cp->th);
   1188 
   1189 	/* initializations */
   1190 	l_tcp = &p_cp->tcps[p_tile_no];
   1191 	l_bound = l_tcp->numpocs+1;
   1192 
   1193 	l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
   1194 	l_tmp_data = (OPJ_UINT32*)opj_malloc(
   1195 		l_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));
   1196 	if
   1197 		(! l_tmp_data)
   1198 	{
   1199 		return 00;
   1200 	}
   1201 	l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
   1202 		p_image->numcomps * sizeof(OPJ_UINT32 *));
   1203 	if
   1204 		(! l_tmp_ptr)
   1205 	{
   1206 		opj_free(l_tmp_data);
   1207 		return 00;
   1208 	}
   1209 
   1210 	/* memory allocation for pi */
   1211 	l_pi = opj_pi_create(p_image, p_cp, p_tile_no);
   1212 	if (!l_pi) {
   1213 		opj_free(l_tmp_data);
   1214 		opj_free(l_tmp_ptr);
   1215 		return 00;
   1216 	}
   1217 
   1218 	l_encoding_value_ptr = l_tmp_data;
   1219 	/* update pointer array */
   1220 	for
   1221 		(compno = 0; compno < p_image->numcomps; ++compno)
   1222 	{
   1223 		l_tmp_ptr[compno] = l_encoding_value_ptr;
   1224 		l_encoding_value_ptr += l_data_stride;
   1225 	}
   1226 	/* get encoding parameters */
   1227 	opj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);
   1228 
   1229 	/* step calculations */
   1230 	l_step_p = 1;
   1231 	l_step_c = l_max_prec * l_step_p;
   1232 	l_step_r = p_image->numcomps * l_step_c;
   1233 	l_step_l = l_max_res * l_step_r;
   1234 
   1235 	/* set values for first packet iterator */
   1236 	l_current_pi = l_pi;
   1237 
   1238 	/* memory allocation for include */
   1239 	l_current_pi->include = (OPJ_INT16*) opj_calloc((l_tcp->numlayers +1) * l_step_l, sizeof(OPJ_INT16));
   1240 	if
   1241 		(!l_current_pi->include)
   1242 	{
   1243 		opj_free(l_tmp_data);
   1244 		opj_free(l_tmp_ptr);
   1245 		opj_pi_destroy(l_pi, l_bound);
   1246 		return 00;
   1247 	}
   1248 
   1249 	/* special treatment for the first packet iterator */
   1250 	l_current_comp = l_current_pi->comps;
   1251 	l_img_comp = p_image->comps;
   1252 	l_tccp = l_tcp->tccps;
   1253 
   1254 	l_current_pi->tx0 = l_tx0;
   1255 	l_current_pi->ty0 = l_ty0;
   1256 	l_current_pi->tx1 = l_tx1;
   1257 	l_current_pi->ty1 = l_ty1;
   1258 
   1259 	/*l_current_pi->dx = l_img_comp->dx;*/
   1260 	/*l_current_pi->dy = l_img_comp->dy;*/
   1261 
   1262 	l_current_pi->step_p = l_step_p;
   1263 	l_current_pi->step_c = l_step_c;
   1264 	l_current_pi->step_r = l_step_r;
   1265 	l_current_pi->step_l = l_step_l;
   1266 
   1267 	/* allocation for components and number of components has already been calculated by opj_pi_create */
   1268 	for
   1269 		(compno = 0; compno < l_current_pi->numcomps; ++compno)
   1270 	{
   1271 		opj_pi_resolution_t *l_res = l_current_comp->resolutions;
   1272 		l_encoding_value_ptr = l_tmp_ptr[compno];
   1273 
   1274 		l_current_comp->dx = l_img_comp->dx;
   1275 		l_current_comp->dy = l_img_comp->dy;
   1276 		/* resolutions have already been initialized */
   1277 		for
   1278 			(resno = 0; resno < l_current_comp->numresolutions; resno++)
   1279 		{
   1280 			l_res->pdx = *(l_encoding_value_ptr++);
   1281 			l_res->pdy = *(l_encoding_value_ptr++);
   1282 			l_res->pw =  *(l_encoding_value_ptr++);
   1283 			l_res->ph =  *(l_encoding_value_ptr++);
   1284 			++l_res;
   1285 		}
   1286 		++l_current_comp;
   1287 		++l_img_comp;
   1288 		++l_tccp;
   1289 	}
   1290 	++l_current_pi;
   1291 
   1292 	for (pino = 1 ; pino<l_bound ; ++pino )
   1293 	{
   1294 		l_current_comp = l_current_pi->comps;
   1295 		l_img_comp = p_image->comps;
   1296 		l_tccp = l_tcp->tccps;
   1297 
   1298 		l_current_pi->tx0 = l_tx0;
   1299 		l_current_pi->ty0 = l_ty0;
   1300 		l_current_pi->tx1 = l_tx1;
   1301 		l_current_pi->ty1 = l_ty1;
   1302 		/*l_current_pi->dx = l_dx_min;*/
   1303 		/*l_current_pi->dy = l_dy_min;*/
   1304 		l_current_pi->step_p = l_step_p;
   1305 		l_current_pi->step_c = l_step_c;
   1306 		l_current_pi->step_r = l_step_r;
   1307 		l_current_pi->step_l = l_step_l;
   1308 
   1309 		/* allocation for components and number of components has already been calculated by opj_pi_create */
   1310 		for
   1311 			(compno = 0; compno < l_current_pi->numcomps; ++compno)
   1312 		{
   1313 			opj_pi_resolution_t *l_res = l_current_comp->resolutions;
   1314 			l_encoding_value_ptr = l_tmp_ptr[compno];
   1315 
   1316 			l_current_comp->dx = l_img_comp->dx;
   1317 			l_current_comp->dy = l_img_comp->dy;
   1318 			/* resolutions have already been initialized */
   1319 			for
   1320 				(resno = 0; resno < l_current_comp->numresolutions; resno++)
   1321 			{
   1322 				l_res->pdx = *(l_encoding_value_ptr++);
   1323 				l_res->pdy = *(l_encoding_value_ptr++);
   1324 				l_res->pw =  *(l_encoding_value_ptr++);
   1325 				l_res->ph =  *(l_encoding_value_ptr++);
   1326 				++l_res;
   1327 			}
   1328 			++l_current_comp;
   1329 			++l_img_comp;
   1330 			++l_tccp;
   1331 		}
   1332 		/* special treatment*/
   1333 		l_current_pi->include = (l_current_pi-1)->include;
   1334 		++l_current_pi;
   1335 	}
   1336 	opj_free(l_tmp_data);
   1337 	l_tmp_data = 00;
   1338 	opj_free(l_tmp_ptr);
   1339 	l_tmp_ptr = 00;
   1340 	if
   1341 		(l_tcp->POC)
   1342 	{
   1343 		opj_pi_update_decode_poc (l_pi,l_tcp,l_max_prec,l_max_res);
   1344 	}
   1345 	else
   1346 	{
   1347 		opj_pi_update_decode_not_poc(l_pi,l_tcp,l_max_prec,l_max_res);
   1348 	}
   1349 	return l_pi;
   1350 }
   1351 
   1352 
   1353 
   1354 opj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *p_image,
   1355                                             opj_cp_t *p_cp,
   1356                                             OPJ_UINT32 p_tile_no,
   1357                                             J2K_T2_MODE p_t2_mode )
   1358 {
   1359 	/* loop*/
   1360 	OPJ_UINT32 pino;
   1361 	OPJ_UINT32 compno, resno;
   1362 
   1363 	/* to store w, h, dx and dy fro all components and resolutions*/
   1364 	OPJ_UINT32 * l_tmp_data;
   1365 	OPJ_UINT32 ** l_tmp_ptr;
   1366 
   1367 	/* encoding prameters to set*/
   1368 	OPJ_UINT32 l_max_res;
   1369 	OPJ_UINT32 l_max_prec;
   1370 	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
   1371 	OPJ_UINT32 l_dx_min,l_dy_min;
   1372 	OPJ_UINT32 l_bound;
   1373 	OPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;
   1374 	OPJ_UINT32 l_data_stride;
   1375 
   1376 	/* pointers*/
   1377 	opj_pi_iterator_t *l_pi = 00;
   1378 	opj_tcp_t *l_tcp = 00;
   1379 	const opj_tccp_t *l_tccp = 00;
   1380 	opj_pi_comp_t *l_current_comp = 00;
   1381 	opj_image_comp_t * l_img_comp = 00;
   1382 	opj_pi_iterator_t * l_current_pi = 00;
   1383 	OPJ_UINT32 * l_encoding_value_ptr = 00;
   1384 
   1385 	/* preconditions in debug*/
   1386 	assert(p_cp != 00);
   1387 	assert(p_image != 00);
   1388 	assert(p_tile_no < p_cp->tw * p_cp->th);
   1389 
   1390 	/* initializations*/
   1391 	l_tcp = &p_cp->tcps[p_tile_no];
   1392 	l_bound = l_tcp->numpocs+1;
   1393 
   1394 	l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
   1395 	l_tmp_data = (OPJ_UINT32*)opj_malloc(
   1396 		l_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));
   1397 	if (! l_tmp_data) {
   1398 		return 00;
   1399 	}
   1400 
   1401 	l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
   1402 		p_image->numcomps * sizeof(OPJ_UINT32 *));
   1403 	if (! l_tmp_ptr) {
   1404 		opj_free(l_tmp_data);
   1405 		return 00;
   1406 	}
   1407 
   1408 	/* memory allocation for pi*/
   1409 	l_pi = opj_pi_create(p_image,p_cp,p_tile_no);
   1410 	if (!l_pi) {
   1411 		opj_free(l_tmp_data);
   1412 		opj_free(l_tmp_ptr);
   1413 		return 00;
   1414 	}
   1415 
   1416 	l_encoding_value_ptr = l_tmp_data;
   1417 	/* update pointer array*/
   1418 	for (compno = 0; compno < p_image->numcomps; ++compno) {
   1419 		l_tmp_ptr[compno] = l_encoding_value_ptr;
   1420 		l_encoding_value_ptr += l_data_stride;
   1421 	}
   1422 
   1423 	/* get encoding parameters*/
   1424 	opj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);
   1425 
   1426 	/* step calculations*/
   1427 	l_step_p = 1;
   1428 	l_step_c = l_max_prec * l_step_p;
   1429 	l_step_r = p_image->numcomps * l_step_c;
   1430 	l_step_l = l_max_res * l_step_r;
   1431 
   1432 	/* set values for first packet iterator*/
   1433 	l_pi->tp_on = p_cp->m_specific_param.m_enc.m_tp_on;
   1434 	l_current_pi = l_pi;
   1435 
   1436 	/* memory allocation for include*/
   1437 	l_current_pi->include = (OPJ_INT16*) opj_calloc(l_tcp->numlayers * l_step_l, sizeof(OPJ_INT16));
   1438 	if (!l_current_pi->include) {
   1439 		opj_free(l_tmp_data);
   1440 		opj_free(l_tmp_ptr);
   1441 		opj_pi_destroy(l_pi, l_bound);
   1442 		return 00;
   1443 	}
   1444 
   1445 	/* special treatment for the first packet iterator*/
   1446 	l_current_comp = l_current_pi->comps;
   1447 	l_img_comp = p_image->comps;
   1448 	l_tccp = l_tcp->tccps;
   1449 	l_current_pi->tx0 = l_tx0;
   1450 	l_current_pi->ty0 = l_ty0;
   1451 	l_current_pi->tx1 = l_tx1;
   1452 	l_current_pi->ty1 = l_ty1;
   1453 	l_current_pi->dx = l_dx_min;
   1454 	l_current_pi->dy = l_dy_min;
   1455 	l_current_pi->step_p = l_step_p;
   1456 	l_current_pi->step_c = l_step_c;
   1457 	l_current_pi->step_r = l_step_r;
   1458 	l_current_pi->step_l = l_step_l;
   1459 
   1460 	/* allocation for components and number of components has already been calculated by opj_pi_create */
   1461 	for (compno = 0; compno < l_current_pi->numcomps; ++compno) {
   1462 		opj_pi_resolution_t *l_res = l_current_comp->resolutions;
   1463 		l_encoding_value_ptr = l_tmp_ptr[compno];
   1464 
   1465 		l_current_comp->dx = l_img_comp->dx;
   1466 		l_current_comp->dy = l_img_comp->dy;
   1467 
   1468 		/* resolutions have already been initialized */
   1469 		for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
   1470 			l_res->pdx = *(l_encoding_value_ptr++);
   1471 			l_res->pdy = *(l_encoding_value_ptr++);
   1472 			l_res->pw =  *(l_encoding_value_ptr++);
   1473 			l_res->ph =  *(l_encoding_value_ptr++);
   1474 			++l_res;
   1475 		}
   1476 
   1477 		++l_current_comp;
   1478 		++l_img_comp;
   1479 		++l_tccp;
   1480 	}
   1481 	++l_current_pi;
   1482 
   1483 	for (pino = 1 ; pino<l_bound ; ++pino ) {
   1484 		l_current_comp = l_current_pi->comps;
   1485 		l_img_comp = p_image->comps;
   1486 		l_tccp = l_tcp->tccps;
   1487 
   1488 		l_current_pi->tx0 = l_tx0;
   1489 		l_current_pi->ty0 = l_ty0;
   1490 		l_current_pi->tx1 = l_tx1;
   1491 		l_current_pi->ty1 = l_ty1;
   1492 		l_current_pi->dx = l_dx_min;
   1493 		l_current_pi->dy = l_dy_min;
   1494 		l_current_pi->step_p = l_step_p;
   1495 		l_current_pi->step_c = l_step_c;
   1496 		l_current_pi->step_r = l_step_r;
   1497 		l_current_pi->step_l = l_step_l;
   1498 
   1499 		/* allocation for components and number of components has already been calculated by opj_pi_create */
   1500 		for (compno = 0; compno < l_current_pi->numcomps; ++compno) {
   1501 			opj_pi_resolution_t *l_res = l_current_comp->resolutions;
   1502 			l_encoding_value_ptr = l_tmp_ptr[compno];
   1503 
   1504 			l_current_comp->dx = l_img_comp->dx;
   1505 			l_current_comp->dy = l_img_comp->dy;
   1506 			/* resolutions have already been initialized */
   1507 			for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
   1508 				l_res->pdx = *(l_encoding_value_ptr++);
   1509 				l_res->pdy = *(l_encoding_value_ptr++);
   1510 				l_res->pw =  *(l_encoding_value_ptr++);
   1511 				l_res->ph =  *(l_encoding_value_ptr++);
   1512 				++l_res;
   1513 			}
   1514 			++l_current_comp;
   1515 			++l_img_comp;
   1516 			++l_tccp;
   1517 		}
   1518 
   1519 		/* special treatment*/
   1520 		l_current_pi->include = (l_current_pi-1)->include;
   1521 		++l_current_pi;
   1522 	}
   1523 
   1524 	opj_free(l_tmp_data);
   1525 	l_tmp_data = 00;
   1526 	opj_free(l_tmp_ptr);
   1527 	l_tmp_ptr = 00;
   1528 
   1529     if (l_tcp->POC && (OPJ_IS_CINEMA(p_cp->rsiz) || p_t2_mode == FINAL_PASS)) {
   1530 		opj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
   1531 	}
   1532 	else {
   1533 		opj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
   1534 	}
   1535 
   1536 	return l_pi;
   1537 }
   1538 
   1539 void opj_pi_create_encode( 	opj_pi_iterator_t *pi,
   1540 							opj_cp_t *cp,
   1541 							OPJ_UINT32 tileno,
   1542 							OPJ_UINT32 pino,
   1543 							OPJ_UINT32 tpnum,
   1544 							OPJ_INT32 tppos,
   1545 							J2K_T2_MODE t2_mode)
   1546 {
   1547 	const OPJ_CHAR *prog;
   1548 	OPJ_INT32 i;
   1549 	OPJ_UINT32 incr_top=1,resetX=0;
   1550 	opj_tcp_t *tcps =&cp->tcps[tileno];
   1551 	opj_poc_t *tcp= &tcps->pocs[pino];
   1552 
   1553 	prog = opj_j2k_convert_progression_order(tcp->prg);
   1554 
   1555 	pi[pino].first = 1;
   1556 	pi[pino].poc.prg = tcp->prg;
   1557 
   1558     if(!(cp->m_specific_param.m_enc.m_tp_on && ((!OPJ_IS_CINEMA(cp->rsiz) && (t2_mode == FINAL_PASS)) || OPJ_IS_CINEMA(cp->rsiz)))){
   1559 		pi[pino].poc.resno0 = tcp->resS;
   1560 		pi[pino].poc.resno1 = tcp->resE;
   1561 		pi[pino].poc.compno0 = tcp->compS;
   1562 		pi[pino].poc.compno1 = tcp->compE;
   1563 		pi[pino].poc.layno0 = tcp->layS;
   1564 		pi[pino].poc.layno1 = tcp->layE;
   1565 		pi[pino].poc.precno0 = tcp->prcS;
   1566 		pi[pino].poc.precno1 = tcp->prcE;
   1567 		pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
   1568 		pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
   1569 		pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
   1570 		pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
   1571 	}else {
   1572 		for(i=tppos+1;i<4;i++){
   1573 			switch(prog[i]){
   1574 			case 'R':
   1575 				pi[pino].poc.resno0 = tcp->resS;
   1576 				pi[pino].poc.resno1 = tcp->resE;
   1577 				break;
   1578 			case 'C':
   1579 				pi[pino].poc.compno0 = tcp->compS;
   1580 				pi[pino].poc.compno1 = tcp->compE;
   1581 				break;
   1582 			case 'L':
   1583 				pi[pino].poc.layno0 = tcp->layS;
   1584 				pi[pino].poc.layno1 = tcp->layE;
   1585 				break;
   1586 			case 'P':
   1587 				switch(tcp->prg){
   1588 				case OPJ_LRCP:
   1589 				case OPJ_RLCP:
   1590 					pi[pino].poc.precno0 = tcp->prcS;
   1591 					pi[pino].poc.precno1 = tcp->prcE;
   1592 					break;
   1593 				default:
   1594 					pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
   1595 					pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
   1596 					pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
   1597 					pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
   1598 					break;
   1599 				}
   1600 				break;
   1601 			}
   1602 		}
   1603 
   1604 		if(tpnum==0){
   1605 			for(i=tppos;i>=0;i--){
   1606 				switch(prog[i]){
   1607 				case 'C':
   1608 					tcp->comp_t = tcp->compS;
   1609 					pi[pino].poc.compno0 = tcp->comp_t;
   1610 					pi[pino].poc.compno1 = tcp->comp_t+1;
   1611 					tcp->comp_t+=1;
   1612 					break;
   1613 				case 'R':
   1614 					tcp->res_t = tcp->resS;
   1615 					pi[pino].poc.resno0 = tcp->res_t;
   1616 					pi[pino].poc.resno1 = tcp->res_t+1;
   1617 					tcp->res_t+=1;
   1618 					break;
   1619 				case 'L':
   1620 					tcp->lay_t = tcp->layS;
   1621 					pi[pino].poc.layno0 = tcp->lay_t;
   1622 					pi[pino].poc.layno1 = tcp->lay_t+1;
   1623 					tcp->lay_t+=1;
   1624 					break;
   1625 				case 'P':
   1626 					switch(tcp->prg){
   1627 					case OPJ_LRCP:
   1628 					case OPJ_RLCP:
   1629 						tcp->prc_t = tcp->prcS;
   1630 						pi[pino].poc.precno0 = tcp->prc_t;
   1631 						pi[pino].poc.precno1 = tcp->prc_t+1;
   1632 						tcp->prc_t+=1;
   1633 						break;
   1634 					default:
   1635 						tcp->tx0_t = tcp->txS;
   1636 						tcp->ty0_t = tcp->tyS;
   1637 						pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
   1638 						pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx));
   1639 						pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
   1640 						pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
   1641 						tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
   1642 						tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
   1643 						break;
   1644 					}
   1645 					break;
   1646 				}
   1647 			}
   1648 			incr_top=1;
   1649 		}else{
   1650 			for(i=tppos;i>=0;i--){
   1651 				switch(prog[i]){
   1652 				case 'C':
   1653 					pi[pino].poc.compno0 = tcp->comp_t-1;
   1654 					pi[pino].poc.compno1 = tcp->comp_t;
   1655 					break;
   1656 				case 'R':
   1657 					pi[pino].poc.resno0 = tcp->res_t-1;
   1658 					pi[pino].poc.resno1 = tcp->res_t;
   1659 					break;
   1660 				case 'L':
   1661 					pi[pino].poc.layno0 = tcp->lay_t-1;
   1662 					pi[pino].poc.layno1 = tcp->lay_t;
   1663 					break;
   1664 				case 'P':
   1665 					switch(tcp->prg){
   1666 					case OPJ_LRCP:
   1667 					case OPJ_RLCP:
   1668 						pi[pino].poc.precno0 = tcp->prc_t-1;
   1669 						pi[pino].poc.precno1 = tcp->prc_t;
   1670 						break;
   1671 					default:
   1672 						pi[pino].poc.tx0 = (OPJ_INT32)(tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx));
   1673 						pi[pino].poc.tx1 = (OPJ_INT32)tcp->tx0_t ;
   1674 						pi[pino].poc.ty0 = (OPJ_INT32)(tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy));
   1675 						pi[pino].poc.ty1 = (OPJ_INT32)tcp->ty0_t ;
   1676 						break;
   1677 					}
   1678 					break;
   1679 				}
   1680 				if(incr_top==1){
   1681 					switch(prog[i]){
   1682 					case 'R':
   1683 						if(tcp->res_t==tcp->resE){
   1684 							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
   1685 								tcp->res_t = tcp->resS;
   1686 								pi[pino].poc.resno0 = tcp->res_t;
   1687 								pi[pino].poc.resno1 = tcp->res_t+1;
   1688 								tcp->res_t+=1;
   1689 								incr_top=1;
   1690 							}else{
   1691 								incr_top=0;
   1692 							}
   1693 						}else{
   1694 							pi[pino].poc.resno0 = tcp->res_t;
   1695 							pi[pino].poc.resno1 = tcp->res_t+1;
   1696 							tcp->res_t+=1;
   1697 							incr_top=0;
   1698 						}
   1699 						break;
   1700 					case 'C':
   1701 						if(tcp->comp_t ==tcp->compE){
   1702 							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
   1703 								tcp->comp_t = tcp->compS;
   1704 								pi[pino].poc.compno0 = tcp->comp_t;
   1705 								pi[pino].poc.compno1 = tcp->comp_t+1;
   1706 								tcp->comp_t+=1;
   1707 								incr_top=1;
   1708 							}else{
   1709 								incr_top=0;
   1710 							}
   1711 						}else{
   1712 							pi[pino].poc.compno0 = tcp->comp_t;
   1713 							pi[pino].poc.compno1 = tcp->comp_t+1;
   1714 							tcp->comp_t+=1;
   1715 							incr_top=0;
   1716 						}
   1717 						break;
   1718 					case 'L':
   1719 						if(tcp->lay_t == tcp->layE){
   1720 							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
   1721 								tcp->lay_t = tcp->layS;
   1722 								pi[pino].poc.layno0 = tcp->lay_t;
   1723 								pi[pino].poc.layno1 = tcp->lay_t+1;
   1724 								tcp->lay_t+=1;
   1725 								incr_top=1;
   1726 							}else{
   1727 								incr_top=0;
   1728 							}
   1729 						}else{
   1730 							pi[pino].poc.layno0 = tcp->lay_t;
   1731 							pi[pino].poc.layno1 = tcp->lay_t+1;
   1732 							tcp->lay_t+=1;
   1733 							incr_top=0;
   1734 						}
   1735 						break;
   1736 					case 'P':
   1737 						switch(tcp->prg){
   1738 						case OPJ_LRCP:
   1739 						case OPJ_RLCP:
   1740 							if(tcp->prc_t == tcp->prcE){
   1741 								if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
   1742 									tcp->prc_t = tcp->prcS;
   1743 									pi[pino].poc.precno0 = tcp->prc_t;
   1744 									pi[pino].poc.precno1 = tcp->prc_t+1;
   1745 									tcp->prc_t+=1;
   1746 									incr_top=1;
   1747 								}else{
   1748 									incr_top=0;
   1749 								}
   1750 							}else{
   1751 								pi[pino].poc.precno0 = tcp->prc_t;
   1752 								pi[pino].poc.precno1 = tcp->prc_t+1;
   1753 								tcp->prc_t+=1;
   1754 								incr_top=0;
   1755 							}
   1756 							break;
   1757 						default:
   1758 							if(tcp->tx0_t >= tcp->txE){
   1759 								if(tcp->ty0_t >= tcp->tyE){
   1760 									if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
   1761 										tcp->ty0_t = tcp->tyS;
   1762 										pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
   1763 										pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
   1764 										tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
   1765 										incr_top=1;resetX=1;
   1766 									}else{
   1767 										incr_top=0;resetX=0;
   1768 									}
   1769 								}else{
   1770 									pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
   1771 									pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
   1772 									tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
   1773 									incr_top=0;resetX=1;
   1774 								}
   1775 								if(resetX==1){
   1776 									tcp->tx0_t = tcp->txS;
   1777 									pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
   1778 									pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));
   1779 									tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
   1780 								}
   1781 							}else{
   1782 								pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
   1783 								pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));
   1784 								tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
   1785 								incr_top=0;
   1786 							}
   1787 							break;
   1788 						}
   1789 						break;
   1790 					}
   1791 				}
   1792 			}
   1793 		}
   1794 	}
   1795 }
   1796 
   1797 void opj_pi_destroy(opj_pi_iterator_t *p_pi,
   1798                     OPJ_UINT32 p_nb_elements)
   1799 {
   1800 	OPJ_UINT32 compno, pino;
   1801 	opj_pi_iterator_t *l_current_pi = p_pi;
   1802     if (p_pi) {
   1803 		if (p_pi->include) {
   1804 			opj_free(p_pi->include);
   1805 			p_pi->include = 00;
   1806 		}
   1807 		for (pino = 0; pino < p_nb_elements; ++pino){
   1808 			if(l_current_pi->comps) {
   1809 				opj_pi_comp_t *l_current_component = l_current_pi->comps;
   1810                 for (compno = 0; compno < l_current_pi->numcomps; compno++){
   1811                     if(l_current_component->resolutions) {
   1812 						opj_free(l_current_component->resolutions);
   1813 						l_current_component->resolutions = 00;
   1814 					}
   1815 
   1816 					++l_current_component;
   1817 				}
   1818 				opj_free(l_current_pi->comps);
   1819 				l_current_pi->comps = 0;
   1820 			}
   1821 			++l_current_pi;
   1822 		}
   1823 		opj_free(p_pi);
   1824 	}
   1825 }
   1826 
   1827 
   1828 
   1829 void opj_pi_update_encoding_parameters(	const opj_image_t *p_image,
   1830                                         opj_cp_t *p_cp,
   1831                                         OPJ_UINT32 p_tile_no )
   1832 {
   1833 	/* encoding parameters to set */
   1834 	OPJ_UINT32 l_max_res;
   1835 	OPJ_UINT32 l_max_prec;
   1836 	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
   1837 	OPJ_UINT32 l_dx_min,l_dy_min;
   1838 
   1839 	/* pointers */
   1840 	opj_tcp_t *l_tcp = 00;
   1841 
   1842 	/* preconditions */
   1843 	assert(p_cp != 00);
   1844 	assert(p_image != 00);
   1845 	assert(p_tile_no < p_cp->tw * p_cp->th);
   1846 
   1847 	l_tcp = &(p_cp->tcps[p_tile_no]);
   1848 
   1849 	/* get encoding parameters */
   1850 	opj_get_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res);
   1851 
   1852 	if (l_tcp->POC) {
   1853 		opj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
   1854 	}
   1855 	else {
   1856 		opj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
   1857 	}
   1858 }
   1859 
   1860 OPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi) {
   1861 	switch (pi->poc.prg) {
   1862 		case OPJ_LRCP:
   1863 			return opj_pi_next_lrcp(pi);
   1864 		case OPJ_RLCP:
   1865 			return opj_pi_next_rlcp(pi);
   1866 		case OPJ_RPCL:
   1867 			return opj_pi_next_rpcl(pi);
   1868 		case OPJ_PCRL:
   1869 			return opj_pi_next_pcrl(pi);
   1870 		case OPJ_CPRL:
   1871 			return opj_pi_next_cprl(pi);
   1872 		case OPJ_PROG_UNKNOWN:
   1873 			return OPJ_FALSE;
   1874 	}
   1875 
   1876 	return OPJ_FALSE;
   1877 }
   1878