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/** 48Get 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*/ 52static OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi); 53/** 54Get 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*/ 58static OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi); 59/** 60Get 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*/ 64static OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi); 65/** 66Get 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*/ 70static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi); 71/** 72Get 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*/ 76static 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 */ 92static 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 */ 118static 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 */ 144static 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 */ 176static 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 */ 196static 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 */ 202static 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 */ 209static 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 */ 217OPJ_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 233OPJ_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 } 264LABEL_SKIP:; 265 } 266 } 267 } 268 } 269 270 return OPJ_FALSE; 271} 272 273OPJ_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 } 303LABEL_SKIP:; 304 } 305 } 306 } 307 } 308 309 return OPJ_FALSE; 310} 311 312OPJ_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 } 336if (!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 } 385LABEL_SKIP:; 386 } 387 } 388 } 389 } 390 } 391 392 return OPJ_FALSE; 393} 394 395OPJ_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 } 466LABEL_SKIP:; 467 } 468 } 469 } 470 } 471 } 472 473 return OPJ_FALSE; 474} 475 476OPJ_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 } 545LABEL_SKIP:; 546 } 547 } 548 } 549 } 550 } 551 552 return OPJ_FALSE; 553} 554 555void 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 669void 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 792opj_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 853void 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 931void 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 986void 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 1028void 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 1065OPJ_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*/ 1154opj_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 1354opj_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 1539void 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 1797void 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 1829void 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 1860OPJ_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