| 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 |  * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR | 
| 16 |  * Copyright (c) 2012, CS Systemes d'Information, France | 
| 17 |  * Copyright (c) 2017, IntoPIX SA <support@intopix.com> | 
| 18 |  * All rights reserved. | 
| 19 |  * | 
| 20 |  * Redistribution and use in source and binary forms, with or without | 
| 21 |  * modification, are permitted provided that the following conditions | 
| 22 |  * are met: | 
| 23 |  * 1. Redistributions of source code must retain the above copyright | 
| 24 |  *    notice, this list of conditions and the following disclaimer. | 
| 25 |  * 2. Redistributions in binary form must reproduce the above copyright | 
| 26 |  *    notice, this list of conditions and the following disclaimer in the | 
| 27 |  *    documentation and/or other materials provided with the distribution. | 
| 28 |  * | 
| 29 |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' | 
| 30 |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
| 31 |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
| 32 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | 
| 33 |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
| 34 |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
| 35 |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
| 36 |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
| 37 |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
| 38 |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
| 39 |  * POSSIBILITY OF SUCH DAMAGE. | 
| 40 |  */ | 
| 41 |  | 
| 42 | #include "opj_includes.h" | 
| 43 | #include "opj_common.h" | 
| 44 |  | 
| 45 | /* ----------------------------------------------------------------------- */ | 
| 46 |  | 
| 47 | /* TODO MSD: */ | 
| 48 | #ifdef TODO_MSD | 
| 49 | void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) | 
| 50 | { | 
| 51 |     int tileno, compno, resno, bandno, precno;/*, cblkno;*/ | 
| 52 |  | 
| 53 |     fprintf(fd, "image {\n" ); | 
| 54 |     fprintf(fd, "  tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n" , | 
| 55 |             img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, | 
| 56 |             tcd->image->y1); | 
| 57 |  | 
| 58 |     for (tileno = 0; tileno < img->th * img->tw; tileno++) { | 
| 59 |         opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno]; | 
| 60 |         fprintf(fd, "  tile {\n" ); | 
| 61 |         fprintf(fd, "    x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n" , | 
| 62 |                 tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps); | 
| 63 |         for (compno = 0; compno < tile->numcomps; compno++) { | 
| 64 |             opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; | 
| 65 |             fprintf(fd, "    tilec {\n" ); | 
| 66 |             fprintf(fd, | 
| 67 |                     "      x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n" , | 
| 68 |                     tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions); | 
| 69 |             for (resno = 0; resno < tilec->numresolutions; resno++) { | 
| 70 |                 opj_tcd_resolution_t *res = &tilec->resolutions[resno]; | 
| 71 |                 fprintf(fd, "\n   res {\n" ); | 
| 72 |                 fprintf(fd, | 
| 73 |                         "          x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n" , | 
| 74 |                         res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands); | 
| 75 |                 for (bandno = 0; bandno < res->numbands; bandno++) { | 
| 76 |                     opj_tcd_band_t *band = &res->bands[bandno]; | 
| 77 |                     fprintf(fd, "        band {\n" ); | 
| 78 |                     fprintf(fd, | 
| 79 |                             "          x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n" , | 
| 80 |                             band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps); | 
| 81 |                     for (precno = 0; precno < res->pw * res->ph; precno++) { | 
| 82 |                         opj_tcd_precinct_t *prec = &band->precincts[precno]; | 
| 83 |                         fprintf(fd, "          prec {\n" ); | 
| 84 |                         fprintf(fd, | 
| 85 |                                 "            x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n" , | 
| 86 |                                 prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch); | 
| 87 |                         /* | 
| 88 |                         for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) { | 
| 89 |                                 opj_tcd_cblk_t *cblk = &prec->cblks[cblkno]; | 
| 90 |                                 fprintf(fd, "            cblk {\n"); | 
| 91 |                                 fprintf(fd, | 
| 92 |                                         "              x0=%d, y0=%d, x1=%d, y1=%d\n", | 
| 93 |                                         cblk->x0, cblk->y0, cblk->x1, cblk->y1); | 
| 94 |                                 fprintf(fd, "            }\n"); | 
| 95 |                         } | 
| 96 |                         */ | 
| 97 |                         fprintf(fd, "          }\n" ); | 
| 98 |                     } | 
| 99 |                     fprintf(fd, "        }\n" ); | 
| 100 |                 } | 
| 101 |                 fprintf(fd, "      }\n" ); | 
| 102 |             } | 
| 103 |             fprintf(fd, "    }\n" ); | 
| 104 |         } | 
| 105 |         fprintf(fd, "  }\n" ); | 
| 106 |     } | 
| 107 |     fprintf(fd, "}\n" ); | 
| 108 | } | 
| 109 | #endif | 
| 110 |  | 
| 111 | /** | 
| 112 |  * Initializes tile coding/decoding | 
| 113 |  */ | 
| 114 | static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, | 
| 115 |         OPJ_BOOL isEncoder, OPJ_FLOAT32 fraction, OPJ_SIZE_T sizeof_block, | 
| 116 |         opj_event_mgr_t* manager); | 
| 117 |  | 
| 118 | /** | 
| 119 | * Allocates memory for a decoding code block. | 
| 120 | */ | 
| 121 | static OPJ_BOOL opj_tcd_code_block_dec_allocate(opj_tcd_cblk_dec_t * | 
| 122 |         p_code_block); | 
| 123 |  | 
| 124 | /** | 
| 125 |  * Deallocates the decoding data of the given precinct. | 
| 126 |  */ | 
| 127 | static void opj_tcd_code_block_dec_deallocate(opj_tcd_precinct_t * p_precinct); | 
| 128 |  | 
| 129 | /** | 
| 130 |  * Allocates memory for an encoding code block (but not data). | 
| 131 |  */ | 
| 132 | static OPJ_BOOL opj_tcd_code_block_enc_allocate(opj_tcd_cblk_enc_t * | 
| 133 |         p_code_block); | 
| 134 |  | 
| 135 | /** | 
| 136 |  * Allocates data for an encoding code block | 
| 137 |  */ | 
| 138 | static OPJ_BOOL opj_tcd_code_block_enc_allocate_data(opj_tcd_cblk_enc_t * | 
| 139 |         p_code_block); | 
| 140 |  | 
| 141 | /** | 
| 142 |  * Deallocates the encoding data of the given precinct. | 
| 143 |  */ | 
| 144 | static void opj_tcd_code_block_enc_deallocate(opj_tcd_precinct_t * p_precinct); | 
| 145 |  | 
| 146 |  | 
| 147 | /** | 
| 148 | Free the memory allocated for encoding | 
| 149 | @param tcd TCD handle | 
| 150 | */ | 
| 151 | static void opj_tcd_free_tile(opj_tcd_t *tcd); | 
| 152 |  | 
| 153 |  | 
| 154 | static OPJ_BOOL opj_tcd_t2_decode(opj_tcd_t *p_tcd, | 
| 155 |                                   OPJ_BYTE * p_src_data, | 
| 156 |                                   OPJ_UINT32 * p_data_read, | 
| 157 |                                   OPJ_UINT32 p_max_src_size, | 
| 158 |                                   opj_codestream_index_t *p_cstr_index, | 
| 159 |                                   opj_event_mgr_t *p_manager); | 
| 160 |  | 
| 161 | static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd, | 
| 162 |                                   opj_event_mgr_t *p_manager); | 
| 163 |  | 
| 164 | static OPJ_BOOL opj_tcd_dwt_decode(opj_tcd_t *p_tcd); | 
| 165 |  | 
| 166 | static OPJ_BOOL opj_tcd_mct_decode(opj_tcd_t *p_tcd, | 
| 167 |                                    opj_event_mgr_t *p_manager); | 
| 168 |  | 
| 169 | static OPJ_BOOL opj_tcd_dc_level_shift_decode(opj_tcd_t *p_tcd); | 
| 170 |  | 
| 171 |  | 
| 172 | static OPJ_BOOL opj_tcd_dc_level_shift_encode(opj_tcd_t *p_tcd); | 
| 173 |  | 
| 174 | static OPJ_BOOL opj_tcd_mct_encode(opj_tcd_t *p_tcd); | 
| 175 |  | 
| 176 | static OPJ_BOOL opj_tcd_dwt_encode(opj_tcd_t *p_tcd); | 
| 177 |  | 
| 178 | static OPJ_BOOL opj_tcd_t1_encode(opj_tcd_t *p_tcd); | 
| 179 |  | 
| 180 | static OPJ_BOOL opj_tcd_t2_encode(opj_tcd_t *p_tcd, | 
| 181 |                                   OPJ_BYTE * p_dest_data, | 
| 182 |                                   OPJ_UINT32 * p_data_written, | 
| 183 |                                   OPJ_UINT32 p_max_dest_size, | 
| 184 |                                   opj_codestream_info_t *p_cstr_info, | 
| 185 |                                   opj_event_mgr_t *p_manager); | 
| 186 |  | 
| 187 | static OPJ_BOOL opj_tcd_rate_allocate_encode(opj_tcd_t *p_tcd, | 
| 188 |         OPJ_BYTE * p_dest_data, | 
| 189 |         OPJ_UINT32 p_max_dest_size, | 
| 190 |         opj_codestream_info_t *p_cstr_info, | 
| 191 |         opj_event_mgr_t *p_manager); | 
| 192 |  | 
| 193 |  | 
| 194 | static OPJ_BOOL opj_tcd_is_whole_tilecomp_decoding(opj_tcd_t *tcd, | 
| 195 |         OPJ_UINT32 compno); | 
| 196 |  | 
| 197 | /* ----------------------------------------------------------------------- */ | 
| 198 |  | 
| 199 | /** | 
| 200 | Create a new TCD handle | 
| 201 | */ | 
| 202 | opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder) | 
| 203 | { | 
| 204 |     opj_tcd_t *l_tcd = 00; | 
| 205 |  | 
| 206 |     /* create the tcd structure */ | 
| 207 |     l_tcd = (opj_tcd_t*) opj_calloc(1, sizeof(opj_tcd_t)); | 
| 208 |     if (!l_tcd) { | 
| 209 |         return 00; | 
| 210 |     } | 
| 211 |  | 
| 212 |     l_tcd->m_is_decoder = p_is_decoder ? 1 : 0; | 
| 213 |  | 
| 214 |     l_tcd->tcd_image = (opj_tcd_image_t*)opj_calloc(1, sizeof(opj_tcd_image_t)); | 
| 215 |     if (!l_tcd->tcd_image) { | 
| 216 |         opj_free(l_tcd); | 
| 217 |         return 00; | 
| 218 |     } | 
| 219 |  | 
| 220 |     return l_tcd; | 
| 221 | } | 
| 222 |  | 
| 223 |  | 
| 224 | /* ----------------------------------------------------------------------- */ | 
| 225 |  | 
| 226 | void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd) | 
| 227 | { | 
| 228 |     OPJ_UINT32 layno; | 
| 229 |  | 
| 230 |     for (layno = 0; layno < tcd->tcp->numlayers; layno++) { | 
| 231 |         opj_tcd_makelayer_fixed(tcd, layno, 1); | 
| 232 |     } | 
| 233 | } | 
| 234 |  | 
| 235 |  | 
| 236 | void opj_tcd_makelayer(opj_tcd_t *tcd, | 
| 237 |                        OPJ_UINT32 layno, | 
| 238 |                        OPJ_FLOAT64 thresh, | 
| 239 |                        OPJ_UINT32 final) | 
| 240 | { | 
| 241 |     OPJ_UINT32 compno, resno, bandno, precno, cblkno; | 
| 242 |     OPJ_UINT32 passno; | 
| 243 |  | 
| 244 |     opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles; | 
| 245 |  | 
| 246 |     tcd_tile->distolayer[layno] = 0;        /* fixed_quality */ | 
| 247 |  | 
| 248 |     for (compno = 0; compno < tcd_tile->numcomps; compno++) { | 
| 249 |         opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; | 
| 250 |  | 
| 251 |         for (resno = 0; resno < tilec->numresolutions; resno++) { | 
| 252 |             opj_tcd_resolution_t *res = &tilec->resolutions[resno]; | 
| 253 |  | 
| 254 |             for (bandno = 0; bandno < res->numbands; bandno++) { | 
| 255 |                 opj_tcd_band_t *band = &res->bands[bandno]; | 
| 256 |  | 
| 257 |                 /* Skip empty bands */ | 
| 258 |                 if (opj_tcd_is_band_empty(band)) { | 
| 259 |                     continue; | 
| 260 |                 } | 
| 261 |  | 
| 262 |                 for (precno = 0; precno < res->pw * res->ph; precno++) { | 
| 263 |                     opj_tcd_precinct_t *prc = &band->precincts[precno]; | 
| 264 |  | 
| 265 |                     for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { | 
| 266 |                         opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; | 
| 267 |                         opj_tcd_layer_t *layer = &cblk->layers[layno]; | 
| 268 |                         OPJ_UINT32 n; | 
| 269 |  | 
| 270 |                         if (layno == 0) { | 
| 271 |                             cblk->numpassesinlayers = 0; | 
| 272 |                         } | 
| 273 |  | 
| 274 |                         n = cblk->numpassesinlayers; | 
| 275 |  | 
| 276 |                         if (thresh < 0) { | 
| 277 |                             /* Special value to indicate to use all passes */ | 
| 278 |                             n = cblk->totalpasses; | 
| 279 |                         } else { | 
| 280 |                             for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) { | 
| 281 |                                 OPJ_UINT32 dr; | 
| 282 |                                 OPJ_FLOAT64 dd; | 
| 283 |                                 opj_tcd_pass_t *pass = &cblk->passes[passno]; | 
| 284 |  | 
| 285 |                                 if (n == 0) { | 
| 286 |                                     dr = pass->rate; | 
| 287 |                                     dd = pass->distortiondec; | 
| 288 |                                 } else { | 
| 289 |                                     dr = pass->rate - cblk->passes[n - 1].rate; | 
| 290 |                                     dd = pass->distortiondec - cblk->passes[n - 1].distortiondec; | 
| 291 |                                 } | 
| 292 |  | 
| 293 |                                 if (!dr) { | 
| 294 |                                     if (dd != 0) { | 
| 295 |                                         n = passno + 1; | 
| 296 |                                     } | 
| 297 |                                     continue; | 
| 298 |                                 } | 
| 299 |                                 if (thresh - (dd / dr) < | 
| 300 |                                         DBL_EPSILON) { /* do not rely on float equality, check with DBL_EPSILON margin */ | 
| 301 |                                     n = passno + 1; | 
| 302 |                                 } | 
| 303 |                             } | 
| 304 |                         } | 
| 305 |  | 
| 306 |                         layer->numpasses = n - cblk->numpassesinlayers; | 
| 307 |  | 
| 308 |                         if (!layer->numpasses) { | 
| 309 |                             layer->disto = 0; | 
| 310 |                             continue; | 
| 311 |                         } | 
| 312 |  | 
| 313 |                         if (cblk->numpassesinlayers == 0) { | 
| 314 |                             layer->len = cblk->passes[n - 1].rate; | 
| 315 |                             layer->data = cblk->data; | 
| 316 |                             layer->disto = cblk->passes[n - 1].distortiondec; | 
| 317 |                         } else { | 
| 318 |                             layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - | 
| 319 |                                          1].rate; | 
| 320 |                             layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; | 
| 321 |                             layer->disto = cblk->passes[n - 1].distortiondec - | 
| 322 |                                            cblk->passes[cblk->numpassesinlayers - 1].distortiondec; | 
| 323 |                         } | 
| 324 |  | 
| 325 |                         tcd_tile->distolayer[layno] += layer->disto;    /* fixed_quality */ | 
| 326 |  | 
| 327 |                         if (final) { | 
| 328 |                             cblk->numpassesinlayers = n; | 
| 329 |                         } | 
| 330 |                     } | 
| 331 |                 } | 
| 332 |             } | 
| 333 |         } | 
| 334 |     } | 
| 335 | } | 
| 336 |  | 
| 337 | void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, | 
| 338 |                              OPJ_UINT32 final) | 
| 339 | { | 
| 340 |     OPJ_UINT32 compno, resno, bandno, precno, cblkno; | 
| 341 |     OPJ_INT32 value;                        /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */ | 
| 342 |     OPJ_INT32 matrice[10][10][3]; | 
| 343 |     OPJ_UINT32 i, j, k; | 
| 344 |  | 
| 345 |     opj_cp_t *cp = tcd->cp; | 
| 346 |     opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles; | 
| 347 |     opj_tcp_t *tcd_tcp = tcd->tcp; | 
| 348 |  | 
| 349 |     for (compno = 0; compno < tcd_tile->numcomps; compno++) { | 
| 350 |         opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; | 
| 351 |  | 
| 352 |         for (i = 0; i < tcd_tcp->numlayers; i++) { | 
| 353 |             for (j = 0; j < tilec->numresolutions; j++) { | 
| 354 |                 for (k = 0; k < 3; k++) { | 
| 355 |                     matrice[i][j][k] = | 
| 356 |                         (OPJ_INT32)((OPJ_FLOAT32)cp->m_specific_param.m_enc.m_matrice[i * | 
| 357 |                                       tilec->numresolutions * 3 + j * 3 + k] | 
| 358 |                                     * (OPJ_FLOAT32)(tcd->image->comps[compno].prec / 16.0)); | 
| 359 |                 } | 
| 360 |             } | 
| 361 |         } | 
| 362 |  | 
| 363 |         for (resno = 0; resno < tilec->numresolutions; resno++) { | 
| 364 |             opj_tcd_resolution_t *res = &tilec->resolutions[resno]; | 
| 365 |  | 
| 366 |             for (bandno = 0; bandno < res->numbands; bandno++) { | 
| 367 |                 opj_tcd_band_t *band = &res->bands[bandno]; | 
| 368 |  | 
| 369 |                 /* Skip empty bands */ | 
| 370 |                 if (opj_tcd_is_band_empty(band)) { | 
| 371 |                     continue; | 
| 372 |                 } | 
| 373 |  | 
| 374 |                 for (precno = 0; precno < res->pw * res->ph; precno++) { | 
| 375 |                     opj_tcd_precinct_t *prc = &band->precincts[precno]; | 
| 376 |  | 
| 377 |                     for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { | 
| 378 |                         opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; | 
| 379 |                         opj_tcd_layer_t *layer = &cblk->layers[layno]; | 
| 380 |                         OPJ_UINT32 n; | 
| 381 |                         OPJ_INT32 imsb = (OPJ_INT32)(tcd->image->comps[compno].prec - | 
| 382 |                                                      cblk->numbps); /* number of bit-plan equal to zero */ | 
| 383 |  | 
| 384 |                         /* Correction of the matrix of coefficient to include the IMSB information */ | 
| 385 |                         if (layno == 0) { | 
| 386 |                             value = matrice[layno][resno][bandno]; | 
| 387 |                             if (imsb >= value) { | 
| 388 |                                 value = 0; | 
| 389 |                             } else { | 
| 390 |                                 value -= imsb; | 
| 391 |                             } | 
| 392 |                         } else { | 
| 393 |                             value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno]; | 
| 394 |                             if (imsb >= matrice[layno - 1][resno][bandno]) { | 
| 395 |                                 value -= (imsb - matrice[layno - 1][resno][bandno]); | 
| 396 |                                 if (value < 0) { | 
| 397 |                                     value = 0; | 
| 398 |                                 } | 
| 399 |                             } | 
| 400 |                         } | 
| 401 |  | 
| 402 |                         if (layno == 0) { | 
| 403 |                             cblk->numpassesinlayers = 0; | 
| 404 |                         } | 
| 405 |  | 
| 406 |                         n = cblk->numpassesinlayers; | 
| 407 |                         if (cblk->numpassesinlayers == 0) { | 
| 408 |                             if (value != 0) { | 
| 409 |                                 n = 3 * (OPJ_UINT32)value - 2 + cblk->numpassesinlayers; | 
| 410 |                             } else { | 
| 411 |                                 n = cblk->numpassesinlayers; | 
| 412 |                             } | 
| 413 |                         } else { | 
| 414 |                             n = 3 * (OPJ_UINT32)value + cblk->numpassesinlayers; | 
| 415 |                         } | 
| 416 |  | 
| 417 |                         layer->numpasses = n - cblk->numpassesinlayers; | 
| 418 |  | 
| 419 |                         if (!layer->numpasses) { | 
| 420 |                             continue; | 
| 421 |                         } | 
| 422 |  | 
| 423 |                         if (cblk->numpassesinlayers == 0) { | 
| 424 |                             layer->len = cblk->passes[n - 1].rate; | 
| 425 |                             layer->data = cblk->data; | 
| 426 |                         } else { | 
| 427 |                             layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - | 
| 428 |                                          1].rate; | 
| 429 |                             layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; | 
| 430 |                         } | 
| 431 |  | 
| 432 |                         if (final) { | 
| 433 |                             cblk->numpassesinlayers = n; | 
| 434 |                         } | 
| 435 |                     } | 
| 436 |                 } | 
| 437 |             } | 
| 438 |         } | 
| 439 |     } | 
| 440 | } | 
| 441 |  | 
| 442 | OPJ_BOOL opj_tcd_rateallocate(opj_tcd_t *tcd, | 
| 443 |                               OPJ_BYTE *dest, | 
| 444 |                               OPJ_UINT32 * p_data_written, | 
| 445 |                               OPJ_UINT32 len, | 
| 446 |                               opj_codestream_info_t *cstr_info, | 
| 447 |                               opj_event_mgr_t *p_manager) | 
| 448 | { | 
| 449 |     OPJ_UINT32 compno, resno, bandno, precno, cblkno, layno; | 
| 450 |     OPJ_UINT32 passno; | 
| 451 |     OPJ_FLOAT64 min, max; | 
| 452 |     OPJ_FLOAT64 cumdisto[100];      /* fixed_quality */ | 
| 453 |     const OPJ_FLOAT64 K = 1;                /* 1.1; fixed_quality */ | 
| 454 |     OPJ_FLOAT64 maxSE = 0; | 
| 455 |  | 
| 456 |     opj_cp_t *cp = tcd->cp; | 
| 457 |     opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles; | 
| 458 |     opj_tcp_t *tcd_tcp = tcd->tcp; | 
| 459 |  | 
| 460 |     min = DBL_MAX; | 
| 461 |     max = 0; | 
| 462 |  | 
| 463 |     tcd_tile->numpix = 0;           /* fixed_quality */ | 
| 464 |  | 
| 465 |     for (compno = 0; compno < tcd_tile->numcomps; compno++) { | 
| 466 |         opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; | 
| 467 |         tilec->numpix = 0; | 
| 468 |  | 
| 469 |         for (resno = 0; resno < tilec->numresolutions; resno++) { | 
| 470 |             opj_tcd_resolution_t *res = &tilec->resolutions[resno]; | 
| 471 |  | 
| 472 |             for (bandno = 0; bandno < res->numbands; bandno++) { | 
| 473 |                 opj_tcd_band_t *band = &res->bands[bandno]; | 
| 474 |  | 
| 475 |                 /* Skip empty bands */ | 
| 476 |                 if (opj_tcd_is_band_empty(band)) { | 
| 477 |                     continue; | 
| 478 |                 } | 
| 479 |  | 
| 480 |                 for (precno = 0; precno < res->pw * res->ph; precno++) { | 
| 481 |                     opj_tcd_precinct_t *prc = &band->precincts[precno]; | 
| 482 |  | 
| 483 |                     for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { | 
| 484 |                         opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; | 
| 485 |  | 
| 486 |                         for (passno = 0; passno < cblk->totalpasses; passno++) { | 
| 487 |                             opj_tcd_pass_t *pass = &cblk->passes[passno]; | 
| 488 |                             OPJ_INT32 dr; | 
| 489 |                             OPJ_FLOAT64 dd, rdslope; | 
| 490 |  | 
| 491 |                             if (passno == 0) { | 
| 492 |                                 dr = (OPJ_INT32)pass->rate; | 
| 493 |                                 dd = pass->distortiondec; | 
| 494 |                             } else { | 
| 495 |                                 dr = (OPJ_INT32)(pass->rate - cblk->passes[passno - 1].rate); | 
| 496 |                                 dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec; | 
| 497 |                             } | 
| 498 |  | 
| 499 |                             if (dr == 0) { | 
| 500 |                                 continue; | 
| 501 |                             } | 
| 502 |  | 
| 503 |                             rdslope = dd / dr; | 
| 504 |                             if (rdslope < min) { | 
| 505 |                                 min = rdslope; | 
| 506 |                             } | 
| 507 |  | 
| 508 |                             if (rdslope > max) { | 
| 509 |                                 max = rdslope; | 
| 510 |                             } | 
| 511 |                         } /* passno */ | 
| 512 |  | 
| 513 |                         /* fixed_quality */ | 
| 514 |                         tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); | 
| 515 |                         tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); | 
| 516 |                     } /* cbklno */ | 
| 517 |                 } /* precno */ | 
| 518 |             } /* bandno */ | 
| 519 |         } /* resno */ | 
| 520 |  | 
| 521 |         maxSE += (((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) - 1.0) | 
| 522 |                   * ((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) - 1.0)) | 
| 523 |                  * ((OPJ_FLOAT64)(tilec->numpix)); | 
| 524 |     } /* compno */ | 
| 525 |  | 
| 526 |     /* index file */ | 
| 527 |     if (cstr_info) { | 
| 528 |         opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno]; | 
| 529 |         tile_info->numpix = tcd_tile->numpix; | 
| 530 |         tile_info->distotile = tcd_tile->distotile; | 
| 531 |         tile_info->thresh = (OPJ_FLOAT64 *) opj_malloc(tcd_tcp->numlayers * sizeof( | 
| 532 |                                 OPJ_FLOAT64)); | 
| 533 |         if (!tile_info->thresh) { | 
| 534 |             /* FIXME event manager error callback */ | 
| 535 |             return OPJ_FALSE; | 
| 536 |         } | 
| 537 |     } | 
| 538 |  | 
| 539 |     for (layno = 0; layno < tcd_tcp->numlayers; layno++) { | 
| 540 |         OPJ_FLOAT64 lo = min; | 
| 541 |         OPJ_FLOAT64 hi = max; | 
| 542 |         OPJ_UINT32 maxlen = tcd_tcp->rates[layno] > 0.0f ? opj_uint_min((( | 
| 543 |                                 OPJ_UINT32) ceil(tcd_tcp->rates[layno])), len) : len; | 
| 544 |         OPJ_FLOAT64 goodthresh = 0; | 
| 545 |         OPJ_FLOAT64 stable_thresh = 0; | 
| 546 |         OPJ_UINT32 i; | 
| 547 |         OPJ_FLOAT64 distotarget;                /* fixed_quality */ | 
| 548 |  | 
| 549 |         /* fixed_quality */ | 
| 550 |         distotarget = tcd_tile->distotile - ((K * maxSE) / pow((OPJ_FLOAT32)10, | 
| 551 |                                              tcd_tcp->distoratio[layno] / 10)); | 
| 552 |  | 
| 553 |         /* Don't try to find an optimal threshold but rather take everything not included yet, if | 
| 554 |           -r xx,yy,zz,0   (disto_alloc == 1 and rates == 0) | 
| 555 |           -q xx,yy,zz,0   (fixed_quality == 1 and distoratio == 0) | 
| 556 |           ==> possible to have some lossy layers and the last layer for sure lossless */ | 
| 557 |         if (((cp->m_specific_param.m_enc.m_disto_alloc == 1) && | 
| 558 |                 (tcd_tcp->rates[layno] > 0.0f)) || | 
| 559 |                 ((cp->m_specific_param.m_enc.m_fixed_quality == 1) && | 
| 560 |                  (tcd_tcp->distoratio[layno] > 0.0))) { | 
| 561 |             opj_t2_t*t2 = opj_t2_create(tcd->image, cp); | 
| 562 |             OPJ_FLOAT64 thresh = 0; | 
| 563 |  | 
| 564 |             if (t2 == 00) { | 
| 565 |                 return OPJ_FALSE; | 
| 566 |             } | 
| 567 |  | 
| 568 |             for (i = 0; i < 128; ++i) { | 
| 569 |                 OPJ_FLOAT64 distoachieved = 0;  /* fixed_quality */ | 
| 570 |  | 
| 571 |                 thresh = (lo + hi) / 2; | 
| 572 |  | 
| 573 |                 opj_tcd_makelayer(tcd, layno, thresh, 0); | 
| 574 |  | 
| 575 |                 if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* fixed_quality */ | 
| 576 |                     if (OPJ_IS_CINEMA(cp->rsiz)) { | 
| 577 |                         if (! opj_t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, | 
| 578 |                                                     p_data_written, maxlen, cstr_info, tcd->cur_tp_num, tcd->tp_pos, tcd->cur_pino, | 
| 579 |                                                     THRESH_CALC, p_manager)) { | 
| 580 |  | 
| 581 |                             lo = thresh; | 
| 582 |                             continue; | 
| 583 |                         } else { | 
| 584 |                             distoachieved = layno == 0 ? | 
| 585 |                                             tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno]; | 
| 586 |  | 
| 587 |                             if (distoachieved < distotarget) { | 
| 588 |                                 hi = thresh; | 
| 589 |                                 stable_thresh = thresh; | 
| 590 |                                 continue; | 
| 591 |                             } else { | 
| 592 |                                 lo = thresh; | 
| 593 |                             } | 
| 594 |                         } | 
| 595 |                     } else { | 
| 596 |                         distoachieved = (layno == 0) ? | 
| 597 |                                         tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); | 
| 598 |  | 
| 599 |                         if (distoachieved < distotarget) { | 
| 600 |                             hi = thresh; | 
| 601 |                             stable_thresh = thresh; | 
| 602 |                             continue; | 
| 603 |                         } | 
| 604 |                         lo = thresh; | 
| 605 |                     } | 
| 606 |                 } else { | 
| 607 |                     if (! opj_t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, | 
| 608 |                                                 p_data_written, maxlen, cstr_info, tcd->cur_tp_num, tcd->tp_pos, tcd->cur_pino, | 
| 609 |                                                 THRESH_CALC, p_manager)) { | 
| 610 |                         /* TODO: what to do with l ??? seek / tell ??? */ | 
| 611 |                         /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */ | 
| 612 |                         lo = thresh; | 
| 613 |                         continue; | 
| 614 |                     } | 
| 615 |  | 
| 616 |                     hi = thresh; | 
| 617 |                     stable_thresh = thresh; | 
| 618 |                 } | 
| 619 |             } | 
| 620 |  | 
| 621 |             goodthresh = stable_thresh == 0 ? thresh : stable_thresh; | 
| 622 |  | 
| 623 |             opj_t2_destroy(t2); | 
| 624 |         } else { | 
| 625 |             /* Special value to indicate to use all passes */ | 
| 626 |             goodthresh = -1; | 
| 627 |         } | 
| 628 |  | 
| 629 |         if (cstr_info) { /* Threshold for Marcela Index */ | 
| 630 |             cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh; | 
| 631 |         } | 
| 632 |  | 
| 633 |         opj_tcd_makelayer(tcd, layno, goodthresh, 1); | 
| 634 |  | 
| 635 |         /* fixed_quality */ | 
| 636 |         cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : | 
| 637 |                           (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); | 
| 638 |     } | 
| 639 |  | 
| 640 |     return OPJ_TRUE; | 
| 641 | } | 
| 642 |  | 
| 643 | OPJ_BOOL opj_tcd_init(opj_tcd_t *p_tcd, | 
| 644 |                       opj_image_t * p_image, | 
| 645 |                       opj_cp_t * p_cp, | 
| 646 |                       opj_thread_pool_t* p_tp) | 
| 647 | { | 
| 648 |     p_tcd->image = p_image; | 
| 649 |     p_tcd->cp = p_cp; | 
| 650 |  | 
| 651 |     p_tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_calloc(1, | 
| 652 |                               sizeof(opj_tcd_tile_t)); | 
| 653 |     if (! p_tcd->tcd_image->tiles) { | 
| 654 |         return OPJ_FALSE; | 
| 655 |     } | 
| 656 |  | 
| 657 |     p_tcd->tcd_image->tiles->comps = (opj_tcd_tilecomp_t *) opj_calloc( | 
| 658 |                                          p_image->numcomps, sizeof(opj_tcd_tilecomp_t)); | 
| 659 |     if (! p_tcd->tcd_image->tiles->comps) { | 
| 660 |         return OPJ_FALSE; | 
| 661 |     } | 
| 662 |  | 
| 663 |     p_tcd->tcd_image->tiles->numcomps = p_image->numcomps; | 
| 664 |     p_tcd->tp_pos = p_cp->m_specific_param.m_enc.m_tp_pos; | 
| 665 |     p_tcd->thread_pool = p_tp; | 
| 666 |  | 
| 667 |     return OPJ_TRUE; | 
| 668 | } | 
| 669 |  | 
| 670 | /** | 
| 671 | Destroy a previously created TCD handle | 
| 672 | */ | 
| 673 | void opj_tcd_destroy(opj_tcd_t *tcd) | 
| 674 | { | 
| 675 |     if (tcd) { | 
| 676 |         opj_tcd_free_tile(tcd); | 
| 677 |  | 
| 678 |         if (tcd->tcd_image) { | 
| 679 |             opj_free(tcd->tcd_image); | 
| 680 |             tcd->tcd_image = 00; | 
| 681 |         } | 
| 682 |  | 
| 683 |         opj_free(tcd->used_component); | 
| 684 |  | 
| 685 |         opj_free(tcd); | 
| 686 |     } | 
| 687 | } | 
| 688 |  | 
| 689 | OPJ_BOOL opj_alloc_tile_component_data(opj_tcd_tilecomp_t *l_tilec) | 
| 690 | { | 
| 691 |     if ((l_tilec->data == 00) || | 
| 692 |             ((l_tilec->data_size_needed > l_tilec->data_size) && | 
| 693 |              (l_tilec->ownsData == OPJ_FALSE))) { | 
| 694 |         l_tilec->data = (OPJ_INT32 *) opj_image_data_alloc(l_tilec->data_size_needed); | 
| 695 |         if (!l_tilec->data && l_tilec->data_size_needed != 0) { | 
| 696 |             return OPJ_FALSE; | 
| 697 |         } | 
| 698 |         /*fprintf(stderr, "tAllocate data of tilec (int): %d x OPJ_UINT32n",l_data_size);*/ | 
| 699 |         l_tilec->data_size = l_tilec->data_size_needed; | 
| 700 |         l_tilec->ownsData = OPJ_TRUE; | 
| 701 |     } else if (l_tilec->data_size_needed > l_tilec->data_size) { | 
| 702 |         /* We don't need to keep old data */ | 
| 703 |         opj_image_data_free(l_tilec->data); | 
| 704 |         l_tilec->data = (OPJ_INT32 *) opj_image_data_alloc(l_tilec->data_size_needed); | 
| 705 |         if (! l_tilec->data) { | 
| 706 |             l_tilec->data_size = 0; | 
| 707 |             l_tilec->data_size_needed = 0; | 
| 708 |             l_tilec->ownsData = OPJ_FALSE; | 
| 709 |             return OPJ_FALSE; | 
| 710 |         } | 
| 711 |         /*fprintf(stderr, "tReallocate data of tilec (int): from %d to %d x OPJ_UINT32n", l_tilec->data_size, l_data_size);*/ | 
| 712 |         l_tilec->data_size = l_tilec->data_size_needed; | 
| 713 |         l_tilec->ownsData = OPJ_TRUE; | 
| 714 |     } | 
| 715 |     return OPJ_TRUE; | 
| 716 | } | 
| 717 |  | 
| 718 | /* ----------------------------------------------------------------------- */ | 
| 719 |  | 
| 720 | static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, | 
| 721 |         OPJ_BOOL isEncoder, OPJ_FLOAT32 fraction, OPJ_SIZE_T sizeof_block, | 
| 722 |         opj_event_mgr_t* manager) | 
| 723 | { | 
| 724 |     OPJ_UINT32(*l_gain_ptr)(OPJ_UINT32) = 00; | 
| 725 |     OPJ_UINT32 compno, resno, bandno, precno, cblkno; | 
| 726 |     opj_tcp_t * l_tcp = 00; | 
| 727 |     opj_cp_t * l_cp = 00; | 
| 728 |     opj_tcd_tile_t * l_tile = 00; | 
| 729 |     opj_tccp_t *l_tccp = 00; | 
| 730 |     opj_tcd_tilecomp_t *l_tilec = 00; | 
| 731 |     opj_image_comp_t * l_image_comp = 00; | 
| 732 |     opj_tcd_resolution_t *l_res = 00; | 
| 733 |     opj_tcd_band_t *l_band = 00; | 
| 734 |     opj_stepsize_t * l_step_size = 00; | 
| 735 |     opj_tcd_precinct_t *l_current_precinct = 00; | 
| 736 |     opj_image_t *l_image = 00; | 
| 737 |     OPJ_UINT32 p, q; | 
| 738 |     OPJ_UINT32 l_level_no; | 
| 739 |     OPJ_UINT32 l_pdx, l_pdy; | 
| 740 |     OPJ_UINT32 l_gain; | 
| 741 |     OPJ_INT32 l_x0b, l_y0b; | 
| 742 |     OPJ_UINT32 l_tx0, l_ty0; | 
| 743 |     /* extent of precincts , top left, bottom right**/ | 
| 744 |     OPJ_INT32 l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end, l_br_prc_y_end; | 
| 745 |     /* number of precinct for a resolution */ | 
| 746 |     OPJ_UINT32 l_nb_precincts; | 
| 747 |     /* room needed to store l_nb_precinct precinct for a resolution */ | 
| 748 |     OPJ_UINT32 l_nb_precinct_size; | 
| 749 |     /* number of code blocks for a precinct*/ | 
| 750 |     OPJ_UINT32 l_nb_code_blocks; | 
| 751 |     /* room needed to store l_nb_code_blocks code blocks for a precinct*/ | 
| 752 |     OPJ_UINT32 l_nb_code_blocks_size; | 
| 753 |     /* size of data for a tile */ | 
| 754 |     OPJ_UINT32 l_data_size; | 
| 755 |  | 
| 756 |     l_cp = p_tcd->cp; | 
| 757 |     l_tcp = &(l_cp->tcps[p_tile_no]); | 
| 758 |     l_tile = p_tcd->tcd_image->tiles; | 
| 759 |     l_tccp = l_tcp->tccps; | 
| 760 |     l_tilec = l_tile->comps; | 
| 761 |     l_image = p_tcd->image; | 
| 762 |     l_image_comp = p_tcd->image->comps; | 
| 763 |  | 
| 764 |     p = p_tile_no % l_cp->tw;       /* tile coordinates */ | 
| 765 |     q = p_tile_no / l_cp->tw; | 
| 766 |     /*fprintf(stderr, "Tile coordinate = %d,%d\n", p, q);*/ | 
| 767 |  | 
| 768 |     /* 4 borders of the tile rescale on the image if necessary */ | 
| 769 |     l_tx0 = l_cp->tx0 + p * | 
| 770 |             l_cp->tdx; /* can't be greater than l_image->x1 so won't overflow */ | 
| 771 |     l_tile->x0 = (OPJ_INT32)opj_uint_max(l_tx0, l_image->x0); | 
| 772 |     l_tile->x1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, l_cp->tdx), | 
| 773 |                                          l_image->x1); | 
| 774 |     /* all those OPJ_UINT32 are casted to OPJ_INT32, let's do some sanity check */ | 
| 775 |     if ((l_tile->x0 < 0) || (l_tile->x1 <= l_tile->x0)) { | 
| 776 |         opj_event_msg(manager, EVT_ERROR, "Tile X coordinates are not supported\n" ); | 
| 777 |         return OPJ_FALSE; | 
| 778 |     } | 
| 779 |     l_ty0 = l_cp->ty0 + q * | 
| 780 |             l_cp->tdy; /* can't be greater than l_image->y1 so won't overflow */ | 
| 781 |     l_tile->y0 = (OPJ_INT32)opj_uint_max(l_ty0, l_image->y0); | 
| 782 |     l_tile->y1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, l_cp->tdy), | 
| 783 |                                          l_image->y1); | 
| 784 |     /* all those OPJ_UINT32 are casted to OPJ_INT32, let's do some sanity check */ | 
| 785 |     if ((l_tile->y0 < 0) || (l_tile->y1 <= l_tile->y0)) { | 
| 786 |         opj_event_msg(manager, EVT_ERROR, "Tile Y coordinates are not supported\n" ); | 
| 787 |         return OPJ_FALSE; | 
| 788 |     } | 
| 789 |  | 
| 790 |  | 
| 791 |     /* testcase 1888.pdf.asan.35.988 */ | 
| 792 |     if (l_tccp->numresolutions == 0) { | 
| 793 |         opj_event_msg(manager, EVT_ERROR, "tiles require at least one resolution\n" ); | 
| 794 |         return OPJ_FALSE; | 
| 795 |     } | 
| 796 |     /*fprintf(stderr, "Tile border = %d,%d,%d,%d\n", l_tile->x0, l_tile->y0,l_tile->x1,l_tile->y1);*/ | 
| 797 |  | 
| 798 |     /*tile->numcomps = image->numcomps; */ | 
| 799 |     for (compno = 0; compno < l_tile->numcomps; ++compno) { | 
| 800 |         /*fprintf(stderr, "compno = %d/%d\n", compno, l_tile->numcomps);*/ | 
| 801 |         l_image_comp->resno_decoded = 0; | 
| 802 |         /* border of each l_tile component (global) */ | 
| 803 |         l_tilec->x0 = opj_int_ceildiv(l_tile->x0, (OPJ_INT32)l_image_comp->dx); | 
| 804 |         l_tilec->y0 = opj_int_ceildiv(l_tile->y0, (OPJ_INT32)l_image_comp->dy); | 
| 805 |         l_tilec->x1 = opj_int_ceildiv(l_tile->x1, (OPJ_INT32)l_image_comp->dx); | 
| 806 |         l_tilec->y1 = opj_int_ceildiv(l_tile->y1, (OPJ_INT32)l_image_comp->dy); | 
| 807 |         l_tilec->compno = compno; | 
| 808 |         /*fprintf(stderr, "\tTile compo border = %d,%d,%d,%d\n", l_tilec->x0, l_tilec->y0,l_tilec->x1,l_tilec->y1);*/ | 
| 809 |  | 
| 810 |         l_tilec->numresolutions = l_tccp->numresolutions; | 
| 811 |         if (l_tccp->numresolutions < l_cp->m_specific_param.m_dec.m_reduce) { | 
| 812 |             l_tilec->minimum_num_resolutions = 1; | 
| 813 |         } else { | 
| 814 |             l_tilec->minimum_num_resolutions = l_tccp->numresolutions - | 
| 815 |                                                l_cp->m_specific_param.m_dec.m_reduce; | 
| 816 |         } | 
| 817 |  | 
| 818 |         if (isEncoder) { | 
| 819 |             OPJ_SIZE_T l_tile_data_size; | 
| 820 |  | 
| 821 |             /* compute l_data_size with overflow check */ | 
| 822 |             OPJ_SIZE_T w = (OPJ_SIZE_T)(l_tilec->x1 - l_tilec->x0); | 
| 823 |             OPJ_SIZE_T h = (OPJ_SIZE_T)(l_tilec->y1 - l_tilec->y0); | 
| 824 |  | 
| 825 |             /* issue 733, l_data_size == 0U, probably something wrong should be checked before getting here */ | 
| 826 |             if (h > 0 && w > SIZE_MAX / h) { | 
| 827 |                 opj_event_msg(manager, EVT_ERROR, "Size of tile data exceeds system limits\n" ); | 
| 828 |                 return OPJ_FALSE; | 
| 829 |             } | 
| 830 |             l_tile_data_size = w * h; | 
| 831 |  | 
| 832 |             if (SIZE_MAX / sizeof(OPJ_UINT32) < l_tile_data_size) { | 
| 833 |                 opj_event_msg(manager, EVT_ERROR, "Size of tile data exceeds system limits\n" ); | 
| 834 |                 return OPJ_FALSE; | 
| 835 |             } | 
| 836 |             l_tile_data_size = l_tile_data_size * sizeof(OPJ_UINT32); | 
| 837 |  | 
| 838 |             l_tilec->data_size_needed = l_tile_data_size; | 
| 839 |         } | 
| 840 |  | 
| 841 |         l_data_size = l_tilec->numresolutions * (OPJ_UINT32)sizeof( | 
| 842 |                           opj_tcd_resolution_t); | 
| 843 |  | 
| 844 |         opj_image_data_free(l_tilec->data_win); | 
| 845 |         l_tilec->data_win = NULL; | 
| 846 |         l_tilec->win_x0 = 0; | 
| 847 |         l_tilec->win_y0 = 0; | 
| 848 |         l_tilec->win_x1 = 0; | 
| 849 |         l_tilec->win_y1 = 0; | 
| 850 |  | 
| 851 |         if (l_tilec->resolutions == 00) { | 
| 852 |             l_tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(l_data_size); | 
| 853 |             if (! l_tilec->resolutions) { | 
| 854 |                 return OPJ_FALSE; | 
| 855 |             } | 
| 856 |             /*fprintf(stderr, "\tAllocate resolutions of tilec (opj_tcd_resolution_t): %d\n",l_data_size);*/ | 
| 857 |             l_tilec->resolutions_size = l_data_size; | 
| 858 |             memset(l_tilec->resolutions, 0, l_data_size); | 
| 859 |         } else if (l_data_size > l_tilec->resolutions_size) { | 
| 860 |             opj_tcd_resolution_t* new_resolutions = (opj_tcd_resolution_t *) opj_realloc( | 
| 861 |                     l_tilec->resolutions, l_data_size); | 
| 862 |             if (! new_resolutions) { | 
| 863 |                 opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile resolutions\n" ); | 
| 864 |                 opj_free(l_tilec->resolutions); | 
| 865 |                 l_tilec->resolutions = NULL; | 
| 866 |                 l_tilec->resolutions_size = 0; | 
| 867 |                 return OPJ_FALSE; | 
| 868 |             } | 
| 869 |             l_tilec->resolutions = new_resolutions; | 
| 870 |             /*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->resolutions_size, l_data_size);*/ | 
| 871 |             memset(((OPJ_BYTE*) l_tilec->resolutions) + l_tilec->resolutions_size, 0, | 
| 872 |                    l_data_size - l_tilec->resolutions_size); | 
| 873 |             l_tilec->resolutions_size = l_data_size; | 
| 874 |         } | 
| 875 |  | 
| 876 |         l_level_no = l_tilec->numresolutions; | 
| 877 |         l_res = l_tilec->resolutions; | 
| 878 |         l_step_size = l_tccp->stepsizes; | 
| 879 |         if (l_tccp->qmfbid == 0) { | 
| 880 |             l_gain_ptr = &opj_dwt_getgain_real; | 
| 881 |         } else { | 
| 882 |             l_gain_ptr  = &opj_dwt_getgain; | 
| 883 |         } | 
| 884 |         /*fprintf(stderr, "\tlevel_no=%d\n",l_level_no);*/ | 
| 885 |  | 
| 886 |         for (resno = 0; resno < l_tilec->numresolutions; ++resno) { | 
| 887 |             /*fprintf(stderr, "\t\tresno = %d/%d\n", resno, l_tilec->numresolutions);*/ | 
| 888 |             OPJ_INT32 tlcbgxstart, tlcbgystart /*, brcbgxend, brcbgyend*/; | 
| 889 |             OPJ_UINT32 cbgwidthexpn, cbgheightexpn; | 
| 890 |             OPJ_UINT32 cblkwidthexpn, cblkheightexpn; | 
| 891 |  | 
| 892 |             --l_level_no; | 
| 893 |  | 
| 894 |             /* border for each resolution level (global) */ | 
| 895 |             l_res->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no); | 
| 896 |             l_res->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no); | 
| 897 |             l_res->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no); | 
| 898 |             l_res->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no); | 
| 899 |  | 
| 900 |             /*fprintf(stderr, "\t\t\tres_x0= %d, res_y0 =%d, res_x1=%d, res_y1=%d\n", l_res->x0, l_res->y0, l_res->x1, l_res->y1);*/ | 
| 901 |             /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ | 
| 902 |             l_pdx = l_tccp->prcw[resno]; | 
| 903 |             l_pdy = l_tccp->prch[resno]; | 
| 904 |             /*fprintf(stderr, "\t\t\tpdx=%d, pdy=%d\n", l_pdx, l_pdy);*/ | 
| 905 |             /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */ | 
| 906 |             l_tl_prc_x_start = opj_int_floordivpow2(l_res->x0, (OPJ_INT32)l_pdx) << l_pdx; | 
| 907 |             l_tl_prc_y_start = opj_int_floordivpow2(l_res->y0, (OPJ_INT32)l_pdy) << l_pdy; | 
| 908 |             l_br_prc_x_end = opj_int_ceildivpow2(l_res->x1, (OPJ_INT32)l_pdx) << l_pdx; | 
| 909 |             l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy; | 
| 910 |             /*fprintf(stderr, "\t\t\tprc_x_start=%d, prc_y_start=%d, br_prc_x_end=%d, br_prc_y_end=%d \n", l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end ,l_br_prc_y_end );*/ | 
| 911 |  | 
| 912 |             l_res->pw = (l_res->x0 == l_res->x1) ? 0U : (OPJ_UINT32)(( | 
| 913 |                             l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx); | 
| 914 |             l_res->ph = (l_res->y0 == l_res->y1) ? 0U : (OPJ_UINT32)(( | 
| 915 |                             l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy); | 
| 916 |             /*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/ | 
| 917 |  | 
| 918 |             if ((l_res->pw != 0U) && ((((OPJ_UINT32) - 1) / l_res->pw) < l_res->ph)) { | 
| 919 |                 opj_event_msg(manager, EVT_ERROR, "Size of tile data exceeds system limits\n" ); | 
| 920 |                 return OPJ_FALSE; | 
| 921 |             } | 
| 922 |             l_nb_precincts = l_res->pw * l_res->ph; | 
| 923 |  | 
| 924 |             if ((((OPJ_UINT32) - 1) / (OPJ_UINT32)sizeof(opj_tcd_precinct_t)) < | 
| 925 |                     l_nb_precincts) { | 
| 926 |                 opj_event_msg(manager, EVT_ERROR, "Size of tile data exceeds system limits\n" ); | 
| 927 |                 return OPJ_FALSE; | 
| 928 |             } | 
| 929 |             l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t); | 
| 930 |  | 
| 931 |             if (resno == 0) { | 
| 932 |                 tlcbgxstart = l_tl_prc_x_start; | 
| 933 |                 tlcbgystart = l_tl_prc_y_start; | 
| 934 |                 /*brcbgxend = l_br_prc_x_end;*/ | 
| 935 |                 /* brcbgyend = l_br_prc_y_end;*/ | 
| 936 |                 cbgwidthexpn = l_pdx; | 
| 937 |                 cbgheightexpn = l_pdy; | 
| 938 |                 l_res->numbands = 1; | 
| 939 |             } else { | 
| 940 |                 tlcbgxstart = opj_int_ceildivpow2(l_tl_prc_x_start, 1); | 
| 941 |                 tlcbgystart = opj_int_ceildivpow2(l_tl_prc_y_start, 1); | 
| 942 |                 /*brcbgxend = opj_int_ceildivpow2(l_br_prc_x_end, 1);*/ | 
| 943 |                 /*brcbgyend = opj_int_ceildivpow2(l_br_prc_y_end, 1);*/ | 
| 944 |                 cbgwidthexpn = l_pdx - 1; | 
| 945 |                 cbgheightexpn = l_pdy - 1; | 
| 946 |                 l_res->numbands = 3; | 
| 947 |             } | 
| 948 |  | 
| 949 |             cblkwidthexpn = opj_uint_min(l_tccp->cblkw, cbgwidthexpn); | 
| 950 |             cblkheightexpn = opj_uint_min(l_tccp->cblkh, cbgheightexpn); | 
| 951 |             l_band = l_res->bands; | 
| 952 |  | 
| 953 |             for (bandno = 0; bandno < l_res->numbands; ++bandno, ++l_band, ++l_step_size) { | 
| 954 |                 OPJ_INT32 numbps; | 
| 955 |                 /*fprintf(stderr, "\t\t\tband_no=%d/%d\n", bandno, l_res->numbands );*/ | 
| 956 |  | 
| 957 |                 if (resno == 0) { | 
| 958 |                     l_band->bandno = 0 ; | 
| 959 |                     l_band->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no); | 
| 960 |                     l_band->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no); | 
| 961 |                     l_band->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no); | 
| 962 |                     l_band->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no); | 
| 963 |                 } else { | 
| 964 |                     l_band->bandno = bandno + 1; | 
| 965 |                     /* x0b = 1 if bandno = 1 or 3 */ | 
| 966 |                     l_x0b = l_band->bandno & 1; | 
| 967 |                     /* y0b = 1 if bandno = 2 or 3 */ | 
| 968 |                     l_y0b = (OPJ_INT32)((l_band->bandno) >> 1); | 
| 969 |                     /* l_band border (global) */ | 
| 970 |                     l_band->x0 = opj_int64_ceildivpow2(l_tilec->x0 - ((OPJ_INT64)l_x0b << | 
| 971 |                                                        l_level_no), (OPJ_INT32)(l_level_no + 1)); | 
| 972 |                     l_band->y0 = opj_int64_ceildivpow2(l_tilec->y0 - ((OPJ_INT64)l_y0b << | 
| 973 |                                                        l_level_no), (OPJ_INT32)(l_level_no + 1)); | 
| 974 |                     l_band->x1 = opj_int64_ceildivpow2(l_tilec->x1 - ((OPJ_INT64)l_x0b << | 
| 975 |                                                        l_level_no), (OPJ_INT32)(l_level_no + 1)); | 
| 976 |                     l_band->y1 = opj_int64_ceildivpow2(l_tilec->y1 - ((OPJ_INT64)l_y0b << | 
| 977 |                                                        l_level_no), (OPJ_INT32)(l_level_no + 1)); | 
| 978 |                 } | 
| 979 |  | 
| 980 |                 if (isEncoder) { | 
| 981 |                     /* Skip empty bands */ | 
| 982 |                     if (opj_tcd_is_band_empty(l_band)) { | 
| 983 |                         /* Do not zero l_band->precints to avoid leaks */ | 
| 984 |                         /* but make sure we don't use it later, since */ | 
| 985 |                         /* it will point to precincts of previous bands... */ | 
| 986 |                         continue; | 
| 987 |                     } | 
| 988 |                 } | 
| 989 |  | 
| 990 |                 /** avoid an if with storing function pointer */ | 
| 991 |                 l_gain = (*l_gain_ptr)(l_band->bandno); | 
| 992 |                 numbps = (OPJ_INT32)(l_image_comp->prec + l_gain); | 
| 993 |                 l_band->stepsize = (OPJ_FLOAT32)(((1.0 + l_step_size->mant / 2048.0) * pow(2.0, | 
| 994 |                                                   (OPJ_INT32)(numbps - l_step_size->expn)))) * fraction; | 
| 995 |                 /* Mb value of Equation E-2 in "E.1 Inverse quantization | 
| 996 |                  * procedure" of the standard */ | 
| 997 |                 l_band->numbps = l_step_size->expn + (OPJ_INT32)l_tccp->numgbits - | 
| 998 |                                  1; | 
| 999 |  | 
| 1000 |                 if (!l_band->precincts && (l_nb_precincts > 0U)) { | 
| 1001 |                     l_band->precincts = (opj_tcd_precinct_t *) opj_malloc(/*3 * */ | 
| 1002 |                                             l_nb_precinct_size); | 
| 1003 |                     if (! l_band->precincts) { | 
| 1004 |                         opj_event_msg(manager, EVT_ERROR, | 
| 1005 |                                       "Not enough memory to handle band precints\n" ); | 
| 1006 |                         return OPJ_FALSE; | 
| 1007 |                     } | 
| 1008 |                     /*fprintf(stderr, "\t\t\t\tAllocate precincts of a band (opj_tcd_precinct_t): %d\n",l_nb_precinct_size);     */ | 
| 1009 |                     memset(l_band->precincts, 0, l_nb_precinct_size); | 
| 1010 |                     l_band->precincts_data_size = l_nb_precinct_size; | 
| 1011 |                 } else if (l_band->precincts_data_size < l_nb_precinct_size) { | 
| 1012 |  | 
| 1013 |                     opj_tcd_precinct_t * new_precincts = (opj_tcd_precinct_t *) opj_realloc( | 
| 1014 |                             l_band->precincts,/*3 * */ l_nb_precinct_size); | 
| 1015 |                     if (! new_precincts) { | 
| 1016 |                         opj_event_msg(manager, EVT_ERROR, | 
| 1017 |                                       "Not enough memory to handle band precints\n" ); | 
| 1018 |                         opj_free(l_band->precincts); | 
| 1019 |                         l_band->precincts = NULL; | 
| 1020 |                         l_band->precincts_data_size = 0; | 
| 1021 |                         return OPJ_FALSE; | 
| 1022 |                     } | 
| 1023 |                     l_band->precincts = new_precincts; | 
| 1024 |                     /*fprintf(stderr, "\t\t\t\tReallocate precincts of a band (opj_tcd_precinct_t): from %d to %d\n",l_band->precincts_data_size, l_nb_precinct_size);*/ | 
| 1025 |                     memset(((OPJ_BYTE *) l_band->precincts) + l_band->precincts_data_size, 0, | 
| 1026 |                            l_nb_precinct_size - l_band->precincts_data_size); | 
| 1027 |                     l_band->precincts_data_size = l_nb_precinct_size; | 
| 1028 |                 } | 
| 1029 |  | 
| 1030 |                 l_current_precinct = l_band->precincts; | 
| 1031 |                 for (precno = 0; precno < l_nb_precincts; ++precno) { | 
| 1032 |                     OPJ_INT32 tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; | 
| 1033 |                     OPJ_INT32 cbgxstart = tlcbgxstart + (OPJ_INT32)(precno % l_res->pw) * | 
| 1034 |                                           (1 << cbgwidthexpn); | 
| 1035 |                     OPJ_INT32 cbgystart = tlcbgystart + (OPJ_INT32)(precno / l_res->pw) * | 
| 1036 |                                           (1 << cbgheightexpn); | 
| 1037 |                     OPJ_INT32 cbgxend = cbgxstart + (1 << cbgwidthexpn); | 
| 1038 |                     OPJ_INT32 cbgyend = cbgystart + (1 << cbgheightexpn); | 
| 1039 |                     /*fprintf(stderr, "\t precno=%d; bandno=%d, resno=%d; compno=%d\n", precno, bandno , resno, compno);*/ | 
| 1040 |                     /*fprintf(stderr, "\t tlcbgxstart(=%d) + (precno(=%d) percent res->pw(=%d)) * (1 << cbgwidthexpn(=%d)) \n",tlcbgxstart,precno,l_res->pw,cbgwidthexpn);*/ | 
| 1041 |  | 
| 1042 |                     /* precinct size (global) */ | 
| 1043 |                     /*fprintf(stderr, "\t cbgxstart=%d, l_band->x0 = %d \n",cbgxstart, l_band->x0);*/ | 
| 1044 |  | 
| 1045 |                     l_current_precinct->x0 = opj_int_max(cbgxstart, l_band->x0); | 
| 1046 |                     l_current_precinct->y0 = opj_int_max(cbgystart, l_band->y0); | 
| 1047 |                     l_current_precinct->x1 = opj_int_min(cbgxend, l_band->x1); | 
| 1048 |                     l_current_precinct->y1 = opj_int_min(cbgyend, l_band->y1); | 
| 1049 |                     /*fprintf(stderr, "\t prc_x0=%d; prc_y0=%d, prc_x1=%d; prc_y1=%d\n",l_current_precinct->x0, l_current_precinct->y0 ,l_current_precinct->x1, l_current_precinct->y1);*/ | 
| 1050 |  | 
| 1051 |                     tlcblkxstart = opj_int_floordivpow2(l_current_precinct->x0, | 
| 1052 |                                                         (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn; | 
| 1053 |                     /*fprintf(stderr, "\t tlcblkxstart =%d\n",tlcblkxstart );*/ | 
| 1054 |                     tlcblkystart = opj_int_floordivpow2(l_current_precinct->y0, | 
| 1055 |                                                         (OPJ_INT32)cblkheightexpn) << cblkheightexpn; | 
| 1056 |                     /*fprintf(stderr, "\t tlcblkystart =%d\n",tlcblkystart );*/ | 
| 1057 |                     brcblkxend = opj_int_ceildivpow2(l_current_precinct->x1, | 
| 1058 |                                                      (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn; | 
| 1059 |                     /*fprintf(stderr, "\t brcblkxend =%d\n",brcblkxend );*/ | 
| 1060 |                     brcblkyend = opj_int_ceildivpow2(l_current_precinct->y1, | 
| 1061 |                                                      (OPJ_INT32)cblkheightexpn) << cblkheightexpn; | 
| 1062 |                     /*fprintf(stderr, "\t brcblkyend =%d\n",brcblkyend );*/ | 
| 1063 |                     l_current_precinct->cw = (OPJ_UINT32)((brcblkxend - tlcblkxstart) >> | 
| 1064 |                                                           cblkwidthexpn); | 
| 1065 |                     l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >> | 
| 1066 |                                                           cblkheightexpn); | 
| 1067 |  | 
| 1068 |                     l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch; | 
| 1069 |                     /*fprintf(stderr, "\t\t\t\t precinct_cw = %d x recinct_ch = %d\n",l_current_precinct->cw, l_current_precinct->ch);      */ | 
| 1070 |                     l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof_block; | 
| 1071 |  | 
| 1072 |                     if (!l_current_precinct->cblks.blocks && (l_nb_code_blocks > 0U)) { | 
| 1073 |                         l_current_precinct->cblks.blocks = opj_malloc(l_nb_code_blocks_size); | 
| 1074 |                         if (! l_current_precinct->cblks.blocks) { | 
| 1075 |                             return OPJ_FALSE; | 
| 1076 |                         } | 
| 1077 |                         /*fprintf(stderr, "\t\t\t\tAllocate cblks of a precinct (opj_tcd_cblk_dec_t): %d\n",l_nb_code_blocks_size);*/ | 
| 1078 |  | 
| 1079 |                         memset(l_current_precinct->cblks.blocks, 0, l_nb_code_blocks_size); | 
| 1080 |  | 
| 1081 |                         l_current_precinct->block_size = l_nb_code_blocks_size; | 
| 1082 |                     } else if (l_nb_code_blocks_size > l_current_precinct->block_size) { | 
| 1083 |                         void *new_blocks = opj_realloc(l_current_precinct->cblks.blocks, | 
| 1084 |                                                        l_nb_code_blocks_size); | 
| 1085 |                         if (! new_blocks) { | 
| 1086 |                             opj_free(l_current_precinct->cblks.blocks); | 
| 1087 |                             l_current_precinct->cblks.blocks = NULL; | 
| 1088 |                             l_current_precinct->block_size = 0; | 
| 1089 |                             opj_event_msg(manager, EVT_ERROR, | 
| 1090 |                                           "Not enough memory for current precinct codeblock element\n" ); | 
| 1091 |                             return OPJ_FALSE; | 
| 1092 |                         } | 
| 1093 |                         l_current_precinct->cblks.blocks = new_blocks; | 
| 1094 |                         /*fprintf(stderr, "\t\t\t\tReallocate cblks of a precinct (opj_tcd_cblk_dec_t): from %d to %d\n",l_current_precinct->block_size, l_nb_code_blocks_size);     */ | 
| 1095 |  | 
| 1096 |                         memset(((OPJ_BYTE *) l_current_precinct->cblks.blocks) + | 
| 1097 |                                l_current_precinct->block_size | 
| 1098 |                                , 0 | 
| 1099 |                                , l_nb_code_blocks_size - l_current_precinct->block_size); | 
| 1100 |  | 
| 1101 |                         l_current_precinct->block_size = l_nb_code_blocks_size; | 
| 1102 |                     } | 
| 1103 |  | 
| 1104 |                     if (! l_current_precinct->incltree) { | 
| 1105 |                         l_current_precinct->incltree = opj_tgt_create(l_current_precinct->cw, | 
| 1106 |                                                        l_current_precinct->ch, manager); | 
| 1107 |                     } else { | 
| 1108 |                         l_current_precinct->incltree = opj_tgt_init(l_current_precinct->incltree, | 
| 1109 |                                                        l_current_precinct->cw, l_current_precinct->ch, manager); | 
| 1110 |                     } | 
| 1111 |  | 
| 1112 |                     if (! l_current_precinct->imsbtree) { | 
| 1113 |                         l_current_precinct->imsbtree = opj_tgt_create(l_current_precinct->cw, | 
| 1114 |                                                        l_current_precinct->ch, manager); | 
| 1115 |                     } else { | 
| 1116 |                         l_current_precinct->imsbtree = opj_tgt_init(l_current_precinct->imsbtree, | 
| 1117 |                                                        l_current_precinct->cw, l_current_precinct->ch, manager); | 
| 1118 |                     } | 
| 1119 |  | 
| 1120 |                     for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) { | 
| 1121 |                         OPJ_INT32 cblkxstart = tlcblkxstart + (OPJ_INT32)(cblkno % | 
| 1122 |                                                l_current_precinct->cw) * (1 << cblkwidthexpn); | 
| 1123 |                         OPJ_INT32 cblkystart = tlcblkystart + (OPJ_INT32)(cblkno / | 
| 1124 |                                                l_current_precinct->cw) * (1 << cblkheightexpn); | 
| 1125 |                         OPJ_INT32 cblkxend = cblkxstart + (1 << cblkwidthexpn); | 
| 1126 |                         OPJ_INT32 cblkyend = cblkystart + (1 << cblkheightexpn); | 
| 1127 |  | 
| 1128 |                         if (isEncoder) { | 
| 1129 |                             opj_tcd_cblk_enc_t* l_code_block = l_current_precinct->cblks.enc + cblkno; | 
| 1130 |  | 
| 1131 |                             if (! opj_tcd_code_block_enc_allocate(l_code_block)) { | 
| 1132 |                                 return OPJ_FALSE; | 
| 1133 |                             } | 
| 1134 |                             /* code-block size (global) */ | 
| 1135 |                             l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0); | 
| 1136 |                             l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0); | 
| 1137 |                             l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1); | 
| 1138 |                             l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1); | 
| 1139 |  | 
| 1140 |                             if (! opj_tcd_code_block_enc_allocate_data(l_code_block)) { | 
| 1141 |                                 return OPJ_FALSE; | 
| 1142 |                             } | 
| 1143 |                         } else { | 
| 1144 |                             opj_tcd_cblk_dec_t* l_code_block = l_current_precinct->cblks.dec + cblkno; | 
| 1145 |  | 
| 1146 |                             if (! opj_tcd_code_block_dec_allocate(l_code_block)) { | 
| 1147 |                                 return OPJ_FALSE; | 
| 1148 |                             } | 
| 1149 |                             /* code-block size (global) */ | 
| 1150 |                             l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0); | 
| 1151 |                             l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0); | 
| 1152 |                             l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1); | 
| 1153 |                             l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1); | 
| 1154 |                         } | 
| 1155 |                     } | 
| 1156 |                     ++l_current_precinct; | 
| 1157 |                 } /* precno */ | 
| 1158 |             } /* bandno */ | 
| 1159 |             ++l_res; | 
| 1160 |         } /* resno */ | 
| 1161 |         ++l_tccp; | 
| 1162 |         ++l_tilec; | 
| 1163 |         ++l_image_comp; | 
| 1164 |     } /* compno */ | 
| 1165 |     return OPJ_TRUE; | 
| 1166 | } | 
| 1167 |  | 
| 1168 | OPJ_BOOL opj_tcd_init_encode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, | 
| 1169 |                                   opj_event_mgr_t* p_manager) | 
| 1170 | { | 
| 1171 |     return opj_tcd_init_tile(p_tcd, p_tile_no, OPJ_TRUE, 1.0F, | 
| 1172 |                              sizeof(opj_tcd_cblk_enc_t), p_manager); | 
| 1173 | } | 
| 1174 |  | 
| 1175 | OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, | 
| 1176 |                                   opj_event_mgr_t* p_manager) | 
| 1177 | { | 
| 1178 |     return opj_tcd_init_tile(p_tcd, p_tile_no, OPJ_FALSE, 0.5F, | 
| 1179 |                              sizeof(opj_tcd_cblk_dec_t), p_manager); | 
| 1180 | } | 
| 1181 |  | 
| 1182 | /** | 
| 1183 |  * Allocates memory for an encoding code block (but not data memory). | 
| 1184 |  */ | 
| 1185 | static OPJ_BOOL opj_tcd_code_block_enc_allocate(opj_tcd_cblk_enc_t * | 
| 1186 |         p_code_block) | 
| 1187 | { | 
| 1188 |     if (! p_code_block->layers) { | 
| 1189 |         /* no memset since data */ | 
| 1190 |         p_code_block->layers = (opj_tcd_layer_t*) opj_calloc(100, | 
| 1191 |                                sizeof(opj_tcd_layer_t)); | 
| 1192 |         if (! p_code_block->layers) { | 
| 1193 |             return OPJ_FALSE; | 
| 1194 |         } | 
| 1195 |     } | 
| 1196 |     if (! p_code_block->passes) { | 
| 1197 |         p_code_block->passes = (opj_tcd_pass_t*) opj_calloc(100, | 
| 1198 |                                sizeof(opj_tcd_pass_t)); | 
| 1199 |         if (! p_code_block->passes) { | 
| 1200 |             return OPJ_FALSE; | 
| 1201 |         } | 
| 1202 |     } | 
| 1203 |     return OPJ_TRUE; | 
| 1204 | } | 
| 1205 |  | 
| 1206 | /** | 
| 1207 |  * Allocates data memory for an encoding code block. | 
| 1208 |  */ | 
| 1209 | static OPJ_BOOL opj_tcd_code_block_enc_allocate_data(opj_tcd_cblk_enc_t * | 
| 1210 |         p_code_block) | 
| 1211 | { | 
| 1212 |     OPJ_UINT32 l_data_size; | 
| 1213 |  | 
| 1214 |     /* +1 is needed for https://github.com/uclouvain/openjpeg/issues/835 */ | 
| 1215 |     /* and actually +2 required for https://github.com/uclouvain/openjpeg/issues/982 */ | 
| 1216 |     /* TODO: is there a theoretical upper-bound for the compressed code */ | 
| 1217 |     /* block size ? */ | 
| 1218 |     l_data_size = 2 + (OPJ_UINT32)((p_code_block->x1 - p_code_block->x0) * | 
| 1219 |                                    (p_code_block->y1 - p_code_block->y0) * (OPJ_INT32)sizeof(OPJ_UINT32)); | 
| 1220 |  | 
| 1221 |     if (l_data_size > p_code_block->data_size) { | 
| 1222 |         if (p_code_block->data) { | 
| 1223 |             /* We refer to data - 1 since below we incremented it */ | 
| 1224 |             opj_free(p_code_block->data - 1); | 
| 1225 |         } | 
| 1226 |         p_code_block->data = (OPJ_BYTE*) opj_malloc(l_data_size + 1); | 
| 1227 |         if (! p_code_block->data) { | 
| 1228 |             p_code_block->data_size = 0U; | 
| 1229 |             return OPJ_FALSE; | 
| 1230 |         } | 
| 1231 |         p_code_block->data_size = l_data_size; | 
| 1232 |  | 
| 1233 |         /* We reserve the initial byte as a fake byte to a non-FF value */ | 
| 1234 |         /* and increment the data pointer, so that opj_mqc_init_enc() */ | 
| 1235 |         /* can do bp = data - 1, and opj_mqc_byteout() can safely dereference */ | 
| 1236 |         /* it. */ | 
| 1237 |         p_code_block->data[0] = 0; | 
| 1238 |         p_code_block->data += 1; /*why +1 ?*/ | 
| 1239 |     } | 
| 1240 |     return OPJ_TRUE; | 
| 1241 | } | 
| 1242 |  | 
| 1243 |  | 
| 1244 | void opj_tcd_reinit_segment(opj_tcd_seg_t* seg) | 
| 1245 | { | 
| 1246 |     memset(seg, 0, sizeof(opj_tcd_seg_t)); | 
| 1247 | } | 
| 1248 |  | 
| 1249 | /** | 
| 1250 |  * Allocates memory for a decoding code block. | 
| 1251 |  */ | 
| 1252 | static OPJ_BOOL opj_tcd_code_block_dec_allocate(opj_tcd_cblk_dec_t * | 
| 1253 |         p_code_block) | 
| 1254 | { | 
| 1255 |     if (! p_code_block->segs) { | 
| 1256 |  | 
| 1257 |         p_code_block->segs = (opj_tcd_seg_t *) opj_calloc(OPJ_J2K_DEFAULT_NB_SEGS, | 
| 1258 |                              sizeof(opj_tcd_seg_t)); | 
| 1259 |         if (! p_code_block->segs) { | 
| 1260 |             return OPJ_FALSE; | 
| 1261 |         } | 
| 1262 |         /*fprintf(stderr, "Allocate %d elements of code_block->data\n", OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));*/ | 
| 1263 |  | 
| 1264 |         p_code_block->m_current_max_segs = OPJ_J2K_DEFAULT_NB_SEGS; | 
| 1265 |         /*fprintf(stderr, "m_current_max_segs of code_block->data = %d\n", p_code_block->m_current_max_segs);*/ | 
| 1266 |     } else { | 
| 1267 |         /* sanitize */ | 
| 1268 |         opj_tcd_seg_t * l_segs = p_code_block->segs; | 
| 1269 |         OPJ_UINT32 l_current_max_segs = p_code_block->m_current_max_segs; | 
| 1270 |         opj_tcd_seg_data_chunk_t* l_chunks = p_code_block->chunks; | 
| 1271 |         OPJ_UINT32 l_numchunksalloc = p_code_block->numchunksalloc; | 
| 1272 |         OPJ_UINT32 i; | 
| 1273 |  | 
| 1274 |         opj_aligned_free(p_code_block->decoded_data); | 
| 1275 |         p_code_block->decoded_data = 00; | 
| 1276 |  | 
| 1277 |         memset(p_code_block, 0, sizeof(opj_tcd_cblk_dec_t)); | 
| 1278 |         p_code_block->segs = l_segs; | 
| 1279 |         p_code_block->m_current_max_segs = l_current_max_segs; | 
| 1280 |         for (i = 0; i < l_current_max_segs; ++i) { | 
| 1281 |             opj_tcd_reinit_segment(&l_segs[i]); | 
| 1282 |         } | 
| 1283 |         p_code_block->chunks = l_chunks; | 
| 1284 |         p_code_block->numchunksalloc = l_numchunksalloc; | 
| 1285 |     } | 
| 1286 |  | 
| 1287 |     return OPJ_TRUE; | 
| 1288 | } | 
| 1289 |  | 
| 1290 | OPJ_UINT32 opj_tcd_get_decoded_tile_size(opj_tcd_t *p_tcd, | 
| 1291 |         OPJ_BOOL take_into_account_partial_decoding) | 
| 1292 | { | 
| 1293 |     OPJ_UINT32 i; | 
| 1294 |     OPJ_UINT32 l_data_size = 0; | 
| 1295 |     opj_image_comp_t * l_img_comp = 00; | 
| 1296 |     opj_tcd_tilecomp_t * l_tile_comp = 00; | 
| 1297 |     opj_tcd_resolution_t * l_res = 00; | 
| 1298 |     OPJ_UINT32 l_size_comp, l_remaining; | 
| 1299 |     OPJ_UINT32 l_temp; | 
| 1300 |  | 
| 1301 |     l_tile_comp = p_tcd->tcd_image->tiles->comps; | 
| 1302 |     l_img_comp = p_tcd->image->comps; | 
| 1303 |  | 
| 1304 |     for (i = 0; i < p_tcd->image->numcomps; ++i) { | 
| 1305 |         OPJ_UINT32 w, h; | 
| 1306 |         l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/ | 
| 1307 |         l_remaining = l_img_comp->prec & 7;  /* (%8) */ | 
| 1308 |  | 
| 1309 |         if (l_remaining) { | 
| 1310 |             ++l_size_comp; | 
| 1311 |         } | 
| 1312 |  | 
| 1313 |         if (l_size_comp == 3) { | 
| 1314 |             l_size_comp = 4; | 
| 1315 |         } | 
| 1316 |  | 
| 1317 |         l_res = l_tile_comp->resolutions + l_tile_comp->minimum_num_resolutions - 1; | 
| 1318 |         if (take_into_account_partial_decoding && !p_tcd->whole_tile_decoding) { | 
| 1319 |             w = l_res->win_x1 - l_res->win_x0; | 
| 1320 |             h = l_res->win_y1 - l_res->win_y0; | 
| 1321 |         } else { | 
| 1322 |             w = (OPJ_UINT32)(l_res->x1 - l_res->x0); | 
| 1323 |             h = (OPJ_UINT32)(l_res->y1 - l_res->y0); | 
| 1324 |         } | 
| 1325 |         if (h > 0 && UINT_MAX / w < h) { | 
| 1326 |             return UINT_MAX; | 
| 1327 |         } | 
| 1328 |         l_temp = w * h; | 
| 1329 |         if (l_size_comp && UINT_MAX / l_size_comp < l_temp) { | 
| 1330 |             return UINT_MAX; | 
| 1331 |         } | 
| 1332 |         l_temp *= l_size_comp; | 
| 1333 |  | 
| 1334 |         if (l_temp > UINT_MAX - l_data_size) { | 
| 1335 |             return UINT_MAX; | 
| 1336 |         } | 
| 1337 |         l_data_size += l_temp; | 
| 1338 |         ++l_img_comp; | 
| 1339 |         ++l_tile_comp; | 
| 1340 |     } | 
| 1341 |  | 
| 1342 |     return l_data_size; | 
| 1343 | } | 
| 1344 |  | 
| 1345 | OPJ_BOOL opj_tcd_encode_tile(opj_tcd_t *p_tcd, | 
| 1346 |                              OPJ_UINT32 p_tile_no, | 
| 1347 |                              OPJ_BYTE *p_dest, | 
| 1348 |                              OPJ_UINT32 * p_data_written, | 
| 1349 |                              OPJ_UINT32 p_max_length, | 
| 1350 |                              opj_codestream_info_t *p_cstr_info, | 
| 1351 |                              opj_event_mgr_t *p_manager) | 
| 1352 | { | 
| 1353 |  | 
| 1354 |     if (p_tcd->cur_tp_num == 0) { | 
| 1355 |  | 
| 1356 |         p_tcd->tcd_tileno = p_tile_no; | 
| 1357 |         p_tcd->tcp = &p_tcd->cp->tcps[p_tile_no]; | 
| 1358 |  | 
| 1359 |         /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ | 
| 1360 |         if (p_cstr_info)  { | 
| 1361 |             OPJ_UINT32 l_num_packs = 0; | 
| 1362 |             OPJ_UINT32 i; | 
| 1363 |             opj_tcd_tilecomp_t *l_tilec_idx = | 
| 1364 |                 &p_tcd->tcd_image->tiles->comps[0];        /* based on component 0 */ | 
| 1365 |             opj_tccp_t *l_tccp = p_tcd->tcp->tccps; /* based on component 0 */ | 
| 1366 |  | 
| 1367 |             for (i = 0; i < l_tilec_idx->numresolutions; i++) { | 
| 1368 |                 opj_tcd_resolution_t *l_res_idx = &l_tilec_idx->resolutions[i]; | 
| 1369 |  | 
| 1370 |                 p_cstr_info->tile[p_tile_no].pw[i] = (int)l_res_idx->pw; | 
| 1371 |                 p_cstr_info->tile[p_tile_no].ph[i] = (int)l_res_idx->ph; | 
| 1372 |  | 
| 1373 |                 l_num_packs += l_res_idx->pw * l_res_idx->ph; | 
| 1374 |                 p_cstr_info->tile[p_tile_no].pdx[i] = (int)l_tccp->prcw[i]; | 
| 1375 |                 p_cstr_info->tile[p_tile_no].pdy[i] = (int)l_tccp->prch[i]; | 
| 1376 |             } | 
| 1377 |             p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t*) opj_calloc(( | 
| 1378 |                     OPJ_SIZE_T)p_cstr_info->numcomps * (OPJ_SIZE_T)p_cstr_info->numlayers * | 
| 1379 |                                                   l_num_packs, | 
| 1380 |                                                   sizeof(opj_packet_info_t)); | 
| 1381 |             if (!p_cstr_info->tile[p_tile_no].packet) { | 
| 1382 |                 /* FIXME event manager error callback */ | 
| 1383 |                 return OPJ_FALSE; | 
| 1384 |             } | 
| 1385 |         } | 
| 1386 |         /* << INDEX */ | 
| 1387 |  | 
| 1388 |         /* FIXME _ProfStart(PGROUP_DC_SHIFT); */ | 
| 1389 |         /*---------------TILE-------------------*/ | 
| 1390 |         if (! opj_tcd_dc_level_shift_encode(p_tcd)) { | 
| 1391 |             return OPJ_FALSE; | 
| 1392 |         } | 
| 1393 |         /* FIXME _ProfStop(PGROUP_DC_SHIFT); */ | 
| 1394 |  | 
| 1395 |         /* FIXME _ProfStart(PGROUP_MCT); */ | 
| 1396 |         if (! opj_tcd_mct_encode(p_tcd)) { | 
| 1397 |             return OPJ_FALSE; | 
| 1398 |         } | 
| 1399 |         /* FIXME _ProfStop(PGROUP_MCT); */ | 
| 1400 |  | 
| 1401 |         /* FIXME _ProfStart(PGROUP_DWT); */ | 
| 1402 |         if (! opj_tcd_dwt_encode(p_tcd)) { | 
| 1403 |             return OPJ_FALSE; | 
| 1404 |         } | 
| 1405 |         /* FIXME  _ProfStop(PGROUP_DWT); */ | 
| 1406 |  | 
| 1407 |         /* FIXME  _ProfStart(PGROUP_T1); */ | 
| 1408 |         if (! opj_tcd_t1_encode(p_tcd)) { | 
| 1409 |             return OPJ_FALSE; | 
| 1410 |         } | 
| 1411 |         /* FIXME _ProfStop(PGROUP_T1); */ | 
| 1412 |  | 
| 1413 |         /* FIXME _ProfStart(PGROUP_RATE); */ | 
| 1414 |         if (! opj_tcd_rate_allocate_encode(p_tcd, p_dest, p_max_length, | 
| 1415 |                                            p_cstr_info, p_manager)) { | 
| 1416 |             return OPJ_FALSE; | 
| 1417 |         } | 
| 1418 |         /* FIXME _ProfStop(PGROUP_RATE); */ | 
| 1419 |  | 
| 1420 |     } | 
| 1421 |     /*--------------TIER2------------------*/ | 
| 1422 |  | 
| 1423 |     /* INDEX */ | 
| 1424 |     if (p_cstr_info) { | 
| 1425 |         p_cstr_info->index_write = 1; | 
| 1426 |     } | 
| 1427 |     /* FIXME _ProfStart(PGROUP_T2); */ | 
| 1428 |  | 
| 1429 |     if (! opj_tcd_t2_encode(p_tcd, p_dest, p_data_written, p_max_length, | 
| 1430 |                             p_cstr_info, p_manager)) { | 
| 1431 |         return OPJ_FALSE; | 
| 1432 |     } | 
| 1433 |     /* FIXME _ProfStop(PGROUP_T2); */ | 
| 1434 |  | 
| 1435 |     /*---------------CLEAN-------------------*/ | 
| 1436 |  | 
| 1437 |     return OPJ_TRUE; | 
| 1438 | } | 
| 1439 |  | 
| 1440 | OPJ_BOOL opj_tcd_decode_tile(opj_tcd_t *p_tcd, | 
| 1441 |                              OPJ_UINT32 win_x0, | 
| 1442 |                              OPJ_UINT32 win_y0, | 
| 1443 |                              OPJ_UINT32 win_x1, | 
| 1444 |                              OPJ_UINT32 win_y1, | 
| 1445 |                              OPJ_UINT32 numcomps_to_decode, | 
| 1446 |                              const OPJ_UINT32 *comps_indices, | 
| 1447 |                              OPJ_BYTE *p_src, | 
| 1448 |                              OPJ_UINT32 p_max_length, | 
| 1449 |                              OPJ_UINT32 p_tile_no, | 
| 1450 |                              opj_codestream_index_t *p_cstr_index, | 
| 1451 |                              opj_event_mgr_t *p_manager | 
| 1452 |                             ) | 
| 1453 | { | 
| 1454 |     OPJ_UINT32 l_data_read; | 
| 1455 |     OPJ_UINT32 compno; | 
| 1456 |  | 
| 1457 |     p_tcd->tcd_tileno = p_tile_no; | 
| 1458 |     p_tcd->tcp = &(p_tcd->cp->tcps[p_tile_no]); | 
| 1459 |     p_tcd->win_x0 = win_x0; | 
| 1460 |     p_tcd->win_y0 = win_y0; | 
| 1461 |     p_tcd->win_x1 = win_x1; | 
| 1462 |     p_tcd->win_y1 = win_y1; | 
| 1463 |     p_tcd->whole_tile_decoding = OPJ_TRUE; | 
| 1464 |  | 
| 1465 |     opj_free(p_tcd->used_component); | 
| 1466 |     p_tcd->used_component = NULL; | 
| 1467 |  | 
| 1468 |     if (numcomps_to_decode) { | 
| 1469 |         OPJ_BOOL* used_component = (OPJ_BOOL*) opj_calloc(sizeof(OPJ_BOOL), | 
| 1470 |                                    p_tcd->image->numcomps); | 
| 1471 |         if (used_component == NULL) { | 
| 1472 |             return OPJ_FALSE; | 
| 1473 |         } | 
| 1474 |         for (compno = 0; compno < numcomps_to_decode; compno++) { | 
| 1475 |             used_component[ comps_indices[compno] ] = OPJ_TRUE; | 
| 1476 |         } | 
| 1477 |  | 
| 1478 |         p_tcd->used_component = used_component; | 
| 1479 |     } | 
| 1480 |  | 
| 1481 |     for (compno = 0; compno < p_tcd->image->numcomps; compno++) { | 
| 1482 |         if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) { | 
| 1483 |             continue; | 
| 1484 |         } | 
| 1485 |  | 
| 1486 |         if (!opj_tcd_is_whole_tilecomp_decoding(p_tcd, compno)) { | 
| 1487 |             p_tcd->whole_tile_decoding = OPJ_FALSE; | 
| 1488 |             break; | 
| 1489 |         } | 
| 1490 |     } | 
| 1491 |  | 
| 1492 |     if (p_tcd->whole_tile_decoding) { | 
| 1493 |         for (compno = 0; compno < p_tcd->image->numcomps; compno++) { | 
| 1494 |             opj_tcd_tilecomp_t* tilec = &(p_tcd->tcd_image->tiles->comps[compno]); | 
| 1495 |             opj_tcd_resolution_t *l_res = & | 
| 1496 |                                           (tilec->resolutions[tilec->minimum_num_resolutions - 1]); | 
| 1497 |             OPJ_SIZE_T l_data_size; | 
| 1498 |  | 
| 1499 |             /* compute l_data_size with overflow check */ | 
| 1500 |             OPJ_SIZE_T res_w = (OPJ_SIZE_T)(l_res->x1 - l_res->x0); | 
| 1501 |             OPJ_SIZE_T res_h = (OPJ_SIZE_T)(l_res->y1 - l_res->y0); | 
| 1502 |  | 
| 1503 |             if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) { | 
| 1504 |                 continue; | 
| 1505 |             } | 
| 1506 |  | 
| 1507 |             /* issue 733, l_data_size == 0U, probably something wrong should be checked before getting here */ | 
| 1508 |             if (res_h > 0 && res_w > SIZE_MAX / res_h) { | 
| 1509 |                 opj_event_msg(p_manager, EVT_ERROR, | 
| 1510 |                               "Size of tile data exceeds system limits\n" ); | 
| 1511 |                 return OPJ_FALSE; | 
| 1512 |             } | 
| 1513 |             l_data_size = res_w * res_h; | 
| 1514 |  | 
| 1515 |             if (SIZE_MAX / sizeof(OPJ_UINT32) < l_data_size) { | 
| 1516 |                 opj_event_msg(p_manager, EVT_ERROR, | 
| 1517 |                               "Size of tile data exceeds system limits\n" ); | 
| 1518 |                 return OPJ_FALSE; | 
| 1519 |             } | 
| 1520 |             l_data_size *= sizeof(OPJ_UINT32); | 
| 1521 |  | 
| 1522 |             tilec->data_size_needed = l_data_size; | 
| 1523 |  | 
| 1524 |             if (!opj_alloc_tile_component_data(tilec)) { | 
| 1525 |                 opj_event_msg(p_manager, EVT_ERROR, | 
| 1526 |                               "Size of tile data exceeds system limits\n" ); | 
| 1527 |                 return OPJ_FALSE; | 
| 1528 |             } | 
| 1529 |         } | 
| 1530 |     } else { | 
| 1531 |         /* Compute restricted tile-component and tile-resolution coordinates */ | 
| 1532 |         /* of the window of interest, but defer the memory allocation until */ | 
| 1533 |         /* we know the resno_decoded */ | 
| 1534 |         for (compno = 0; compno < p_tcd->image->numcomps; compno++) { | 
| 1535 |             OPJ_UINT32 resno; | 
| 1536 |             opj_tcd_tilecomp_t* tilec = &(p_tcd->tcd_image->tiles->comps[compno]); | 
| 1537 |             opj_image_comp_t* image_comp = &(p_tcd->image->comps[compno]); | 
| 1538 |  | 
| 1539 |             if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) { | 
| 1540 |                 continue; | 
| 1541 |             } | 
| 1542 |  | 
| 1543 |             /* Compute the intersection of the area of interest, expressed in tile coordinates */ | 
| 1544 |             /* with the tile coordinates */ | 
| 1545 |             tilec->win_x0 = opj_uint_max( | 
| 1546 |                                 (OPJ_UINT32)tilec->x0, | 
| 1547 |                                 opj_uint_ceildiv(p_tcd->win_x0, image_comp->dx)); | 
| 1548 |             tilec->win_y0 = opj_uint_max( | 
| 1549 |                                 (OPJ_UINT32)tilec->y0, | 
| 1550 |                                 opj_uint_ceildiv(p_tcd->win_y0, image_comp->dy)); | 
| 1551 |             tilec->win_x1 = opj_uint_min( | 
| 1552 |                                 (OPJ_UINT32)tilec->x1, | 
| 1553 |                                 opj_uint_ceildiv(p_tcd->win_x1, image_comp->dx)); | 
| 1554 |             tilec->win_y1 = opj_uint_min( | 
| 1555 |                                 (OPJ_UINT32)tilec->y1, | 
| 1556 |                                 opj_uint_ceildiv(p_tcd->win_y1, image_comp->dy)); | 
| 1557 |             if (tilec->win_x1 < tilec->win_x0 || | 
| 1558 |                     tilec->win_y1 < tilec->win_y0) { | 
| 1559 |                 /* We should not normally go there. The circumstance is when */ | 
| 1560 |                 /* the tile coordinates do not intersect the area of interest */ | 
| 1561 |                 /* Upper level logic should not even try to decode that tile */ | 
| 1562 |                 opj_event_msg(p_manager, EVT_ERROR, | 
| 1563 |                               "Invalid tilec->win_xxx values\n" ); | 
| 1564 |                 return OPJ_FALSE; | 
| 1565 |             } | 
| 1566 |  | 
| 1567 |             for (resno = 0; resno < tilec->numresolutions; ++resno) { | 
| 1568 |                 opj_tcd_resolution_t *res = tilec->resolutions + resno; | 
| 1569 |                 res->win_x0 = opj_uint_ceildivpow2(tilec->win_x0, | 
| 1570 |                                                    tilec->numresolutions - 1 - resno); | 
| 1571 |                 res->win_y0 = opj_uint_ceildivpow2(tilec->win_y0, | 
| 1572 |                                                    tilec->numresolutions - 1 - resno); | 
| 1573 |                 res->win_x1 = opj_uint_ceildivpow2(tilec->win_x1, | 
| 1574 |                                                    tilec->numresolutions - 1 - resno); | 
| 1575 |                 res->win_y1 = opj_uint_ceildivpow2(tilec->win_y1, | 
| 1576 |                                                    tilec->numresolutions - 1 - resno); | 
| 1577 |             } | 
| 1578 |         } | 
| 1579 |     } | 
| 1580 |  | 
| 1581 | #ifdef TODO_MSD /* FIXME */ | 
| 1582 |     /* INDEX >>  */ | 
| 1583 |     if (p_cstr_info) { | 
| 1584 |         OPJ_UINT32 resno, compno, numprec = 0; | 
| 1585 |         for (compno = 0; compno < (OPJ_UINT32) p_cstr_info->numcomps; compno++) { | 
| 1586 |             opj_tcp_t *tcp = &p_tcd->cp->tcps[0]; | 
| 1587 |             opj_tccp_t *tccp = &tcp->tccps[compno]; | 
| 1588 |             opj_tcd_tilecomp_t *tilec_idx = &p_tcd->tcd_image->tiles->comps[compno]; | 
| 1589 |             for (resno = 0; resno < tilec_idx->numresolutions; resno++) { | 
| 1590 |                 opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno]; | 
| 1591 |                 p_cstr_info->tile[p_tile_no].pw[resno] = res_idx->pw; | 
| 1592 |                 p_cstr_info->tile[p_tile_no].ph[resno] = res_idx->ph; | 
| 1593 |                 numprec += res_idx->pw * res_idx->ph; | 
| 1594 |                 p_cstr_info->tile[p_tile_no].pdx[resno] = tccp->prcw[resno]; | 
| 1595 |                 p_cstr_info->tile[p_tile_no].pdy[resno] = tccp->prch[resno]; | 
| 1596 |             } | 
| 1597 |         } | 
| 1598 |         p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t *) opj_malloc( | 
| 1599 |                 p_cstr_info->numlayers * numprec * sizeof(opj_packet_info_t)); | 
| 1600 |         p_cstr_info->packno = 0; | 
| 1601 |     } | 
| 1602 |     /* << INDEX */ | 
| 1603 | #endif | 
| 1604 |  | 
| 1605 |     /*--------------TIER2------------------*/ | 
| 1606 |     /* FIXME _ProfStart(PGROUP_T2); */ | 
| 1607 |     l_data_read = 0; | 
| 1608 |     if (! opj_tcd_t2_decode(p_tcd, p_src, &l_data_read, p_max_length, p_cstr_index, | 
| 1609 |                             p_manager)) { | 
| 1610 |         return OPJ_FALSE; | 
| 1611 |     } | 
| 1612 |     /* FIXME _ProfStop(PGROUP_T2); */ | 
| 1613 |  | 
| 1614 |     /*------------------TIER1-----------------*/ | 
| 1615 |  | 
| 1616 |     /* FIXME _ProfStart(PGROUP_T1); */ | 
| 1617 |     if (! opj_tcd_t1_decode(p_tcd, p_manager)) { | 
| 1618 |         return OPJ_FALSE; | 
| 1619 |     } | 
| 1620 |     /* FIXME _ProfStop(PGROUP_T1); */ | 
| 1621 |  | 
| 1622 |  | 
| 1623 |     /* For subtile decoding, now we know the resno_decoded, we can allocate */ | 
| 1624 |     /* the tile data buffer */ | 
| 1625 |     if (!p_tcd->whole_tile_decoding) { | 
| 1626 |         for (compno = 0; compno < p_tcd->image->numcomps; compno++) { | 
| 1627 |             opj_tcd_tilecomp_t* tilec = &(p_tcd->tcd_image->tiles->comps[compno]); | 
| 1628 |             opj_image_comp_t* image_comp = &(p_tcd->image->comps[compno]); | 
| 1629 |             opj_tcd_resolution_t *res = tilec->resolutions + image_comp->resno_decoded; | 
| 1630 |             OPJ_SIZE_T w = res->win_x1 - res->win_x0; | 
| 1631 |             OPJ_SIZE_T h = res->win_y1 - res->win_y0; | 
| 1632 |             OPJ_SIZE_T l_data_size; | 
| 1633 |  | 
| 1634 |             opj_image_data_free(tilec->data_win); | 
| 1635 |             tilec->data_win = NULL; | 
| 1636 |  | 
| 1637 |             if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) { | 
| 1638 |                 continue; | 
| 1639 |             } | 
| 1640 |  | 
| 1641 |             if (w > 0 && h > 0) { | 
| 1642 |                 if (w > SIZE_MAX / h) { | 
| 1643 |                     opj_event_msg(p_manager, EVT_ERROR, | 
| 1644 |                                   "Size of tile data exceeds system limits\n" ); | 
| 1645 |                     return OPJ_FALSE; | 
| 1646 |                 } | 
| 1647 |                 l_data_size = w * h; | 
| 1648 |                 if (l_data_size > SIZE_MAX / sizeof(OPJ_INT32)) { | 
| 1649 |                     opj_event_msg(p_manager, EVT_ERROR, | 
| 1650 |                                   "Size of tile data exceeds system limits\n" ); | 
| 1651 |                     return OPJ_FALSE; | 
| 1652 |                 } | 
| 1653 |                 l_data_size *= sizeof(OPJ_INT32); | 
| 1654 |  | 
| 1655 |                 tilec->data_win = (OPJ_INT32*) opj_image_data_alloc(l_data_size); | 
| 1656 |                 if (tilec->data_win == NULL) { | 
| 1657 |                     opj_event_msg(p_manager, EVT_ERROR, | 
| 1658 |                                   "Size of tile data exceeds system limits\n" ); | 
| 1659 |                     return OPJ_FALSE; | 
| 1660 |                 } | 
| 1661 |             } | 
| 1662 |         } | 
| 1663 |     } | 
| 1664 |  | 
| 1665 |     /*----------------DWT---------------------*/ | 
| 1666 |  | 
| 1667 |     /* FIXME _ProfStart(PGROUP_DWT); */ | 
| 1668 |     if | 
| 1669 |     (! opj_tcd_dwt_decode(p_tcd)) { | 
| 1670 |         return OPJ_FALSE; | 
| 1671 |     } | 
| 1672 |     /* FIXME _ProfStop(PGROUP_DWT); */ | 
| 1673 |  | 
| 1674 |     /*----------------MCT-------------------*/ | 
| 1675 |     /* FIXME _ProfStart(PGROUP_MCT); */ | 
| 1676 |     if | 
| 1677 |     (! opj_tcd_mct_decode(p_tcd, p_manager)) { | 
| 1678 |         return OPJ_FALSE; | 
| 1679 |     } | 
| 1680 |     /* FIXME _ProfStop(PGROUP_MCT); */ | 
| 1681 |  | 
| 1682 |     /* FIXME _ProfStart(PGROUP_DC_SHIFT); */ | 
| 1683 |     if | 
| 1684 |     (! opj_tcd_dc_level_shift_decode(p_tcd)) { | 
| 1685 |         return OPJ_FALSE; | 
| 1686 |     } | 
| 1687 |     /* FIXME _ProfStop(PGROUP_DC_SHIFT); */ | 
| 1688 |  | 
| 1689 |  | 
| 1690 |     /*---------------TILE-------------------*/ | 
| 1691 |     return OPJ_TRUE; | 
| 1692 | } | 
| 1693 |  | 
| 1694 | OPJ_BOOL opj_tcd_update_tile_data(opj_tcd_t *p_tcd, | 
| 1695 |                                   OPJ_BYTE * p_dest, | 
| 1696 |                                   OPJ_UINT32 p_dest_length | 
| 1697 |                                  ) | 
| 1698 | { | 
| 1699 |     OPJ_UINT32 i, j, k, l_data_size = 0; | 
| 1700 |     opj_image_comp_t * l_img_comp = 00; | 
| 1701 |     opj_tcd_tilecomp_t * l_tilec = 00; | 
| 1702 |     opj_tcd_resolution_t * l_res; | 
| 1703 |     OPJ_UINT32 l_size_comp, l_remaining; | 
| 1704 |     OPJ_UINT32 l_stride, l_width, l_height; | 
| 1705 |  | 
| 1706 |     l_data_size = opj_tcd_get_decoded_tile_size(p_tcd, OPJ_TRUE); | 
| 1707 |     if (l_data_size == UINT_MAX || l_data_size > p_dest_length) { | 
| 1708 |         return OPJ_FALSE; | 
| 1709 |     } | 
| 1710 |  | 
| 1711 |     l_tilec = p_tcd->tcd_image->tiles->comps; | 
| 1712 |     l_img_comp = p_tcd->image->comps; | 
| 1713 |  | 
| 1714 |     for (i = 0; i < p_tcd->image->numcomps; ++i) { | 
| 1715 |         const OPJ_INT32* l_src_data; | 
| 1716 |         l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/ | 
| 1717 |         l_remaining = l_img_comp->prec & 7;  /* (%8) */ | 
| 1718 |         l_res = l_tilec->resolutions + l_img_comp->resno_decoded; | 
| 1719 |         if (p_tcd->whole_tile_decoding) { | 
| 1720 |             l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0); | 
| 1721 |             l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0); | 
| 1722 |             l_stride = (OPJ_UINT32)(l_tilec->resolutions[l_tilec->minimum_num_resolutions - | 
| 1723 |                                                                      1].x1 - | 
| 1724 |                                     l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x0) - l_width; | 
| 1725 |             l_src_data = l_tilec->data; | 
| 1726 |         } else { | 
| 1727 |             l_width = l_res->win_x1 - l_res->win_x0; | 
| 1728 |             l_height = l_res->win_y1 - l_res->win_y0; | 
| 1729 |             l_stride = 0; | 
| 1730 |             l_src_data = l_tilec->data_win; | 
| 1731 |         } | 
| 1732 |  | 
| 1733 |         if (l_remaining) { | 
| 1734 |             ++l_size_comp; | 
| 1735 |         } | 
| 1736 |  | 
| 1737 |         if (l_size_comp == 3) { | 
| 1738 |             l_size_comp = 4; | 
| 1739 |         } | 
| 1740 |  | 
| 1741 |         switch (l_size_comp) { | 
| 1742 |         case 1: { | 
| 1743 |             OPJ_CHAR * l_dest_ptr = (OPJ_CHAR *) p_dest; | 
| 1744 |             const OPJ_INT32 * l_src_ptr = l_src_data; | 
| 1745 |  | 
| 1746 |             if (l_img_comp->sgnd) { | 
| 1747 |                 for (j = 0; j < l_height; ++j) { | 
| 1748 |                     for (k = 0; k < l_width; ++k) { | 
| 1749 |                         *(l_dest_ptr++) = (OPJ_CHAR)(*(l_src_ptr++)); | 
| 1750 |                     } | 
| 1751 |                     l_src_ptr += l_stride; | 
| 1752 |                 } | 
| 1753 |             } else { | 
| 1754 |                 for (j = 0; j < l_height; ++j) { | 
| 1755 |                     for (k = 0; k < l_width; ++k) { | 
| 1756 |                         *(l_dest_ptr++) = (OPJ_CHAR)((*(l_src_ptr++)) & 0xff); | 
| 1757 |                     } | 
| 1758 |                     l_src_ptr += l_stride; | 
| 1759 |                 } | 
| 1760 |             } | 
| 1761 |  | 
| 1762 |             p_dest = (OPJ_BYTE *)l_dest_ptr; | 
| 1763 |         } | 
| 1764 |         break; | 
| 1765 |         case 2: { | 
| 1766 |             const OPJ_INT32 * l_src_ptr = l_src_data; | 
| 1767 |             OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_dest; | 
| 1768 |  | 
| 1769 |             if (l_img_comp->sgnd) { | 
| 1770 |                 for (j = 0; j < l_height; ++j) { | 
| 1771 |                     for (k = 0; k < l_width; ++k) { | 
| 1772 |                         OPJ_INT16 val = (OPJ_INT16)(*(l_src_ptr++)); | 
| 1773 |                         memcpy(l_dest_ptr, &val, sizeof(val)); | 
| 1774 |                         l_dest_ptr ++; | 
| 1775 |                     } | 
| 1776 |                     l_src_ptr += l_stride; | 
| 1777 |                 } | 
| 1778 |             } else { | 
| 1779 |                 for (j = 0; j < l_height; ++j) { | 
| 1780 |                     for (k = 0; k < l_width; ++k) { | 
| 1781 |                         OPJ_INT16 val = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff); | 
| 1782 |                         memcpy(l_dest_ptr, &val, sizeof(val)); | 
| 1783 |                         l_dest_ptr ++; | 
| 1784 |                     } | 
| 1785 |                     l_src_ptr += l_stride; | 
| 1786 |                 } | 
| 1787 |             } | 
| 1788 |  | 
| 1789 |             p_dest = (OPJ_BYTE*) l_dest_ptr; | 
| 1790 |         } | 
| 1791 |         break; | 
| 1792 |         case 4: { | 
| 1793 |             OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_dest; | 
| 1794 |             const OPJ_INT32 * l_src_ptr = l_src_data; | 
| 1795 |  | 
| 1796 |             for (j = 0; j < l_height; ++j) { | 
| 1797 |                 memcpy(l_dest_ptr, l_src_ptr, l_width * sizeof(OPJ_INT32)); | 
| 1798 |                 l_dest_ptr += l_width; | 
| 1799 |                 l_src_ptr += l_width + l_stride; | 
| 1800 |             } | 
| 1801 |  | 
| 1802 |             p_dest = (OPJ_BYTE*) l_dest_ptr; | 
| 1803 |         } | 
| 1804 |         break; | 
| 1805 |         } | 
| 1806 |  | 
| 1807 |         ++l_img_comp; | 
| 1808 |         ++l_tilec; | 
| 1809 |     } | 
| 1810 |  | 
| 1811 |     return OPJ_TRUE; | 
| 1812 | } | 
| 1813 |  | 
| 1814 |  | 
| 1815 |  | 
| 1816 |  | 
| 1817 | static void opj_tcd_free_tile(opj_tcd_t *p_tcd) | 
| 1818 | { | 
| 1819 |     OPJ_UINT32 compno, resno, bandno, precno; | 
| 1820 |     opj_tcd_tile_t *l_tile = 00; | 
| 1821 |     opj_tcd_tilecomp_t *l_tile_comp = 00; | 
| 1822 |     opj_tcd_resolution_t *l_res = 00; | 
| 1823 |     opj_tcd_band_t *l_band = 00; | 
| 1824 |     opj_tcd_precinct_t *l_precinct = 00; | 
| 1825 |     OPJ_UINT32 l_nb_resolutions, l_nb_precincts; | 
| 1826 |     void (* l_tcd_code_block_deallocate)(opj_tcd_precinct_t *) = 00; | 
| 1827 |  | 
| 1828 |     if (! p_tcd) { | 
| 1829 |         return; | 
| 1830 |     } | 
| 1831 |  | 
| 1832 |     if (! p_tcd->tcd_image) { | 
| 1833 |         return; | 
| 1834 |     } | 
| 1835 |  | 
| 1836 |     if (p_tcd->m_is_decoder) { | 
| 1837 |         l_tcd_code_block_deallocate = opj_tcd_code_block_dec_deallocate; | 
| 1838 |     } else { | 
| 1839 |         l_tcd_code_block_deallocate = opj_tcd_code_block_enc_deallocate; | 
| 1840 |     } | 
| 1841 |  | 
| 1842 |     l_tile = p_tcd->tcd_image->tiles; | 
| 1843 |     if (! l_tile) { | 
| 1844 |         return; | 
| 1845 |     } | 
| 1846 |  | 
| 1847 |     l_tile_comp = l_tile->comps; | 
| 1848 |  | 
| 1849 |     for (compno = 0; compno < l_tile->numcomps; ++compno) { | 
| 1850 |         l_res = l_tile_comp->resolutions; | 
| 1851 |         if (l_res) { | 
| 1852 |  | 
| 1853 |             l_nb_resolutions = l_tile_comp->resolutions_size / (OPJ_UINT32)sizeof( | 
| 1854 |                                    opj_tcd_resolution_t); | 
| 1855 |             for (resno = 0; resno < l_nb_resolutions; ++resno) { | 
| 1856 |                 l_band = l_res->bands; | 
| 1857 |                 for (bandno = 0; bandno < 3; ++bandno) { | 
| 1858 |                     l_precinct = l_band->precincts; | 
| 1859 |                     if (l_precinct) { | 
| 1860 |  | 
| 1861 |                         l_nb_precincts = l_band->precincts_data_size / (OPJ_UINT32)sizeof( | 
| 1862 |                                              opj_tcd_precinct_t); | 
| 1863 |                         for (precno = 0; precno < l_nb_precincts; ++precno) { | 
| 1864 |                             opj_tgt_destroy(l_precinct->incltree); | 
| 1865 |                             l_precinct->incltree = 00; | 
| 1866 |                             opj_tgt_destroy(l_precinct->imsbtree); | 
| 1867 |                             l_precinct->imsbtree = 00; | 
| 1868 |                             (*l_tcd_code_block_deallocate)(l_precinct); | 
| 1869 |                             ++l_precinct; | 
| 1870 |                         } | 
| 1871 |  | 
| 1872 |                         opj_free(l_band->precincts); | 
| 1873 |                         l_band->precincts = 00; | 
| 1874 |                     } | 
| 1875 |                     ++l_band; | 
| 1876 |                 } /* for (resno */ | 
| 1877 |                 ++l_res; | 
| 1878 |             } | 
| 1879 |  | 
| 1880 |             opj_free(l_tile_comp->resolutions); | 
| 1881 |             l_tile_comp->resolutions = 00; | 
| 1882 |         } | 
| 1883 |  | 
| 1884 |         if (l_tile_comp->ownsData && l_tile_comp->data) { | 
| 1885 |             opj_image_data_free(l_tile_comp->data); | 
| 1886 |             l_tile_comp->data = 00; | 
| 1887 |             l_tile_comp->ownsData = 0; | 
| 1888 |             l_tile_comp->data_size = 0; | 
| 1889 |             l_tile_comp->data_size_needed = 0; | 
| 1890 |         } | 
| 1891 |  | 
| 1892 |         opj_image_data_free(l_tile_comp->data_win); | 
| 1893 |  | 
| 1894 |         ++l_tile_comp; | 
| 1895 |     } | 
| 1896 |  | 
| 1897 |     opj_free(l_tile->comps); | 
| 1898 |     l_tile->comps = 00; | 
| 1899 |     opj_free(p_tcd->tcd_image->tiles); | 
| 1900 |     p_tcd->tcd_image->tiles = 00; | 
| 1901 | } | 
| 1902 |  | 
| 1903 |  | 
| 1904 | static OPJ_BOOL opj_tcd_t2_decode(opj_tcd_t *p_tcd, | 
| 1905 |                                   OPJ_BYTE * p_src_data, | 
| 1906 |                                   OPJ_UINT32 * p_data_read, | 
| 1907 |                                   OPJ_UINT32 p_max_src_size, | 
| 1908 |                                   opj_codestream_index_t *p_cstr_index, | 
| 1909 |                                   opj_event_mgr_t *p_manager | 
| 1910 |                                  ) | 
| 1911 | { | 
| 1912 |     opj_t2_t * l_t2; | 
| 1913 |  | 
| 1914 |     l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp); | 
| 1915 |     if (l_t2 == 00) { | 
| 1916 |         return OPJ_FALSE; | 
| 1917 |     } | 
| 1918 |  | 
| 1919 |     if (! opj_t2_decode_packets( | 
| 1920 |                 p_tcd, | 
| 1921 |                 l_t2, | 
| 1922 |                 p_tcd->tcd_tileno, | 
| 1923 |                 p_tcd->tcd_image->tiles, | 
| 1924 |                 p_src_data, | 
| 1925 |                 p_data_read, | 
| 1926 |                 p_max_src_size, | 
| 1927 |                 p_cstr_index, | 
| 1928 |                 p_manager)) { | 
| 1929 |         opj_t2_destroy(l_t2); | 
| 1930 |         return OPJ_FALSE; | 
| 1931 |     } | 
| 1932 |  | 
| 1933 |     opj_t2_destroy(l_t2); | 
| 1934 |  | 
| 1935 |     /*---------------CLEAN-------------------*/ | 
| 1936 |     return OPJ_TRUE; | 
| 1937 | } | 
| 1938 |  | 
| 1939 | static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager) | 
| 1940 | { | 
| 1941 |     OPJ_UINT32 compno; | 
| 1942 |     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles; | 
| 1943 |     opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps; | 
| 1944 |     opj_tccp_t * l_tccp = p_tcd->tcp->tccps; | 
| 1945 |     volatile OPJ_BOOL ret = OPJ_TRUE; | 
| 1946 |     OPJ_BOOL check_pterm = OPJ_FALSE; | 
| 1947 |     opj_mutex_t* p_manager_mutex = NULL; | 
| 1948 |  | 
| 1949 |     p_manager_mutex = opj_mutex_create(); | 
| 1950 |  | 
| 1951 |     /* Only enable PTERM check if we decode all layers */ | 
| 1952 |     if (p_tcd->tcp->num_layers_to_decode == p_tcd->tcp->numlayers && | 
| 1953 |             (l_tccp->cblksty & J2K_CCP_CBLKSTY_PTERM) != 0) { | 
| 1954 |         check_pterm = OPJ_TRUE; | 
| 1955 |     } | 
| 1956 |  | 
| 1957 |     for (compno = 0; compno < l_tile->numcomps; | 
| 1958 |             ++compno, ++l_tile_comp, ++l_tccp) { | 
| 1959 |         if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) { | 
| 1960 |             continue; | 
| 1961 |         } | 
| 1962 |  | 
| 1963 |         opj_t1_decode_cblks(p_tcd, &ret, l_tile_comp, l_tccp, | 
| 1964 |                             p_manager, p_manager_mutex, check_pterm); | 
| 1965 |         if (!ret) { | 
| 1966 |             break; | 
| 1967 |         } | 
| 1968 |     } | 
| 1969 |  | 
| 1970 |     opj_thread_pool_wait_completion(p_tcd->thread_pool, 0); | 
| 1971 |     if (p_manager_mutex) { | 
| 1972 |         opj_mutex_destroy(p_manager_mutex); | 
| 1973 |     } | 
| 1974 |     return ret; | 
| 1975 | } | 
| 1976 |  | 
| 1977 |  | 
| 1978 | static OPJ_BOOL opj_tcd_dwt_decode(opj_tcd_t *p_tcd) | 
| 1979 | { | 
| 1980 |     OPJ_UINT32 compno; | 
| 1981 |     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles; | 
| 1982 |     opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps; | 
| 1983 |     opj_tccp_t * l_tccp = p_tcd->tcp->tccps; | 
| 1984 |     opj_image_comp_t * l_img_comp = p_tcd->image->comps; | 
| 1985 |  | 
| 1986 |     for (compno = 0; compno < l_tile->numcomps; | 
| 1987 |             compno++, ++l_tile_comp, ++l_img_comp, ++l_tccp) { | 
| 1988 |         if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) { | 
| 1989 |             continue; | 
| 1990 |         } | 
| 1991 |  | 
| 1992 |         if (l_tccp->qmfbid == 1) { | 
| 1993 |             if (! opj_dwt_decode(p_tcd, l_tile_comp, | 
| 1994 |                                  l_img_comp->resno_decoded + 1)) { | 
| 1995 |                 return OPJ_FALSE; | 
| 1996 |             } | 
| 1997 |         } else { | 
| 1998 |             if (! opj_dwt_decode_real(p_tcd, l_tile_comp, | 
| 1999 |                                       l_img_comp->resno_decoded + 1)) { | 
| 2000 |                 return OPJ_FALSE; | 
| 2001 |             } | 
| 2002 |         } | 
| 2003 |  | 
| 2004 |     } | 
| 2005 |  | 
| 2006 |     return OPJ_TRUE; | 
| 2007 | } | 
| 2008 |  | 
| 2009 | static OPJ_BOOL opj_tcd_mct_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager) | 
| 2010 | { | 
| 2011 |     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles; | 
| 2012 |     opj_tcp_t * l_tcp = p_tcd->tcp; | 
| 2013 |     opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps; | 
| 2014 |     OPJ_UINT32 l_samples, i; | 
| 2015 |  | 
| 2016 |     if (l_tcp->mct == 0 || p_tcd->used_component != NULL) { | 
| 2017 |         return OPJ_TRUE; | 
| 2018 |     } | 
| 2019 |  | 
| 2020 |     if (p_tcd->whole_tile_decoding) { | 
| 2021 |         opj_tcd_resolution_t* res_comp0 = l_tile->comps[0].resolutions + | 
| 2022 |                                           l_tile_comp->minimum_num_resolutions - 1; | 
| 2023 |  | 
| 2024 |         /* A bit inefficient: we process more data than needed if */ | 
| 2025 |         /* resno_decoded < l_tile_comp->minimum_num_resolutions-1, */ | 
| 2026 |         /* but we would need to take into account a stride then */ | 
| 2027 |         l_samples = (OPJ_UINT32)((res_comp0->x1 - res_comp0->x0) * | 
| 2028 |                                  (res_comp0->y1 - res_comp0->y0)); | 
| 2029 |         if (l_tile->numcomps >= 3) { | 
| 2030 |             if (l_tile_comp->minimum_num_resolutions != | 
| 2031 |                     l_tile->comps[1].minimum_num_resolutions || | 
| 2032 |                     l_tile_comp->minimum_num_resolutions != | 
| 2033 |                     l_tile->comps[2].minimum_num_resolutions) { | 
| 2034 |                 opj_event_msg(p_manager, EVT_ERROR, | 
| 2035 |                               "Tiles don't all have the same dimension. Skip the MCT step.\n" ); | 
| 2036 |                 return OPJ_FALSE; | 
| 2037 |             } | 
| 2038 |         } | 
| 2039 |         if (l_tile->numcomps >= 3) { | 
| 2040 |             opj_tcd_resolution_t* res_comp1 = l_tile->comps[1].resolutions + | 
| 2041 |                                               l_tile_comp->minimum_num_resolutions - 1; | 
| 2042 |             opj_tcd_resolution_t* res_comp2 = l_tile->comps[2].resolutions + | 
| 2043 |                                               l_tile_comp->minimum_num_resolutions - 1; | 
| 2044 |             /* testcase 1336.pdf.asan.47.376 */ | 
| 2045 |             if (p_tcd->image->comps[0].resno_decoded != | 
| 2046 |                     p_tcd->image->comps[1].resno_decoded || | 
| 2047 |                     p_tcd->image->comps[0].resno_decoded != | 
| 2048 |                     p_tcd->image->comps[2].resno_decoded || | 
| 2049 |                     (OPJ_SIZE_T)(res_comp1->x1 - res_comp1->x0) * | 
| 2050 |                     (OPJ_SIZE_T)(res_comp1->y1 - res_comp1->y0) != l_samples || | 
| 2051 |                     (OPJ_SIZE_T)(res_comp2->x1 - res_comp2->x0) * | 
| 2052 |                     (OPJ_SIZE_T)(res_comp2->y1 - res_comp2->y0) != l_samples) { | 
| 2053 |                 opj_event_msg(p_manager, EVT_ERROR, | 
| 2054 |                               "Tiles don't all have the same dimension. Skip the MCT step.\n" ); | 
| 2055 |                 return OPJ_FALSE; | 
| 2056 |             } | 
| 2057 |         } | 
| 2058 |     } else { | 
| 2059 |         opj_tcd_resolution_t* res_comp0 = l_tile->comps[0].resolutions + | 
| 2060 |                                           p_tcd->image->comps[0].resno_decoded; | 
| 2061 |  | 
| 2062 |         l_samples = (res_comp0->win_x1 - res_comp0->win_x0) * | 
| 2063 |                     (res_comp0->win_y1 - res_comp0->win_y0); | 
| 2064 |         if (l_tile->numcomps >= 3) { | 
| 2065 |             opj_tcd_resolution_t* res_comp1 = l_tile->comps[1].resolutions + | 
| 2066 |                                               p_tcd->image->comps[1].resno_decoded; | 
| 2067 |             opj_tcd_resolution_t* res_comp2 = l_tile->comps[2].resolutions + | 
| 2068 |                                               p_tcd->image->comps[2].resno_decoded; | 
| 2069 |             /* testcase 1336.pdf.asan.47.376 */ | 
| 2070 |             if (p_tcd->image->comps[0].resno_decoded != | 
| 2071 |                     p_tcd->image->comps[1].resno_decoded || | 
| 2072 |                     p_tcd->image->comps[0].resno_decoded != | 
| 2073 |                     p_tcd->image->comps[2].resno_decoded || | 
| 2074 |                     (OPJ_SIZE_T)(res_comp1->win_x1 - res_comp1->win_x0) * | 
| 2075 |                     (OPJ_SIZE_T)(res_comp1->win_y1 - res_comp1->win_y0) != l_samples || | 
| 2076 |                     (OPJ_SIZE_T)(res_comp2->win_x1 - res_comp2->win_x0) * | 
| 2077 |                     (OPJ_SIZE_T)(res_comp2->win_y1 - res_comp2->win_y0) != l_samples) { | 
| 2078 |                 opj_event_msg(p_manager, EVT_ERROR, | 
| 2079 |                               "Tiles don't all have the same dimension. Skip the MCT step.\n" ); | 
| 2080 |                 return OPJ_FALSE; | 
| 2081 |             } | 
| 2082 |         } | 
| 2083 |     } | 
| 2084 |  | 
| 2085 |     if (l_tile->numcomps >= 3) { | 
| 2086 |         if (l_tcp->mct == 2) { | 
| 2087 |             OPJ_BYTE ** l_data; | 
| 2088 |  | 
| 2089 |             if (! l_tcp->m_mct_decoding_matrix) { | 
| 2090 |                 return OPJ_TRUE; | 
| 2091 |             } | 
| 2092 |  | 
| 2093 |             l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps * sizeof(OPJ_BYTE*)); | 
| 2094 |             if (! l_data) { | 
| 2095 |                 return OPJ_FALSE; | 
| 2096 |             } | 
| 2097 |  | 
| 2098 |             for (i = 0; i < l_tile->numcomps; ++i) { | 
| 2099 |                 if (p_tcd->whole_tile_decoding) { | 
| 2100 |                     l_data[i] = (OPJ_BYTE*) l_tile_comp->data; | 
| 2101 |                 } else { | 
| 2102 |                     l_data[i] = (OPJ_BYTE*) l_tile_comp->data_win; | 
| 2103 |                 } | 
| 2104 |                 ++l_tile_comp; | 
| 2105 |             } | 
| 2106 |  | 
| 2107 |             if (! opj_mct_decode_custom(/* MCT data */ | 
| 2108 |                         (OPJ_BYTE*) l_tcp->m_mct_decoding_matrix, | 
| 2109 |                         /* size of components */ | 
| 2110 |                         l_samples, | 
| 2111 |                         /* components */ | 
| 2112 |                         l_data, | 
| 2113 |                         /* nb of components (i.e. size of pData) */ | 
| 2114 |                         l_tile->numcomps, | 
| 2115 |                         /* tells if the data is signed */ | 
| 2116 |                         p_tcd->image->comps->sgnd)) { | 
| 2117 |                 opj_free(l_data); | 
| 2118 |                 return OPJ_FALSE; | 
| 2119 |             } | 
| 2120 |  | 
| 2121 |             opj_free(l_data); | 
| 2122 |         } else { | 
| 2123 |             if (l_tcp->tccps->qmfbid == 1) { | 
| 2124 |                 if (p_tcd->whole_tile_decoding) { | 
| 2125 |                     opj_mct_decode(l_tile->comps[0].data, | 
| 2126 |                                    l_tile->comps[1].data, | 
| 2127 |                                    l_tile->comps[2].data, | 
| 2128 |                                    l_samples); | 
| 2129 |                 } else { | 
| 2130 |                     opj_mct_decode(l_tile->comps[0].data_win, | 
| 2131 |                                    l_tile->comps[1].data_win, | 
| 2132 |                                    l_tile->comps[2].data_win, | 
| 2133 |                                    l_samples); | 
| 2134 |                 } | 
| 2135 |             } else { | 
| 2136 |                 if (p_tcd->whole_tile_decoding) { | 
| 2137 |                     opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data, | 
| 2138 |                                         (OPJ_FLOAT32*)l_tile->comps[1].data, | 
| 2139 |                                         (OPJ_FLOAT32*)l_tile->comps[2].data, | 
| 2140 |                                         l_samples); | 
| 2141 |                 } else { | 
| 2142 |                     opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data_win, | 
| 2143 |                                         (OPJ_FLOAT32*)l_tile->comps[1].data_win, | 
| 2144 |                                         (OPJ_FLOAT32*)l_tile->comps[2].data_win, | 
| 2145 |                                         l_samples); | 
| 2146 |                 } | 
| 2147 |             } | 
| 2148 |         } | 
| 2149 |     } else { | 
| 2150 |         opj_event_msg(p_manager, EVT_ERROR, | 
| 2151 |                       "Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n" , | 
| 2152 |                       l_tile->numcomps); | 
| 2153 |     } | 
| 2154 |  | 
| 2155 |     return OPJ_TRUE; | 
| 2156 | } | 
| 2157 |  | 
| 2158 |  | 
| 2159 | static OPJ_BOOL opj_tcd_dc_level_shift_decode(opj_tcd_t *p_tcd) | 
| 2160 | { | 
| 2161 |     OPJ_UINT32 compno; | 
| 2162 |     opj_tcd_tilecomp_t * l_tile_comp = 00; | 
| 2163 |     opj_tccp_t * l_tccp = 00; | 
| 2164 |     opj_image_comp_t * l_img_comp = 00; | 
| 2165 |     opj_tcd_resolution_t* l_res = 00; | 
| 2166 |     opj_tcd_tile_t * l_tile; | 
| 2167 |     OPJ_UINT32 l_width, l_height, i, j; | 
| 2168 |     OPJ_INT32 * l_current_ptr; | 
| 2169 |     OPJ_INT32 l_min, l_max; | 
| 2170 |     OPJ_UINT32 l_stride; | 
| 2171 |  | 
| 2172 |     l_tile = p_tcd->tcd_image->tiles; | 
| 2173 |     l_tile_comp = l_tile->comps; | 
| 2174 |     l_tccp = p_tcd->tcp->tccps; | 
| 2175 |     l_img_comp = p_tcd->image->comps; | 
| 2176 |  | 
| 2177 |     for (compno = 0; compno < l_tile->numcomps; | 
| 2178 |             compno++, ++l_img_comp, ++l_tccp, ++l_tile_comp) { | 
| 2179 |  | 
| 2180 |         if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) { | 
| 2181 |             continue; | 
| 2182 |         } | 
| 2183 |  | 
| 2184 |         l_res = l_tile_comp->resolutions + l_img_comp->resno_decoded; | 
| 2185 |  | 
| 2186 |         if (!p_tcd->whole_tile_decoding) { | 
| 2187 |             l_width = l_res->win_x1 - l_res->win_x0; | 
| 2188 |             l_height = l_res->win_y1 - l_res->win_y0; | 
| 2189 |             l_stride = 0; | 
| 2190 |             l_current_ptr = l_tile_comp->data_win; | 
| 2191 |         } else { | 
| 2192 |             l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0); | 
| 2193 |             l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0); | 
| 2194 |             l_stride = (OPJ_UINT32)( | 
| 2195 |                            l_tile_comp->resolutions[l_tile_comp->minimum_num_resolutions - 1].x1 - | 
| 2196 |                            l_tile_comp->resolutions[l_tile_comp->minimum_num_resolutions - 1].x0) | 
| 2197 |                        - l_width; | 
| 2198 |             l_current_ptr = l_tile_comp->data; | 
| 2199 |  | 
| 2200 |             assert(l_height == 0 || | 
| 2201 |                    l_width + l_stride <= l_tile_comp->data_size / l_height); /*MUPDF*/ | 
| 2202 |         } | 
| 2203 |  | 
| 2204 |         if (l_img_comp->sgnd) { | 
| 2205 |             l_min = -(1 << (l_img_comp->prec - 1)); | 
| 2206 |             l_max = (1 << (l_img_comp->prec - 1)) - 1; | 
| 2207 |         } else { | 
| 2208 |             l_min = 0; | 
| 2209 |             l_max = (OPJ_INT32)((1U << l_img_comp->prec) - 1); | 
| 2210 |         } | 
| 2211 |  | 
| 2212 |  | 
| 2213 |         if (l_tccp->qmfbid == 1) { | 
| 2214 |             for (j = 0; j < l_height; ++j) { | 
| 2215 |                 for (i = 0; i < l_width; ++i) { | 
| 2216 |                     /* TODO: do addition on int64 ? */ | 
| 2217 |                     *l_current_ptr = opj_int_clamp(*l_current_ptr + l_tccp->m_dc_level_shift, l_min, | 
| 2218 |                                                    l_max); | 
| 2219 |                     ++l_current_ptr; | 
| 2220 |                 } | 
| 2221 |                 l_current_ptr += l_stride; | 
| 2222 |             } | 
| 2223 |         } else { | 
| 2224 |             for (j = 0; j < l_height; ++j) { | 
| 2225 |                 for (i = 0; i < l_width; ++i) { | 
| 2226 |                     OPJ_FLOAT32 l_value = *((OPJ_FLOAT32 *) l_current_ptr); | 
| 2227 |                     if (l_value > INT_MAX) { | 
| 2228 |                         *l_current_ptr = l_max; | 
| 2229 |                     } else if (l_value < INT_MIN) { | 
| 2230 |                         *l_current_ptr = l_min; | 
| 2231 |                     } else { | 
| 2232 |                         /* Do addition on int64 to avoid overflows */ | 
| 2233 |                         OPJ_INT64 l_value_int = (OPJ_INT64)opj_lrintf(l_value); | 
| 2234 |                         *l_current_ptr = (OPJ_INT32)opj_int64_clamp( | 
| 2235 |                                              l_value_int + l_tccp->m_dc_level_shift, l_min, l_max); | 
| 2236 |                     } | 
| 2237 |                     ++l_current_ptr; | 
| 2238 |                 } | 
| 2239 |                 l_current_ptr += l_stride; | 
| 2240 |             } | 
| 2241 |         } | 
| 2242 |     } | 
| 2243 |  | 
| 2244 |     return OPJ_TRUE; | 
| 2245 | } | 
| 2246 |  | 
| 2247 |  | 
| 2248 |  | 
| 2249 | /** | 
| 2250 |  * Deallocates the encoding data of the given precinct. | 
| 2251 |  */ | 
| 2252 | static void opj_tcd_code_block_dec_deallocate(opj_tcd_precinct_t * p_precinct) | 
| 2253 | { | 
| 2254 |     OPJ_UINT32 cblkno, l_nb_code_blocks; | 
| 2255 |  | 
| 2256 |     opj_tcd_cblk_dec_t * l_code_block = p_precinct->cblks.dec; | 
| 2257 |     if (l_code_block) { | 
| 2258 |         /*fprintf(stderr,"deallocate codeblock:{\n");*/ | 
| 2259 |         /*fprintf(stderr,"\t x0=%d, y0=%d, x1=%d, y1=%d\n",l_code_block->x0, l_code_block->y0, l_code_block->x1, l_code_block->y1);*/ | 
| 2260 |         /*fprintf(stderr,"\t numbps=%d, numlenbits=%d, len=%d, numnewpasses=%d, real_num_segs=%d, m_current_max_segs=%d\n ", | 
| 2261 |                         l_code_block->numbps, l_code_block->numlenbits, l_code_block->len, l_code_block->numnewpasses, l_code_block->real_num_segs, l_code_block->m_current_max_segs );*/ | 
| 2262 |  | 
| 2263 |  | 
| 2264 |         l_nb_code_blocks = p_precinct->block_size / (OPJ_UINT32)sizeof( | 
| 2265 |                                opj_tcd_cblk_dec_t); | 
| 2266 |         /*fprintf(stderr,"nb_code_blocks =%d\t}\n", l_nb_code_blocks);*/ | 
| 2267 |  | 
| 2268 |         for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) { | 
| 2269 |  | 
| 2270 |             if (l_code_block->segs) { | 
| 2271 |                 opj_free(l_code_block->segs); | 
| 2272 |                 l_code_block->segs = 00; | 
| 2273 |             } | 
| 2274 |  | 
| 2275 |             if (l_code_block->chunks) { | 
| 2276 |                 opj_free(l_code_block->chunks); | 
| 2277 |                 l_code_block->chunks = 00; | 
| 2278 |             } | 
| 2279 |  | 
| 2280 |             opj_aligned_free(l_code_block->decoded_data); | 
| 2281 |             l_code_block->decoded_data = NULL; | 
| 2282 |  | 
| 2283 |             ++l_code_block; | 
| 2284 |         } | 
| 2285 |  | 
| 2286 |         opj_free(p_precinct->cblks.dec); | 
| 2287 |         p_precinct->cblks.dec = 00; | 
| 2288 |     } | 
| 2289 | } | 
| 2290 |  | 
| 2291 | /** | 
| 2292 |  * Deallocates the encoding data of the given precinct. | 
| 2293 |  */ | 
| 2294 | static void opj_tcd_code_block_enc_deallocate(opj_tcd_precinct_t * p_precinct) | 
| 2295 | { | 
| 2296 |     OPJ_UINT32 cblkno, l_nb_code_blocks; | 
| 2297 |  | 
| 2298 |     opj_tcd_cblk_enc_t * l_code_block = p_precinct->cblks.enc; | 
| 2299 |     if (l_code_block) { | 
| 2300 |         l_nb_code_blocks = p_precinct->block_size / (OPJ_UINT32)sizeof( | 
| 2301 |                                opj_tcd_cblk_enc_t); | 
| 2302 |  | 
| 2303 |         for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno)  { | 
| 2304 |             if (l_code_block->data) { | 
| 2305 |                 /* We refer to data - 1 since below we incremented it */ | 
| 2306 |                 /* in opj_tcd_code_block_enc_allocate_data() */ | 
| 2307 |                 opj_free(l_code_block->data - 1); | 
| 2308 |                 l_code_block->data = 00; | 
| 2309 |             } | 
| 2310 |  | 
| 2311 |             if (l_code_block->layers) { | 
| 2312 |                 opj_free(l_code_block->layers); | 
| 2313 |                 l_code_block->layers = 00; | 
| 2314 |             } | 
| 2315 |  | 
| 2316 |             if (l_code_block->passes) { | 
| 2317 |                 opj_free(l_code_block->passes); | 
| 2318 |                 l_code_block->passes = 00; | 
| 2319 |             } | 
| 2320 |             ++l_code_block; | 
| 2321 |         } | 
| 2322 |  | 
| 2323 |         opj_free(p_precinct->cblks.enc); | 
| 2324 |  | 
| 2325 |         p_precinct->cblks.enc = 00; | 
| 2326 |     } | 
| 2327 | } | 
| 2328 |  | 
| 2329 | OPJ_SIZE_T opj_tcd_get_encoded_tile_size(opj_tcd_t *p_tcd) | 
| 2330 | { | 
| 2331 |     OPJ_UINT32 i; | 
| 2332 |     OPJ_SIZE_T l_data_size = 0; | 
| 2333 |     opj_image_comp_t * l_img_comp = 00; | 
| 2334 |     opj_tcd_tilecomp_t * l_tilec = 00; | 
| 2335 |     OPJ_UINT32 l_size_comp, l_remaining; | 
| 2336 |  | 
| 2337 |     l_tilec = p_tcd->tcd_image->tiles->comps; | 
| 2338 |     l_img_comp = p_tcd->image->comps; | 
| 2339 |     for (i = 0; i < p_tcd->image->numcomps; ++i) { | 
| 2340 |         l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/ | 
| 2341 |         l_remaining = l_img_comp->prec & 7;  /* (%8) */ | 
| 2342 |  | 
| 2343 |         if (l_remaining) { | 
| 2344 |             ++l_size_comp; | 
| 2345 |         } | 
| 2346 |  | 
| 2347 |         if (l_size_comp == 3) { | 
| 2348 |             l_size_comp = 4; | 
| 2349 |         } | 
| 2350 |  | 
| 2351 |         l_data_size += l_size_comp * ((OPJ_SIZE_T)(l_tilec->x1 - l_tilec->x0) * | 
| 2352 |                                       (OPJ_SIZE_T)(l_tilec->y1 - l_tilec->y0)); | 
| 2353 |         ++l_img_comp; | 
| 2354 |         ++l_tilec; | 
| 2355 |     } | 
| 2356 |  | 
| 2357 |     return l_data_size; | 
| 2358 | } | 
| 2359 |  | 
| 2360 | static OPJ_BOOL opj_tcd_dc_level_shift_encode(opj_tcd_t *p_tcd) | 
| 2361 | { | 
| 2362 |     OPJ_UINT32 compno; | 
| 2363 |     opj_tcd_tilecomp_t * l_tile_comp = 00; | 
| 2364 |     opj_tccp_t * l_tccp = 00; | 
| 2365 |     opj_image_comp_t * l_img_comp = 00; | 
| 2366 |     opj_tcd_tile_t * l_tile; | 
| 2367 |     OPJ_SIZE_T l_nb_elem, i; | 
| 2368 |     OPJ_INT32 * l_current_ptr; | 
| 2369 |  | 
| 2370 |     l_tile = p_tcd->tcd_image->tiles; | 
| 2371 |     l_tile_comp = l_tile->comps; | 
| 2372 |     l_tccp = p_tcd->tcp->tccps; | 
| 2373 |     l_img_comp = p_tcd->image->comps; | 
| 2374 |  | 
| 2375 |     for (compno = 0; compno < l_tile->numcomps; compno++) { | 
| 2376 |         l_current_ptr = l_tile_comp->data; | 
| 2377 |         l_nb_elem = (OPJ_SIZE_T)(l_tile_comp->x1 - l_tile_comp->x0) * | 
| 2378 |                     (OPJ_SIZE_T)(l_tile_comp->y1 - l_tile_comp->y0); | 
| 2379 |  | 
| 2380 |         if (l_tccp->qmfbid == 1) { | 
| 2381 |             for (i = 0; i < l_nb_elem; ++i) { | 
| 2382 |                 *l_current_ptr -= l_tccp->m_dc_level_shift ; | 
| 2383 |                 ++l_current_ptr; | 
| 2384 |             } | 
| 2385 |         } else { | 
| 2386 |             for (i = 0; i < l_nb_elem; ++i) { | 
| 2387 |                 *l_current_ptr = (*l_current_ptr - l_tccp->m_dc_level_shift) * (1 << 11); | 
| 2388 |                 ++l_current_ptr; | 
| 2389 |             } | 
| 2390 |         } | 
| 2391 |  | 
| 2392 |         ++l_img_comp; | 
| 2393 |         ++l_tccp; | 
| 2394 |         ++l_tile_comp; | 
| 2395 |     } | 
| 2396 |  | 
| 2397 |     return OPJ_TRUE; | 
| 2398 | } | 
| 2399 |  | 
| 2400 | static OPJ_BOOL opj_tcd_mct_encode(opj_tcd_t *p_tcd) | 
| 2401 | { | 
| 2402 |     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles; | 
| 2403 |     opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps; | 
| 2404 |     OPJ_SIZE_T samples = (OPJ_SIZE_T)(l_tile_comp->x1 - l_tile_comp->x0) * | 
| 2405 |                          (OPJ_SIZE_T)(l_tile_comp->y1 - l_tile_comp->y0); | 
| 2406 |     OPJ_UINT32 i; | 
| 2407 |     OPJ_BYTE ** l_data = 00; | 
| 2408 |     opj_tcp_t * l_tcp = p_tcd->tcp; | 
| 2409 |  | 
| 2410 |     if (!p_tcd->tcp->mct) { | 
| 2411 |         return OPJ_TRUE; | 
| 2412 |     } | 
| 2413 |  | 
| 2414 |     if (p_tcd->tcp->mct == 2) { | 
| 2415 |         if (! p_tcd->tcp->m_mct_coding_matrix) { | 
| 2416 |             return OPJ_TRUE; | 
| 2417 |         } | 
| 2418 |  | 
| 2419 |         l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps * sizeof(OPJ_BYTE*)); | 
| 2420 |         if (! l_data) { | 
| 2421 |             return OPJ_FALSE; | 
| 2422 |         } | 
| 2423 |  | 
| 2424 |         for (i = 0; i < l_tile->numcomps; ++i) { | 
| 2425 |             l_data[i] = (OPJ_BYTE*) l_tile_comp->data; | 
| 2426 |             ++l_tile_comp; | 
| 2427 |         } | 
| 2428 |  | 
| 2429 |         if (! opj_mct_encode_custom(/* MCT data */ | 
| 2430 |                     (OPJ_BYTE*) p_tcd->tcp->m_mct_coding_matrix, | 
| 2431 |                     /* size of components */ | 
| 2432 |                     samples, | 
| 2433 |                     /* components */ | 
| 2434 |                     l_data, | 
| 2435 |                     /* nb of components (i.e. size of pData) */ | 
| 2436 |                     l_tile->numcomps, | 
| 2437 |                     /* tells if the data is signed */ | 
| 2438 |                     p_tcd->image->comps->sgnd)) { | 
| 2439 |             opj_free(l_data); | 
| 2440 |             return OPJ_FALSE; | 
| 2441 |         } | 
| 2442 |  | 
| 2443 |         opj_free(l_data); | 
| 2444 |     } else if (l_tcp->tccps->qmfbid == 0) { | 
| 2445 |         opj_mct_encode_real(l_tile->comps[0].data, l_tile->comps[1].data, | 
| 2446 |                             l_tile->comps[2].data, samples); | 
| 2447 |     } else { | 
| 2448 |         opj_mct_encode(l_tile->comps[0].data, l_tile->comps[1].data, | 
| 2449 |                        l_tile->comps[2].data, samples); | 
| 2450 |     } | 
| 2451 |  | 
| 2452 |     return OPJ_TRUE; | 
| 2453 | } | 
| 2454 |  | 
| 2455 | static OPJ_BOOL opj_tcd_dwt_encode(opj_tcd_t *p_tcd) | 
| 2456 | { | 
| 2457 |     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles; | 
| 2458 |     opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps; | 
| 2459 |     opj_tccp_t * l_tccp = p_tcd->tcp->tccps; | 
| 2460 |     OPJ_UINT32 compno; | 
| 2461 |  | 
| 2462 |     for (compno = 0; compno < l_tile->numcomps; ++compno) { | 
| 2463 |         if (l_tccp->qmfbid == 1) { | 
| 2464 |             if (! opj_dwt_encode(l_tile_comp)) { | 
| 2465 |                 return OPJ_FALSE; | 
| 2466 |             } | 
| 2467 |         } else if (l_tccp->qmfbid == 0) { | 
| 2468 |             if (! opj_dwt_encode_real(l_tile_comp)) { | 
| 2469 |                 return OPJ_FALSE; | 
| 2470 |             } | 
| 2471 |         } | 
| 2472 |  | 
| 2473 |         ++l_tile_comp; | 
| 2474 |         ++l_tccp; | 
| 2475 |     } | 
| 2476 |  | 
| 2477 |     return OPJ_TRUE; | 
| 2478 | } | 
| 2479 |  | 
| 2480 | static OPJ_BOOL opj_tcd_t1_encode(opj_tcd_t *p_tcd) | 
| 2481 | { | 
| 2482 |     opj_t1_t * l_t1; | 
| 2483 |     const OPJ_FLOAT64 * l_mct_norms; | 
| 2484 |     OPJ_UINT32 l_mct_numcomps = 0U; | 
| 2485 |     opj_tcp_t * l_tcp = p_tcd->tcp; | 
| 2486 |  | 
| 2487 |     l_t1 = opj_t1_create(OPJ_TRUE); | 
| 2488 |     if (l_t1 == 00) { | 
| 2489 |         return OPJ_FALSE; | 
| 2490 |     } | 
| 2491 |  | 
| 2492 |     if (l_tcp->mct == 1) { | 
| 2493 |         l_mct_numcomps = 3U; | 
| 2494 |         /* irreversible encoding */ | 
| 2495 |         if (l_tcp->tccps->qmfbid == 0) { | 
| 2496 |             l_mct_norms = opj_mct_get_mct_norms_real(); | 
| 2497 |         } else { | 
| 2498 |             l_mct_norms = opj_mct_get_mct_norms(); | 
| 2499 |         } | 
| 2500 |     } else { | 
| 2501 |         l_mct_numcomps = p_tcd->image->numcomps; | 
| 2502 |         l_mct_norms = (const OPJ_FLOAT64 *)(l_tcp->mct_norms); | 
| 2503 |     } | 
| 2504 |  | 
| 2505 |     if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles, l_tcp, l_mct_norms, | 
| 2506 |                               l_mct_numcomps)) { | 
| 2507 |         opj_t1_destroy(l_t1); | 
| 2508 |         return OPJ_FALSE; | 
| 2509 |     } | 
| 2510 |  | 
| 2511 |     opj_t1_destroy(l_t1); | 
| 2512 |  | 
| 2513 |     return OPJ_TRUE; | 
| 2514 | } | 
| 2515 |  | 
| 2516 | static OPJ_BOOL opj_tcd_t2_encode(opj_tcd_t *p_tcd, | 
| 2517 |                                   OPJ_BYTE * p_dest_data, | 
| 2518 |                                   OPJ_UINT32 * p_data_written, | 
| 2519 |                                   OPJ_UINT32 p_max_dest_size, | 
| 2520 |                                   opj_codestream_info_t *p_cstr_info, | 
| 2521 |                                   opj_event_mgr_t *p_manager) | 
| 2522 | { | 
| 2523 |     opj_t2_t * l_t2; | 
| 2524 |  | 
| 2525 |     l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp); | 
| 2526 |     if (l_t2 == 00) { | 
| 2527 |         return OPJ_FALSE; | 
| 2528 |     } | 
| 2529 |  | 
| 2530 |     if (! opj_t2_encode_packets( | 
| 2531 |                 l_t2, | 
| 2532 |                 p_tcd->tcd_tileno, | 
| 2533 |                 p_tcd->tcd_image->tiles, | 
| 2534 |                 p_tcd->tcp->numlayers, | 
| 2535 |                 p_dest_data, | 
| 2536 |                 p_data_written, | 
| 2537 |                 p_max_dest_size, | 
| 2538 |                 p_cstr_info, | 
| 2539 |                 p_tcd->tp_num, | 
| 2540 |                 p_tcd->tp_pos, | 
| 2541 |                 p_tcd->cur_pino, | 
| 2542 |                 FINAL_PASS, | 
| 2543 |                 p_manager)) { | 
| 2544 |         opj_t2_destroy(l_t2); | 
| 2545 |         return OPJ_FALSE; | 
| 2546 |     } | 
| 2547 |  | 
| 2548 |     opj_t2_destroy(l_t2); | 
| 2549 |  | 
| 2550 |     /*---------------CLEAN-------------------*/ | 
| 2551 |     return OPJ_TRUE; | 
| 2552 | } | 
| 2553 |  | 
| 2554 |  | 
| 2555 | static OPJ_BOOL opj_tcd_rate_allocate_encode(opj_tcd_t *p_tcd, | 
| 2556 |         OPJ_BYTE * p_dest_data, | 
| 2557 |         OPJ_UINT32 p_max_dest_size, | 
| 2558 |         opj_codestream_info_t *p_cstr_info, | 
| 2559 |         opj_event_mgr_t *p_manager) | 
| 2560 | { | 
| 2561 |     opj_cp_t * l_cp = p_tcd->cp; | 
| 2562 |     OPJ_UINT32 l_nb_written = 0; | 
| 2563 |  | 
| 2564 |     if (p_cstr_info)  { | 
| 2565 |         p_cstr_info->index_write = 0; | 
| 2566 |     } | 
| 2567 |  | 
| 2568 |     if (l_cp->m_specific_param.m_enc.m_disto_alloc || | 
| 2569 |             l_cp->m_specific_param.m_enc.m_fixed_quality)  { | 
| 2570 |         /* fixed_quality */ | 
| 2571 |         /* Normal Rate/distortion allocation */ | 
| 2572 |         if (! opj_tcd_rateallocate(p_tcd, p_dest_data, &l_nb_written, p_max_dest_size, | 
| 2573 |                                    p_cstr_info, p_manager)) { | 
| 2574 |             return OPJ_FALSE; | 
| 2575 |         } | 
| 2576 |     } else { | 
| 2577 |         /* Fixed layer allocation */ | 
| 2578 |         opj_tcd_rateallocate_fixed(p_tcd); | 
| 2579 |     } | 
| 2580 |  | 
| 2581 |     return OPJ_TRUE; | 
| 2582 | } | 
| 2583 |  | 
| 2584 |  | 
| 2585 | OPJ_BOOL opj_tcd_copy_tile_data(opj_tcd_t *p_tcd, | 
| 2586 |                                 OPJ_BYTE * p_src, | 
| 2587 |                                 OPJ_SIZE_T p_src_length) | 
| 2588 | { | 
| 2589 |     OPJ_UINT32 i; | 
| 2590 |     OPJ_SIZE_T j; | 
| 2591 |     OPJ_SIZE_T l_data_size = 0; | 
| 2592 |     opj_image_comp_t * l_img_comp = 00; | 
| 2593 |     opj_tcd_tilecomp_t * l_tilec = 00; | 
| 2594 |     OPJ_UINT32 l_size_comp, l_remaining; | 
| 2595 |     OPJ_SIZE_T l_nb_elem; | 
| 2596 |  | 
| 2597 |     l_data_size = opj_tcd_get_encoded_tile_size(p_tcd); | 
| 2598 |     if (l_data_size != p_src_length) { | 
| 2599 |         return OPJ_FALSE; | 
| 2600 |     } | 
| 2601 |  | 
| 2602 |     l_tilec = p_tcd->tcd_image->tiles->comps; | 
| 2603 |     l_img_comp = p_tcd->image->comps; | 
| 2604 |     for (i = 0; i < p_tcd->image->numcomps; ++i) { | 
| 2605 |         l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/ | 
| 2606 |         l_remaining = l_img_comp->prec & 7;  /* (%8) */ | 
| 2607 |         l_nb_elem = (OPJ_SIZE_T)(l_tilec->x1 - l_tilec->x0) * | 
| 2608 |                     (OPJ_SIZE_T)(l_tilec->y1 - l_tilec->y0); | 
| 2609 |  | 
| 2610 |         if (l_remaining) { | 
| 2611 |             ++l_size_comp; | 
| 2612 |         } | 
| 2613 |  | 
| 2614 |         if (l_size_comp == 3) { | 
| 2615 |             l_size_comp = 4; | 
| 2616 |         } | 
| 2617 |  | 
| 2618 |         switch (l_size_comp) { | 
| 2619 |         case 1: { | 
| 2620 |             OPJ_CHAR * l_src_ptr = (OPJ_CHAR *) p_src; | 
| 2621 |             OPJ_INT32 * l_dest_ptr = l_tilec->data; | 
| 2622 |  | 
| 2623 |             if (l_img_comp->sgnd) { | 
| 2624 |                 for (j = 0; j < l_nb_elem; ++j) { | 
| 2625 |                     *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++)); | 
| 2626 |                 } | 
| 2627 |             } else { | 
| 2628 |                 for (j = 0; j < l_nb_elem; ++j) { | 
| 2629 |                     *(l_dest_ptr++) = (*(l_src_ptr++)) & 0xff; | 
| 2630 |                 } | 
| 2631 |             } | 
| 2632 |  | 
| 2633 |             p_src = (OPJ_BYTE*) l_src_ptr; | 
| 2634 |         } | 
| 2635 |         break; | 
| 2636 |         case 2: { | 
| 2637 |             OPJ_INT32 * l_dest_ptr = l_tilec->data; | 
| 2638 |             OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_src; | 
| 2639 |  | 
| 2640 |             if (l_img_comp->sgnd) { | 
| 2641 |                 for (j = 0; j < l_nb_elem; ++j) { | 
| 2642 |                     *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++)); | 
| 2643 |                 } | 
| 2644 |             } else { | 
| 2645 |                 for (j = 0; j < l_nb_elem; ++j) { | 
| 2646 |                     *(l_dest_ptr++) = (*(l_src_ptr++)) & 0xffff; | 
| 2647 |                 } | 
| 2648 |             } | 
| 2649 |  | 
| 2650 |             p_src = (OPJ_BYTE*) l_src_ptr; | 
| 2651 |         } | 
| 2652 |         break; | 
| 2653 |         case 4: { | 
| 2654 |             OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_src; | 
| 2655 |             OPJ_INT32 * l_dest_ptr = l_tilec->data; | 
| 2656 |  | 
| 2657 |             for (j = 0; j < l_nb_elem; ++j) { | 
| 2658 |                 *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++)); | 
| 2659 |             } | 
| 2660 |  | 
| 2661 |             p_src = (OPJ_BYTE*) l_src_ptr; | 
| 2662 |         } | 
| 2663 |         break; | 
| 2664 |         } | 
| 2665 |  | 
| 2666 |         ++l_img_comp; | 
| 2667 |         ++l_tilec; | 
| 2668 |     } | 
| 2669 |  | 
| 2670 |     return OPJ_TRUE; | 
| 2671 | } | 
| 2672 |  | 
| 2673 | OPJ_BOOL opj_tcd_is_band_empty(opj_tcd_band_t* band) | 
| 2674 | { | 
| 2675 |     return (band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0); | 
| 2676 | } | 
| 2677 |  | 
| 2678 | OPJ_BOOL opj_tcd_is_subband_area_of_interest(opj_tcd_t *tcd, | 
| 2679 |         OPJ_UINT32 compno, | 
| 2680 |         OPJ_UINT32 resno, | 
| 2681 |         OPJ_UINT32 bandno, | 
| 2682 |         OPJ_UINT32 band_x0, | 
| 2683 |         OPJ_UINT32 band_y0, | 
| 2684 |         OPJ_UINT32 band_x1, | 
| 2685 |         OPJ_UINT32 band_y1) | 
| 2686 | { | 
| 2687 |     /* Note: those values for filter_margin are in part the result of */ | 
| 2688 |     /* experimentation. The value 2 for QMFBID=1 (5x3 filter) can be linked */ | 
| 2689 |     /* to the maximum left/right extension given in tables F.2 and F.3 of the */ | 
| 2690 |     /* standard. The value 3 for QMFBID=0 (9x7 filter) is more suspicious, */ | 
| 2691 |     /* since F.2 and F.3 would lead to 4 instead, so the current 3 might be */ | 
| 2692 |     /* needed to be bumped to 4, in case inconsistencies are found while */ | 
| 2693 |     /* decoding parts of irreversible coded images. */ | 
| 2694 |     /* See opj_dwt_decode_partial_53 and opj_dwt_decode_partial_97 as well */ | 
| 2695 |     OPJ_UINT32 filter_margin = (tcd->tcp->tccps[compno].qmfbid == 1) ? 2 : 3; | 
| 2696 |     opj_tcd_tilecomp_t *tilec = &(tcd->tcd_image->tiles->comps[compno]); | 
| 2697 |     opj_image_comp_t* image_comp = &(tcd->image->comps[compno]); | 
| 2698 |     /* Compute the intersection of the area of interest, expressed in tile coordinates */ | 
| 2699 |     /* with the tile coordinates */ | 
| 2700 |     OPJ_UINT32 tcx0 = opj_uint_max( | 
| 2701 |                           (OPJ_UINT32)tilec->x0, | 
| 2702 |                           opj_uint_ceildiv(tcd->win_x0, image_comp->dx)); | 
| 2703 |     OPJ_UINT32 tcy0 = opj_uint_max( | 
| 2704 |                           (OPJ_UINT32)tilec->y0, | 
| 2705 |                           opj_uint_ceildiv(tcd->win_y0, image_comp->dy)); | 
| 2706 |     OPJ_UINT32 tcx1 = opj_uint_min( | 
| 2707 |                           (OPJ_UINT32)tilec->x1, | 
| 2708 |                           opj_uint_ceildiv(tcd->win_x1, image_comp->dx)); | 
| 2709 |     OPJ_UINT32 tcy1 = opj_uint_min( | 
| 2710 |                           (OPJ_UINT32)tilec->y1, | 
| 2711 |                           opj_uint_ceildiv(tcd->win_y1, image_comp->dy)); | 
| 2712 |     /* Compute number of decomposition for this band. See table F-1 */ | 
| 2713 |     OPJ_UINT32 nb = (resno == 0) ? | 
| 2714 |                     tilec->numresolutions - 1 : | 
| 2715 |                     tilec->numresolutions - resno; | 
| 2716 |     /* Map above tile-based coordinates to sub-band-based coordinates per */ | 
| 2717 |     /* equation B-15 of the standard */ | 
| 2718 |     OPJ_UINT32 x0b = bandno & 1; | 
| 2719 |     OPJ_UINT32 y0b = bandno >> 1; | 
| 2720 |     OPJ_UINT32 tbx0 = (nb == 0) ? tcx0 : | 
| 2721 |                       (tcx0 <= (1U << (nb - 1)) * x0b) ? 0 : | 
| 2722 |                       opj_uint_ceildivpow2(tcx0 - (1U << (nb - 1)) * x0b, nb); | 
| 2723 |     OPJ_UINT32 tby0 = (nb == 0) ? tcy0 : | 
| 2724 |                       (tcy0 <= (1U << (nb - 1)) * y0b) ? 0 : | 
| 2725 |                       opj_uint_ceildivpow2(tcy0 - (1U << (nb - 1)) * y0b, nb); | 
| 2726 |     OPJ_UINT32 tbx1 = (nb == 0) ? tcx1 : | 
| 2727 |                       (tcx1 <= (1U << (nb - 1)) * x0b) ? 0 : | 
| 2728 |                       opj_uint_ceildivpow2(tcx1 - (1U << (nb - 1)) * x0b, nb); | 
| 2729 |     OPJ_UINT32 tby1 = (nb == 0) ? tcy1 : | 
| 2730 |                       (tcy1 <= (1U << (nb - 1)) * y0b) ? 0 : | 
| 2731 |                       opj_uint_ceildivpow2(tcy1 - (1U << (nb - 1)) * y0b, nb); | 
| 2732 |     OPJ_BOOL intersects; | 
| 2733 |  | 
| 2734 |     if (tbx0 < filter_margin) { | 
| 2735 |         tbx0 = 0; | 
| 2736 |     } else { | 
| 2737 |         tbx0 -= filter_margin; | 
| 2738 |     } | 
| 2739 |     if (tby0 < filter_margin) { | 
| 2740 |         tby0 = 0; | 
| 2741 |     } else { | 
| 2742 |         tby0 -= filter_margin; | 
| 2743 |     } | 
| 2744 |     tbx1 = opj_uint_adds(tbx1, filter_margin); | 
| 2745 |     tby1 = opj_uint_adds(tby1, filter_margin); | 
| 2746 |  | 
| 2747 |     intersects = band_x0 < tbx1 && band_y0 < tby1 && band_x1 > tbx0 && | 
| 2748 |                  band_y1 > tby0; | 
| 2749 |  | 
| 2750 | #ifdef DEBUG_VERBOSE | 
| 2751 |     printf("compno=%u resno=%u nb=%u bandno=%u x0b=%u y0b=%u band=%u,%u,%u,%u tb=%u,%u,%u,%u -> %u\n" , | 
| 2752 |            compno, resno, nb, bandno, x0b, y0b, | 
| 2753 |            band_x0, band_y0, band_x1, band_y1, | 
| 2754 |            tbx0, tby0, tbx1, tby1, intersects); | 
| 2755 | #endif | 
| 2756 |     return intersects; | 
| 2757 | } | 
| 2758 |  | 
| 2759 | /** Returns whether a tile componenent is fully decoded, taking into account | 
| 2760 |  * p_tcd->win_* members. | 
| 2761 |  * | 
| 2762 |  * @param p_tcd    TCD handle. | 
| 2763 |  * @param compno Component number | 
| 2764 |  * @return OPJ_TRUE whether the tile componenent is fully decoded | 
| 2765 |  */ | 
| 2766 | static OPJ_BOOL opj_tcd_is_whole_tilecomp_decoding(opj_tcd_t *p_tcd, | 
| 2767 |         OPJ_UINT32 compno) | 
| 2768 | { | 
| 2769 |     opj_tcd_tilecomp_t* tilec = &(p_tcd->tcd_image->tiles->comps[compno]); | 
| 2770 |     opj_image_comp_t* image_comp = &(p_tcd->image->comps[compno]); | 
| 2771 |     /* Compute the intersection of the area of interest, expressed in tile coordinates */ | 
| 2772 |     /* with the tile coordinates */ | 
| 2773 |     OPJ_UINT32 tcx0 = opj_uint_max( | 
| 2774 |                           (OPJ_UINT32)tilec->x0, | 
| 2775 |                           opj_uint_ceildiv(p_tcd->win_x0, image_comp->dx)); | 
| 2776 |     OPJ_UINT32 tcy0 = opj_uint_max( | 
| 2777 |                           (OPJ_UINT32)tilec->y0, | 
| 2778 |                           opj_uint_ceildiv(p_tcd->win_y0, image_comp->dy)); | 
| 2779 |     OPJ_UINT32 tcx1 = opj_uint_min( | 
| 2780 |                           (OPJ_UINT32)tilec->x1, | 
| 2781 |                           opj_uint_ceildiv(p_tcd->win_x1, image_comp->dx)); | 
| 2782 |     OPJ_UINT32 tcy1 = opj_uint_min( | 
| 2783 |                           (OPJ_UINT32)tilec->y1, | 
| 2784 |                           opj_uint_ceildiv(p_tcd->win_y1, image_comp->dy)); | 
| 2785 |  | 
| 2786 |     OPJ_UINT32 shift = tilec->numresolutions - tilec->minimum_num_resolutions; | 
| 2787 |     /* Tolerate small margin within the reduced resolution factor to consider if */ | 
| 2788 |     /* the whole tile path must be taken */ | 
| 2789 |     return (tcx0 >= (OPJ_UINT32)tilec->x0 && | 
| 2790 |             tcy0 >= (OPJ_UINT32)tilec->y0 && | 
| 2791 |             tcx1 <= (OPJ_UINT32)tilec->x1 && | 
| 2792 |             tcy1 <= (OPJ_UINT32)tilec->y1 && | 
| 2793 |             (shift >= 32 || | 
| 2794 |              (((tcx0 - (OPJ_UINT32)tilec->x0) >> shift) == 0 && | 
| 2795 |               ((tcy0 - (OPJ_UINT32)tilec->y0) >> shift) == 0 && | 
| 2796 |               (((OPJ_UINT32)tilec->x1 - tcx1) >> shift) == 0 && | 
| 2797 |               (((OPJ_UINT32)tilec->y1 - tcy1) >> shift) == 0))); | 
| 2798 | } | 
| 2799 |  |