Home | History | Annotate | Download | only in libopenjpeg20
      1 /*
      2  * The copyright in this software is being made available under the 2-clauses
      3  * BSD License, included below. This software may be subject to other third
      4  * party and contributor rights, including patent rights, and no such rights
      5  * are granted under this license.
      6  *
      7  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
      8  * Copyright (c) 2002-2014, Professor Benoit Macq
      9  * Copyright (c) 2001-2003, David Janssens
     10  * Copyright (c) 2002-2003, Yannick Verschueren
     11  * Copyright (c) 2003-2007, Francois-Olivier Devaux
     12  * Copyright (c) 2003-2014, Antonin Descampe
     13  * Copyright (c) 2005, Herve Drolon, FreeImage Team
     14  * Copyright (c) 2006-2007, Parvatha Elangovan
     15  * 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 (at) 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             if (l_tilec->x0 >= l_tilec->x1 || l_tilec->y0 >= l_tilec->y1) {
    822                 opj_event_msg(manager, EVT_ERROR, "Invalid tile data\n");
    823                 return OPJ_FALSE;
    824             }
    825 
    826             /* compute l_data_size with overflow check */
    827             OPJ_SIZE_T w = (OPJ_SIZE_T)(l_tilec->x1 - l_tilec->x0);
    828             OPJ_SIZE_T h = (OPJ_SIZE_T)(l_tilec->y1 - l_tilec->y0);
    829 
    830             /* issue 733, l_data_size == 0U, probably something wrong should be checked before getting here */
    831             if (h > 0 && w > SIZE_MAX / h) {
    832                 opj_event_msg(manager, EVT_ERROR, "Size of tile data exceeds system limits\n");
    833                 return OPJ_FALSE;
    834             }
    835             l_tile_data_size = w * h;
    836 
    837             if (SIZE_MAX / sizeof(OPJ_UINT32) < l_tile_data_size) {
    838                 opj_event_msg(manager, EVT_ERROR, "Size of tile data exceeds system limits\n");
    839                 return OPJ_FALSE;
    840             }
    841             l_tile_data_size = l_tile_data_size * sizeof(OPJ_UINT32);
    842 
    843             l_tilec->data_size_needed = l_tile_data_size;
    844         }
    845 
    846         l_data_size = l_tilec->numresolutions * (OPJ_UINT32)sizeof(
    847                           opj_tcd_resolution_t);
    848 
    849         opj_image_data_free(l_tilec->data_win);
    850         l_tilec->data_win = NULL;
    851         l_tilec->win_x0 = 0;
    852         l_tilec->win_y0 = 0;
    853         l_tilec->win_x1 = 0;
    854         l_tilec->win_y1 = 0;
    855 
    856         if (l_tilec->resolutions == 00) {
    857             l_tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(l_data_size);
    858             if (! l_tilec->resolutions) {
    859                 return OPJ_FALSE;
    860             }
    861             /*fprintf(stderr, "\tAllocate resolutions of tilec (opj_tcd_resolution_t): %d\n",l_data_size);*/
    862             l_tilec->resolutions_size = l_data_size;
    863             memset(l_tilec->resolutions, 0, l_data_size);
    864         } else if (l_data_size > l_tilec->resolutions_size) {
    865             opj_tcd_resolution_t* new_resolutions = (opj_tcd_resolution_t *) opj_realloc(
    866                     l_tilec->resolutions, l_data_size);
    867             if (! new_resolutions) {
    868                 opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile resolutions\n");
    869                 opj_free(l_tilec->resolutions);
    870                 l_tilec->resolutions = NULL;
    871                 l_tilec->resolutions_size = 0;
    872                 return OPJ_FALSE;
    873             }
    874             l_tilec->resolutions = new_resolutions;
    875             /*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->resolutions_size, l_data_size);*/
    876             memset(((OPJ_BYTE*) l_tilec->resolutions) + l_tilec->resolutions_size, 0,
    877                    l_data_size - l_tilec->resolutions_size);
    878             l_tilec->resolutions_size = l_data_size;
    879         }
    880 
    881         l_level_no = l_tilec->numresolutions;
    882         l_res = l_tilec->resolutions;
    883         l_step_size = l_tccp->stepsizes;
    884         if (l_tccp->qmfbid == 0) {
    885             l_gain_ptr = &opj_dwt_getgain_real;
    886         } else {
    887             l_gain_ptr  = &opj_dwt_getgain;
    888         }
    889         /*fprintf(stderr, "\tlevel_no=%d\n",l_level_no);*/
    890 
    891         for (resno = 0; resno < l_tilec->numresolutions; ++resno) {
    892             /*fprintf(stderr, "\t\tresno = %d/%d\n", resno, l_tilec->numresolutions);*/
    893             OPJ_INT32 tlcbgxstart, tlcbgystart /*, brcbgxend, brcbgyend*/;
    894             OPJ_UINT32 cbgwidthexpn, cbgheightexpn;
    895             OPJ_UINT32 cblkwidthexpn, cblkheightexpn;
    896 
    897             --l_level_no;
    898 
    899             /* border for each resolution level (global) */
    900             l_res->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);
    901             l_res->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);
    902             l_res->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);
    903             l_res->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);
    904 
    905             /*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);*/
    906             /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
    907             l_pdx = l_tccp->prcw[resno];
    908             l_pdy = l_tccp->prch[resno];
    909             /*fprintf(stderr, "\t\t\tpdx=%d, pdy=%d\n", l_pdx, l_pdy);*/
    910             /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
    911             l_tl_prc_x_start = opj_int_floordivpow2(l_res->x0, (OPJ_INT32)l_pdx) << l_pdx;
    912             l_tl_prc_y_start = opj_int_floordivpow2(l_res->y0, (OPJ_INT32)l_pdy) << l_pdy;
    913             l_br_prc_x_end = opj_int_ceildivpow2(l_res->x1, (OPJ_INT32)l_pdx) << l_pdx;
    914             l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy;
    915             /*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 );*/
    916 
    917             l_res->pw = (l_res->x0 == l_res->x1) ? 0U : (OPJ_UINT32)((
    918                             l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx);
    919             l_res->ph = (l_res->y0 == l_res->y1) ? 0U : (OPJ_UINT32)((
    920                             l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy);
    921             /*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/
    922 
    923             if ((l_res->pw != 0U) && ((((OPJ_UINT32) - 1) / l_res->pw) < l_res->ph)) {
    924                 opj_event_msg(manager, EVT_ERROR, "Size of tile data exceeds system limits\n");
    925                 return OPJ_FALSE;
    926             }
    927             l_nb_precincts = l_res->pw * l_res->ph;
    928 
    929             if ((((OPJ_UINT32) - 1) / (OPJ_UINT32)sizeof(opj_tcd_precinct_t)) <
    930                     l_nb_precincts) {
    931                 opj_event_msg(manager, EVT_ERROR, "Size of tile data exceeds system limits\n");
    932                 return OPJ_FALSE;
    933             }
    934             l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t);
    935 
    936             if (resno == 0) {
    937                 tlcbgxstart = l_tl_prc_x_start;
    938                 tlcbgystart = l_tl_prc_y_start;
    939                 /*brcbgxend = l_br_prc_x_end;*/
    940                 /* brcbgyend = l_br_prc_y_end;*/
    941                 cbgwidthexpn = l_pdx;
    942                 cbgheightexpn = l_pdy;
    943                 l_res->numbands = 1;
    944             } else {
    945                 tlcbgxstart = opj_int_ceildivpow2(l_tl_prc_x_start, 1);
    946                 tlcbgystart = opj_int_ceildivpow2(l_tl_prc_y_start, 1);
    947                 /*brcbgxend = opj_int_ceildivpow2(l_br_prc_x_end, 1);*/
    948                 /*brcbgyend = opj_int_ceildivpow2(l_br_prc_y_end, 1);*/
    949                 cbgwidthexpn = l_pdx - 1;
    950                 cbgheightexpn = l_pdy - 1;
    951                 l_res->numbands = 3;
    952             }
    953 
    954             cblkwidthexpn = opj_uint_min(l_tccp->cblkw, cbgwidthexpn);
    955             cblkheightexpn = opj_uint_min(l_tccp->cblkh, cbgheightexpn);
    956             l_band = l_res->bands;
    957 
    958             for (bandno = 0; bandno < l_res->numbands; ++bandno, ++l_band, ++l_step_size) {
    959                 OPJ_INT32 numbps;
    960                 /*fprintf(stderr, "\t\t\tband_no=%d/%d\n", bandno, l_res->numbands );*/
    961 
    962                 if (resno == 0) {
    963                     l_band->bandno = 0 ;
    964                     l_band->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);
    965                     l_band->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);
    966                     l_band->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);
    967                     l_band->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);
    968                 } else {
    969                     l_band->bandno = bandno + 1;
    970                     /* x0b = 1 if bandno = 1 or 3 */
    971                     l_x0b = l_band->bandno & 1;
    972                     /* y0b = 1 if bandno = 2 or 3 */
    973                     l_y0b = (OPJ_INT32)((l_band->bandno) >> 1);
    974                     /* l_band border (global) */
    975                     l_band->x0 = opj_int64_ceildivpow2(l_tilec->x0 - ((OPJ_INT64)l_x0b <<
    976                                                        l_level_no), (OPJ_INT32)(l_level_no + 1));
    977                     l_band->y0 = opj_int64_ceildivpow2(l_tilec->y0 - ((OPJ_INT64)l_y0b <<
    978                                                        l_level_no), (OPJ_INT32)(l_level_no + 1));
    979                     l_band->x1 = opj_int64_ceildivpow2(l_tilec->x1 - ((OPJ_INT64)l_x0b <<
    980                                                        l_level_no), (OPJ_INT32)(l_level_no + 1));
    981                     l_band->y1 = opj_int64_ceildivpow2(l_tilec->y1 - ((OPJ_INT64)l_y0b <<
    982                                                        l_level_no), (OPJ_INT32)(l_level_no + 1));
    983                 }
    984 
    985                 if (isEncoder) {
    986                     /* Skip empty bands */
    987                     if (opj_tcd_is_band_empty(l_band)) {
    988                         /* Do not zero l_band->precints to avoid leaks */
    989                         /* but make sure we don't use it later, since */
    990                         /* it will point to precincts of previous bands... */
    991                         continue;
    992                     }
    993                 }
    994 
    995                 /** avoid an if with storing function pointer */
    996                 l_gain = (*l_gain_ptr)(l_band->bandno);
    997                 numbps = (OPJ_INT32)(l_image_comp->prec + l_gain);
    998                 l_band->stepsize = (OPJ_FLOAT32)(((1.0 + l_step_size->mant / 2048.0) * pow(2.0,
    999                                                   (OPJ_INT32)(numbps - l_step_size->expn)))) * fraction;
   1000                 /* Mb value of Equation E-2 in "E.1 Inverse quantization
   1001                  * procedure" of the standard */
   1002                 l_band->numbps = l_step_size->expn + (OPJ_INT32)l_tccp->numgbits -
   1003                                  1;
   1004 
   1005                 if (!l_band->precincts && (l_nb_precincts > 0U)) {
   1006                     l_band->precincts = (opj_tcd_precinct_t *) opj_malloc(/*3 * */
   1007                                             l_nb_precinct_size);
   1008                     if (! l_band->precincts) {
   1009                         opj_event_msg(manager, EVT_ERROR,
   1010                                       "Not enough memory to handle band precints\n");
   1011                         return OPJ_FALSE;
   1012                     }
   1013                     /*fprintf(stderr, "\t\t\t\tAllocate precincts of a band (opj_tcd_precinct_t): %d\n",l_nb_precinct_size);     */
   1014                     memset(l_band->precincts, 0, l_nb_precinct_size);
   1015                     l_band->precincts_data_size = l_nb_precinct_size;
   1016                 } else if (l_band->precincts_data_size < l_nb_precinct_size) {
   1017 
   1018                     opj_tcd_precinct_t * new_precincts = (opj_tcd_precinct_t *) opj_realloc(
   1019                             l_band->precincts,/*3 * */ l_nb_precinct_size);
   1020                     if (! new_precincts) {
   1021                         opj_event_msg(manager, EVT_ERROR,
   1022                                       "Not enough memory to handle band precints\n");
   1023                         opj_free(l_band->precincts);
   1024                         l_band->precincts = NULL;
   1025                         l_band->precincts_data_size = 0;
   1026                         return OPJ_FALSE;
   1027                     }
   1028                     l_band->precincts = new_precincts;
   1029                     /*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);*/
   1030                     memset(((OPJ_BYTE *) l_band->precincts) + l_band->precincts_data_size, 0,
   1031                            l_nb_precinct_size - l_band->precincts_data_size);
   1032                     l_band->precincts_data_size = l_nb_precinct_size;
   1033                 }
   1034 
   1035                 l_current_precinct = l_band->precincts;
   1036                 for (precno = 0; precno < l_nb_precincts; ++precno) {
   1037                     OPJ_INT32 tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
   1038                     OPJ_INT32 cbgxstart = tlcbgxstart + (OPJ_INT32)(precno % l_res->pw) *
   1039                                           (1 << cbgwidthexpn);
   1040                     OPJ_INT32 cbgystart = tlcbgystart + (OPJ_INT32)(precno / l_res->pw) *
   1041                                           (1 << cbgheightexpn);
   1042                     OPJ_INT32 cbgxend = cbgxstart + (1 << cbgwidthexpn);
   1043                     OPJ_INT32 cbgyend = cbgystart + (1 << cbgheightexpn);
   1044                     /*fprintf(stderr, "\t precno=%d; bandno=%d, resno=%d; compno=%d\n", precno, bandno , resno, compno);*/
   1045                     /*fprintf(stderr, "\t tlcbgxstart(=%d) + (precno(=%d) percent res->pw(=%d)) * (1 << cbgwidthexpn(=%d)) \n",tlcbgxstart,precno,l_res->pw,cbgwidthexpn);*/
   1046 
   1047                     /* precinct size (global) */
   1048                     /*fprintf(stderr, "\t cbgxstart=%d, l_band->x0 = %d \n",cbgxstart, l_band->x0);*/
   1049 
   1050                     l_current_precinct->x0 = opj_int_max(cbgxstart, l_band->x0);
   1051                     l_current_precinct->y0 = opj_int_max(cbgystart, l_band->y0);
   1052                     l_current_precinct->x1 = opj_int_min(cbgxend, l_band->x1);
   1053                     l_current_precinct->y1 = opj_int_min(cbgyend, l_band->y1);
   1054                     /*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);*/
   1055 
   1056                     tlcblkxstart = opj_int_floordivpow2(l_current_precinct->x0,
   1057                                                         (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;
   1058                     /*fprintf(stderr, "\t tlcblkxstart =%d\n",tlcblkxstart );*/
   1059                     tlcblkystart = opj_int_floordivpow2(l_current_precinct->y0,
   1060                                                         (OPJ_INT32)cblkheightexpn) << cblkheightexpn;
   1061                     /*fprintf(stderr, "\t tlcblkystart =%d\n",tlcblkystart );*/
   1062                     brcblkxend = opj_int_ceildivpow2(l_current_precinct->x1,
   1063                                                      (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;
   1064                     /*fprintf(stderr, "\t brcblkxend =%d\n",brcblkxend );*/
   1065                     brcblkyend = opj_int_ceildivpow2(l_current_precinct->y1,
   1066                                                      (OPJ_INT32)cblkheightexpn) << cblkheightexpn;
   1067                     /*fprintf(stderr, "\t brcblkyend =%d\n",brcblkyend );*/
   1068                     l_current_precinct->cw = (OPJ_UINT32)((brcblkxend - tlcblkxstart) >>
   1069                                                           cblkwidthexpn);
   1070                     l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >>
   1071                                                           cblkheightexpn);
   1072                     if (l_current_precinct->cw && ((OPJ_UINT32)-1) / l_current_precinct->cw < l_current_precinct->ch) {
   1073                         return OPJ_FALSE;
   1074                     }
   1075                     l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch;
   1076                     /*fprintf(stderr, "\t\t\t\t precinct_cw = %d x recinct_ch = %d\n",l_current_precinct->cw, l_current_precinct->ch);      */
   1077 
   1078                     if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof_block < l_nb_code_blocks) {
   1079                         return OPJ_FALSE;
   1080                     }
   1081                     l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof_block;
   1082 
   1083                     if (!l_current_precinct->cblks.blocks && (l_nb_code_blocks > 0U)) {
   1084                         l_current_precinct->cblks.blocks = opj_malloc(l_nb_code_blocks_size);
   1085                         if (! l_current_precinct->cblks.blocks) {
   1086                             return OPJ_FALSE;
   1087                         }
   1088                         /*fprintf(stderr, "\t\t\t\tAllocate cblks of a precinct (opj_tcd_cblk_dec_t): %d\n",l_nb_code_blocks_size);*/
   1089 
   1090                         memset(l_current_precinct->cblks.blocks, 0, l_nb_code_blocks_size);
   1091 
   1092                         l_current_precinct->block_size = l_nb_code_blocks_size;
   1093                     } else if (l_nb_code_blocks_size > l_current_precinct->block_size) {
   1094                         void *new_blocks = opj_realloc(l_current_precinct->cblks.blocks,
   1095                                                        l_nb_code_blocks_size);
   1096                         if (! new_blocks) {
   1097                             opj_free(l_current_precinct->cblks.blocks);
   1098                             l_current_precinct->cblks.blocks = NULL;
   1099                             l_current_precinct->block_size = 0;
   1100                             opj_event_msg(manager, EVT_ERROR,
   1101                                           "Not enough memory for current precinct codeblock element\n");
   1102                             return OPJ_FALSE;
   1103                         }
   1104                         l_current_precinct->cblks.blocks = new_blocks;
   1105                         /*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);     */
   1106 
   1107                         memset(((OPJ_BYTE *) l_current_precinct->cblks.blocks) +
   1108                                l_current_precinct->block_size
   1109                                , 0
   1110                                , l_nb_code_blocks_size - l_current_precinct->block_size);
   1111 
   1112                         l_current_precinct->block_size = l_nb_code_blocks_size;
   1113                     }
   1114 
   1115                     if (! l_current_precinct->incltree) {
   1116                         l_current_precinct->incltree = opj_tgt_create(l_current_precinct->cw,
   1117                                                        l_current_precinct->ch, manager);
   1118                     } else {
   1119                         l_current_precinct->incltree = opj_tgt_init(l_current_precinct->incltree,
   1120                                                        l_current_precinct->cw, l_current_precinct->ch, manager);
   1121                     }
   1122 
   1123                     if (! l_current_precinct->imsbtree) {
   1124                         l_current_precinct->imsbtree = opj_tgt_create(l_current_precinct->cw,
   1125                                                        l_current_precinct->ch, manager);
   1126                     } else {
   1127                         l_current_precinct->imsbtree = opj_tgt_init(l_current_precinct->imsbtree,
   1128                                                        l_current_precinct->cw, l_current_precinct->ch, manager);
   1129                     }
   1130 
   1131                     for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
   1132                         OPJ_INT32 cblkxstart = tlcblkxstart + (OPJ_INT32)(cblkno %
   1133                                                l_current_precinct->cw) * (1 << cblkwidthexpn);
   1134                         OPJ_INT32 cblkystart = tlcblkystart + (OPJ_INT32)(cblkno /
   1135                                                l_current_precinct->cw) * (1 << cblkheightexpn);
   1136                         OPJ_INT32 cblkxend = cblkxstart + (1 << cblkwidthexpn);
   1137                         OPJ_INT32 cblkyend = cblkystart + (1 << cblkheightexpn);
   1138 
   1139                         if (isEncoder) {
   1140                             opj_tcd_cblk_enc_t* l_code_block = l_current_precinct->cblks.enc + cblkno;
   1141 
   1142                             if (! opj_tcd_code_block_enc_allocate(l_code_block)) {
   1143                                 return OPJ_FALSE;
   1144                             }
   1145                             /* code-block size (global) */
   1146                             l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0);
   1147                             l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0);
   1148                             l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1);
   1149                             l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1);
   1150 
   1151                             if (! opj_tcd_code_block_enc_allocate_data(l_code_block)) {
   1152                                 return OPJ_FALSE;
   1153                             }
   1154                         } else {
   1155                             opj_tcd_cblk_dec_t* l_code_block = l_current_precinct->cblks.dec + cblkno;
   1156 
   1157                             if (! opj_tcd_code_block_dec_allocate(l_code_block)) {
   1158                                 return OPJ_FALSE;
   1159                             }
   1160                             /* code-block size (global) */
   1161                             l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0);
   1162                             l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0);
   1163                             l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1);
   1164                             l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1);
   1165                         }
   1166                     }
   1167                     ++l_current_precinct;
   1168                 } /* precno */
   1169             } /* bandno */
   1170             ++l_res;
   1171         } /* resno */
   1172         ++l_tccp;
   1173         ++l_tilec;
   1174         ++l_image_comp;
   1175     } /* compno */
   1176     return OPJ_TRUE;
   1177 }
   1178 
   1179 OPJ_BOOL opj_tcd_init_encode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
   1180                                   opj_event_mgr_t* p_manager)
   1181 {
   1182     return opj_tcd_init_tile(p_tcd, p_tile_no, OPJ_TRUE, 1.0F,
   1183                              sizeof(opj_tcd_cblk_enc_t), p_manager);
   1184 }
   1185 
   1186 OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
   1187                                   opj_event_mgr_t* p_manager)
   1188 {
   1189     return opj_tcd_init_tile(p_tcd, p_tile_no, OPJ_FALSE, 0.5F,
   1190                              sizeof(opj_tcd_cblk_dec_t), p_manager);
   1191 }
   1192 
   1193 /**
   1194  * Allocates memory for an encoding code block (but not data memory).
   1195  */
   1196 static OPJ_BOOL opj_tcd_code_block_enc_allocate(opj_tcd_cblk_enc_t *
   1197         p_code_block)
   1198 {
   1199     if (! p_code_block->layers) {
   1200         /* no memset since data */
   1201         p_code_block->layers = (opj_tcd_layer_t*) opj_calloc(100,
   1202                                sizeof(opj_tcd_layer_t));
   1203         if (! p_code_block->layers) {
   1204             return OPJ_FALSE;
   1205         }
   1206     }
   1207     if (! p_code_block->passes) {
   1208         p_code_block->passes = (opj_tcd_pass_t*) opj_calloc(100,
   1209                                sizeof(opj_tcd_pass_t));
   1210         if (! p_code_block->passes) {
   1211             return OPJ_FALSE;
   1212         }
   1213     }
   1214     return OPJ_TRUE;
   1215 }
   1216 
   1217 /**
   1218  * Allocates data memory for an encoding code block.
   1219  */
   1220 static OPJ_BOOL opj_tcd_code_block_enc_allocate_data(opj_tcd_cblk_enc_t *
   1221         p_code_block)
   1222 {
   1223     OPJ_UINT32 l_data_size;
   1224 
   1225     /* +1 is needed for https://github.com/uclouvain/openjpeg/issues/835 */
   1226     /* and actually +2 required for https://github.com/uclouvain/openjpeg/issues/982 */
   1227     /* TODO: is there a theoretical upper-bound for the compressed code */
   1228     /* block size ? */
   1229     l_data_size = 2 + (OPJ_UINT32)((p_code_block->x1 - p_code_block->x0) *
   1230                                    (p_code_block->y1 - p_code_block->y0) * (OPJ_INT32)sizeof(OPJ_UINT32));
   1231 
   1232     if (l_data_size > p_code_block->data_size) {
   1233         if (p_code_block->data) {
   1234             /* We refer to data - 1 since below we incremented it */
   1235             opj_free(p_code_block->data - 1);
   1236         }
   1237         p_code_block->data = (OPJ_BYTE*) opj_malloc(l_data_size + 1);
   1238         if (! p_code_block->data) {
   1239             p_code_block->data_size = 0U;
   1240             return OPJ_FALSE;
   1241         }
   1242         p_code_block->data_size = l_data_size;
   1243 
   1244         /* We reserve the initial byte as a fake byte to a non-FF value */
   1245         /* and increment the data pointer, so that opj_mqc_init_enc() */
   1246         /* can do bp = data - 1, and opj_mqc_byteout() can safely dereference */
   1247         /* it. */
   1248         p_code_block->data[0] = 0;
   1249         p_code_block->data += 1; /*why +1 ?*/
   1250     }
   1251     return OPJ_TRUE;
   1252 }
   1253 
   1254 
   1255 void opj_tcd_reinit_segment(opj_tcd_seg_t* seg)
   1256 {
   1257     memset(seg, 0, sizeof(opj_tcd_seg_t));
   1258 }
   1259 
   1260 /**
   1261  * Allocates memory for a decoding code block.
   1262  */
   1263 static OPJ_BOOL opj_tcd_code_block_dec_allocate(opj_tcd_cblk_dec_t *
   1264         p_code_block)
   1265 {
   1266     if (! p_code_block->segs) {
   1267 
   1268         p_code_block->segs = (opj_tcd_seg_t *) opj_calloc(OPJ_J2K_DEFAULT_NB_SEGS,
   1269                              sizeof(opj_tcd_seg_t));
   1270         if (! p_code_block->segs) {
   1271             return OPJ_FALSE;
   1272         }
   1273         /*fprintf(stderr, "Allocate %d elements of code_block->data\n", OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));*/
   1274 
   1275         p_code_block->m_current_max_segs = OPJ_J2K_DEFAULT_NB_SEGS;
   1276         /*fprintf(stderr, "m_current_max_segs of code_block->data = %d\n", p_code_block->m_current_max_segs);*/
   1277     } else {
   1278         /* sanitize */
   1279         opj_tcd_seg_t * l_segs = p_code_block->segs;
   1280         OPJ_UINT32 l_current_max_segs = p_code_block->m_current_max_segs;
   1281         opj_tcd_seg_data_chunk_t* l_chunks = p_code_block->chunks;
   1282         OPJ_UINT32 l_numchunksalloc = p_code_block->numchunksalloc;
   1283         OPJ_UINT32 i;
   1284 
   1285         opj_aligned_free(p_code_block->decoded_data);
   1286         p_code_block->decoded_data = 00;
   1287 
   1288         memset(p_code_block, 0, sizeof(opj_tcd_cblk_dec_t));
   1289         p_code_block->segs = l_segs;
   1290         p_code_block->m_current_max_segs = l_current_max_segs;
   1291         for (i = 0; i < l_current_max_segs; ++i) {
   1292             opj_tcd_reinit_segment(&l_segs[i]);
   1293         }
   1294         p_code_block->chunks = l_chunks;
   1295         p_code_block->numchunksalloc = l_numchunksalloc;
   1296     }
   1297 
   1298     return OPJ_TRUE;
   1299 }
   1300 
   1301 OPJ_UINT32 opj_tcd_get_decoded_tile_size(opj_tcd_t *p_tcd,
   1302         OPJ_BOOL take_into_account_partial_decoding)
   1303 {
   1304     OPJ_UINT32 i;
   1305     OPJ_UINT32 l_data_size = 0;
   1306     opj_image_comp_t * l_img_comp = 00;
   1307     opj_tcd_tilecomp_t * l_tile_comp = 00;
   1308     opj_tcd_resolution_t * l_res = 00;
   1309     OPJ_UINT32 l_size_comp, l_remaining;
   1310     OPJ_UINT32 l_temp;
   1311 
   1312     l_tile_comp = p_tcd->tcd_image->tiles->comps;
   1313     l_img_comp = p_tcd->image->comps;
   1314 
   1315     for (i = 0; i < p_tcd->image->numcomps; ++i) {
   1316         OPJ_UINT32 w, h;
   1317         l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
   1318         l_remaining = l_img_comp->prec & 7;  /* (%8) */
   1319 
   1320         if (l_remaining) {
   1321             ++l_size_comp;
   1322         }
   1323 
   1324         if (l_size_comp == 3) {
   1325             l_size_comp = 4;
   1326         }
   1327 
   1328         l_res = l_tile_comp->resolutions + l_tile_comp->minimum_num_resolutions - 1;
   1329         if (take_into_account_partial_decoding && !p_tcd->whole_tile_decoding) {
   1330             w = l_res->win_x1 - l_res->win_x0;
   1331             h = l_res->win_y1 - l_res->win_y0;
   1332         } else {
   1333             w = (OPJ_UINT32)(l_res->x1 - l_res->x0);
   1334             h = (OPJ_UINT32)(l_res->y1 - l_res->y0);
   1335         }
   1336         if (h > 0 && UINT_MAX / w < h) {
   1337             return UINT_MAX;
   1338         }
   1339         l_temp = w * h;
   1340         if (l_size_comp && UINT_MAX / l_size_comp < l_temp) {
   1341             return UINT_MAX;
   1342         }
   1343         l_temp *= l_size_comp;
   1344 
   1345         if (l_temp > UINT_MAX - l_data_size) {
   1346             return UINT_MAX;
   1347         }
   1348         l_data_size += l_temp;
   1349         ++l_img_comp;
   1350         ++l_tile_comp;
   1351     }
   1352 
   1353     return l_data_size;
   1354 }
   1355 
   1356 OPJ_BOOL opj_tcd_encode_tile(opj_tcd_t *p_tcd,
   1357                              OPJ_UINT32 p_tile_no,
   1358                              OPJ_BYTE *p_dest,
   1359                              OPJ_UINT32 * p_data_written,
   1360                              OPJ_UINT32 p_max_length,
   1361                              opj_codestream_info_t *p_cstr_info,
   1362                              opj_event_mgr_t *p_manager)
   1363 {
   1364 
   1365     if (p_tcd->cur_tp_num == 0) {
   1366 
   1367         p_tcd->tcd_tileno = p_tile_no;
   1368         p_tcd->tcp = &p_tcd->cp->tcps[p_tile_no];
   1369 
   1370         /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
   1371         if (p_cstr_info)  {
   1372             OPJ_UINT32 l_num_packs = 0;
   1373             OPJ_UINT32 i;
   1374             opj_tcd_tilecomp_t *l_tilec_idx =
   1375                 &p_tcd->tcd_image->tiles->comps[0];        /* based on component 0 */
   1376             opj_tccp_t *l_tccp = p_tcd->tcp->tccps; /* based on component 0 */
   1377 
   1378             for (i = 0; i < l_tilec_idx->numresolutions; i++) {
   1379                 opj_tcd_resolution_t *l_res_idx = &l_tilec_idx->resolutions[i];
   1380 
   1381                 p_cstr_info->tile[p_tile_no].pw[i] = (int)l_res_idx->pw;
   1382                 p_cstr_info->tile[p_tile_no].ph[i] = (int)l_res_idx->ph;
   1383 
   1384                 l_num_packs += l_res_idx->pw * l_res_idx->ph;
   1385                 p_cstr_info->tile[p_tile_no].pdx[i] = (int)l_tccp->prcw[i];
   1386                 p_cstr_info->tile[p_tile_no].pdy[i] = (int)l_tccp->prch[i];
   1387             }
   1388             p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t*) opj_calloc((
   1389                     OPJ_SIZE_T)p_cstr_info->numcomps * (OPJ_SIZE_T)p_cstr_info->numlayers *
   1390                                                   l_num_packs,
   1391                                                   sizeof(opj_packet_info_t));
   1392             if (!p_cstr_info->tile[p_tile_no].packet) {
   1393                 /* FIXME event manager error callback */
   1394                 return OPJ_FALSE;
   1395             }
   1396         }
   1397         /* << INDEX */
   1398 
   1399         /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
   1400         /*---------------TILE-------------------*/
   1401         if (! opj_tcd_dc_level_shift_encode(p_tcd)) {
   1402             return OPJ_FALSE;
   1403         }
   1404         /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
   1405 
   1406         /* FIXME _ProfStart(PGROUP_MCT); */
   1407         if (! opj_tcd_mct_encode(p_tcd)) {
   1408             return OPJ_FALSE;
   1409         }
   1410         /* FIXME _ProfStop(PGROUP_MCT); */
   1411 
   1412         /* FIXME _ProfStart(PGROUP_DWT); */
   1413         if (! opj_tcd_dwt_encode(p_tcd)) {
   1414             return OPJ_FALSE;
   1415         }
   1416         /* FIXME  _ProfStop(PGROUP_DWT); */
   1417 
   1418         /* FIXME  _ProfStart(PGROUP_T1); */
   1419         if (! opj_tcd_t1_encode(p_tcd)) {
   1420             return OPJ_FALSE;
   1421         }
   1422         /* FIXME _ProfStop(PGROUP_T1); */
   1423 
   1424         /* FIXME _ProfStart(PGROUP_RATE); */
   1425         if (! opj_tcd_rate_allocate_encode(p_tcd, p_dest, p_max_length,
   1426                                            p_cstr_info, p_manager)) {
   1427             return OPJ_FALSE;
   1428         }
   1429         /* FIXME _ProfStop(PGROUP_RATE); */
   1430 
   1431     }
   1432     /*--------------TIER2------------------*/
   1433 
   1434     /* INDEX */
   1435     if (p_cstr_info) {
   1436         p_cstr_info->index_write = 1;
   1437     }
   1438     /* FIXME _ProfStart(PGROUP_T2); */
   1439 
   1440     if (! opj_tcd_t2_encode(p_tcd, p_dest, p_data_written, p_max_length,
   1441                             p_cstr_info, p_manager)) {
   1442         return OPJ_FALSE;
   1443     }
   1444     /* FIXME _ProfStop(PGROUP_T2); */
   1445 
   1446     /*---------------CLEAN-------------------*/
   1447 
   1448     return OPJ_TRUE;
   1449 }
   1450 
   1451 OPJ_BOOL opj_tcd_decode_tile(opj_tcd_t *p_tcd,
   1452                              OPJ_UINT32 win_x0,
   1453                              OPJ_UINT32 win_y0,
   1454                              OPJ_UINT32 win_x1,
   1455                              OPJ_UINT32 win_y1,
   1456                              OPJ_UINT32 numcomps_to_decode,
   1457                              const OPJ_UINT32 *comps_indices,
   1458                              OPJ_BYTE *p_src,
   1459                              OPJ_UINT32 p_max_length,
   1460                              OPJ_UINT32 p_tile_no,
   1461                              opj_codestream_index_t *p_cstr_index,
   1462                              opj_event_mgr_t *p_manager
   1463                             )
   1464 {
   1465     OPJ_UINT32 l_data_read;
   1466     OPJ_UINT32 compno;
   1467 
   1468     p_tcd->tcd_tileno = p_tile_no;
   1469     p_tcd->tcp = &(p_tcd->cp->tcps[p_tile_no]);
   1470     p_tcd->win_x0 = win_x0;
   1471     p_tcd->win_y0 = win_y0;
   1472     p_tcd->win_x1 = win_x1;
   1473     p_tcd->win_y1 = win_y1;
   1474     p_tcd->whole_tile_decoding = OPJ_TRUE;
   1475 
   1476     opj_free(p_tcd->used_component);
   1477     p_tcd->used_component = NULL;
   1478 
   1479     if (numcomps_to_decode) {
   1480         OPJ_BOOL* used_component = (OPJ_BOOL*) opj_calloc(sizeof(OPJ_BOOL),
   1481                                    p_tcd->image->numcomps);
   1482         if (used_component == NULL) {
   1483             return OPJ_FALSE;
   1484         }
   1485         for (compno = 0; compno < numcomps_to_decode; compno++) {
   1486             used_component[ comps_indices[compno] ] = OPJ_TRUE;
   1487         }
   1488 
   1489         p_tcd->used_component = used_component;
   1490     }
   1491 
   1492     for (compno = 0; compno < p_tcd->image->numcomps; compno++) {
   1493         if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) {
   1494             continue;
   1495         }
   1496 
   1497         if (!opj_tcd_is_whole_tilecomp_decoding(p_tcd, compno)) {
   1498             p_tcd->whole_tile_decoding = OPJ_FALSE;
   1499             break;
   1500         }
   1501     }
   1502 
   1503     if (p_tcd->whole_tile_decoding) {
   1504         for (compno = 0; compno < p_tcd->image->numcomps; compno++) {
   1505             opj_tcd_tilecomp_t* tilec = &(p_tcd->tcd_image->tiles->comps[compno]);
   1506             opj_tcd_resolution_t *l_res = &
   1507                                           (tilec->resolutions[tilec->minimum_num_resolutions - 1]);
   1508             OPJ_SIZE_T l_data_size;
   1509 
   1510             /* compute l_data_size with overflow check */
   1511             OPJ_SIZE_T res_w = (OPJ_SIZE_T)(l_res->x1 - l_res->x0);
   1512             OPJ_SIZE_T res_h = (OPJ_SIZE_T)(l_res->y1 - l_res->y0);
   1513 
   1514             if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) {
   1515                 continue;
   1516             }
   1517 
   1518             /* issue 733, l_data_size == 0U, probably something wrong should be checked before getting here */
   1519             if (res_h > 0 && res_w > SIZE_MAX / res_h) {
   1520                 opj_event_msg(p_manager, EVT_ERROR,
   1521                               "Size of tile data exceeds system limits\n");
   1522                 return OPJ_FALSE;
   1523             }
   1524             l_data_size = res_w * res_h;
   1525 
   1526             if (SIZE_MAX / sizeof(OPJ_UINT32) < l_data_size) {
   1527                 opj_event_msg(p_manager, EVT_ERROR,
   1528                               "Size of tile data exceeds system limits\n");
   1529                 return OPJ_FALSE;
   1530             }
   1531             l_data_size *= sizeof(OPJ_UINT32);
   1532 
   1533             tilec->data_size_needed = l_data_size;
   1534 
   1535             if (!opj_alloc_tile_component_data(tilec)) {
   1536                 opj_event_msg(p_manager, EVT_ERROR,
   1537                               "Size of tile data exceeds system limits\n");
   1538                 return OPJ_FALSE;
   1539             }
   1540         }
   1541     } else {
   1542         /* Compute restricted tile-component and tile-resolution coordinates */
   1543         /* of the window of interest, but defer the memory allocation until */
   1544         /* we know the resno_decoded */
   1545         for (compno = 0; compno < p_tcd->image->numcomps; compno++) {
   1546             OPJ_UINT32 resno;
   1547             opj_tcd_tilecomp_t* tilec = &(p_tcd->tcd_image->tiles->comps[compno]);
   1548             opj_image_comp_t* image_comp = &(p_tcd->image->comps[compno]);
   1549 
   1550             if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) {
   1551                 continue;
   1552             }
   1553 
   1554             /* Compute the intersection of the area of interest, expressed in tile coordinates */
   1555             /* with the tile coordinates */
   1556             tilec->win_x0 = opj_uint_max(
   1557                                 (OPJ_UINT32)tilec->x0,
   1558                                 opj_uint_ceildiv(p_tcd->win_x0, image_comp->dx));
   1559             tilec->win_y0 = opj_uint_max(
   1560                                 (OPJ_UINT32)tilec->y0,
   1561                                 opj_uint_ceildiv(p_tcd->win_y0, image_comp->dy));
   1562             tilec->win_x1 = opj_uint_min(
   1563                                 (OPJ_UINT32)tilec->x1,
   1564                                 opj_uint_ceildiv(p_tcd->win_x1, image_comp->dx));
   1565             tilec->win_y1 = opj_uint_min(
   1566                                 (OPJ_UINT32)tilec->y1,
   1567                                 opj_uint_ceildiv(p_tcd->win_y1, image_comp->dy));
   1568             if (tilec->win_x1 < tilec->win_x0 ||
   1569                     tilec->win_y1 < tilec->win_y0) {
   1570                 /* We should not normally go there. The circumstance is when */
   1571                 /* the tile coordinates do not intersect the area of interest */
   1572                 /* Upper level logic should not even try to decode that tile */
   1573                 opj_event_msg(p_manager, EVT_ERROR,
   1574                               "Invalid tilec->win_xxx values\n");
   1575                 return OPJ_FALSE;
   1576             }
   1577 
   1578             for (resno = 0; resno < tilec->numresolutions; ++resno) {
   1579                 opj_tcd_resolution_t *res = tilec->resolutions + resno;
   1580                 res->win_x0 = opj_uint_ceildivpow2(tilec->win_x0,
   1581                                                    tilec->numresolutions - 1 - resno);
   1582                 res->win_y0 = opj_uint_ceildivpow2(tilec->win_y0,
   1583                                                    tilec->numresolutions - 1 - resno);
   1584                 res->win_x1 = opj_uint_ceildivpow2(tilec->win_x1,
   1585                                                    tilec->numresolutions - 1 - resno);
   1586                 res->win_y1 = opj_uint_ceildivpow2(tilec->win_y1,
   1587                                                    tilec->numresolutions - 1 - resno);
   1588             }
   1589         }
   1590     }
   1591 
   1592 #ifdef TODO_MSD /* FIXME */
   1593     /* INDEX >>  */
   1594     if (p_cstr_info) {
   1595         OPJ_UINT32 resno, compno, numprec = 0;
   1596         for (compno = 0; compno < (OPJ_UINT32) p_cstr_info->numcomps; compno++) {
   1597             opj_tcp_t *tcp = &p_tcd->cp->tcps[0];
   1598             opj_tccp_t *tccp = &tcp->tccps[compno];
   1599             opj_tcd_tilecomp_t *tilec_idx = &p_tcd->tcd_image->tiles->comps[compno];
   1600             for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
   1601                 opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
   1602                 p_cstr_info->tile[p_tile_no].pw[resno] = res_idx->pw;
   1603                 p_cstr_info->tile[p_tile_no].ph[resno] = res_idx->ph;
   1604                 numprec += res_idx->pw * res_idx->ph;
   1605                 p_cstr_info->tile[p_tile_no].pdx[resno] = tccp->prcw[resno];
   1606                 p_cstr_info->tile[p_tile_no].pdy[resno] = tccp->prch[resno];
   1607             }
   1608         }
   1609         p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t *) opj_malloc(
   1610                 p_cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
   1611         p_cstr_info->packno = 0;
   1612     }
   1613     /* << INDEX */
   1614 #endif
   1615 
   1616     /*--------------TIER2------------------*/
   1617     /* FIXME _ProfStart(PGROUP_T2); */
   1618     l_data_read = 0;
   1619     if (! opj_tcd_t2_decode(p_tcd, p_src, &l_data_read, p_max_length, p_cstr_index,
   1620                             p_manager)) {
   1621         return OPJ_FALSE;
   1622     }
   1623     /* FIXME _ProfStop(PGROUP_T2); */
   1624 
   1625     /*------------------TIER1-----------------*/
   1626 
   1627     /* FIXME _ProfStart(PGROUP_T1); */
   1628     if (! opj_tcd_t1_decode(p_tcd, p_manager)) {
   1629         return OPJ_FALSE;
   1630     }
   1631     /* FIXME _ProfStop(PGROUP_T1); */
   1632 
   1633 
   1634     /* For subtile decoding, now we know the resno_decoded, we can allocate */
   1635     /* the tile data buffer */
   1636     if (!p_tcd->whole_tile_decoding) {
   1637         for (compno = 0; compno < p_tcd->image->numcomps; compno++) {
   1638             opj_tcd_tilecomp_t* tilec = &(p_tcd->tcd_image->tiles->comps[compno]);
   1639             opj_image_comp_t* image_comp = &(p_tcd->image->comps[compno]);
   1640             opj_tcd_resolution_t *res = tilec->resolutions + image_comp->resno_decoded;
   1641             OPJ_SIZE_T w = res->win_x1 - res->win_x0;
   1642             OPJ_SIZE_T h = res->win_y1 - res->win_y0;
   1643             OPJ_SIZE_T l_data_size;
   1644 
   1645             opj_image_data_free(tilec->data_win);
   1646             tilec->data_win = NULL;
   1647 
   1648             if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) {
   1649                 continue;
   1650             }
   1651 
   1652             if (w > 0 && h > 0) {
   1653                 if (w > SIZE_MAX / h) {
   1654                     opj_event_msg(p_manager, EVT_ERROR,
   1655                                   "Size of tile data exceeds system limits\n");
   1656                     return OPJ_FALSE;
   1657                 }
   1658                 l_data_size = w * h;
   1659                 if (l_data_size > SIZE_MAX / sizeof(OPJ_INT32)) {
   1660                     opj_event_msg(p_manager, EVT_ERROR,
   1661                                   "Size of tile data exceeds system limits\n");
   1662                     return OPJ_FALSE;
   1663                 }
   1664                 l_data_size *= sizeof(OPJ_INT32);
   1665 
   1666                 tilec->data_win = (OPJ_INT32*) opj_image_data_alloc(l_data_size);
   1667                 if (tilec->data_win == NULL) {
   1668                     opj_event_msg(p_manager, EVT_ERROR,
   1669                                   "Size of tile data exceeds system limits\n");
   1670                     return OPJ_FALSE;
   1671                 }
   1672             }
   1673         }
   1674     }
   1675 
   1676     /*----------------DWT---------------------*/
   1677 
   1678     /* FIXME _ProfStart(PGROUP_DWT); */
   1679     if
   1680     (! opj_tcd_dwt_decode(p_tcd)) {
   1681         return OPJ_FALSE;
   1682     }
   1683     /* FIXME _ProfStop(PGROUP_DWT); */
   1684 
   1685     /*----------------MCT-------------------*/
   1686     /* FIXME _ProfStart(PGROUP_MCT); */
   1687     if
   1688     (! opj_tcd_mct_decode(p_tcd, p_manager)) {
   1689         return OPJ_FALSE;
   1690     }
   1691     /* FIXME _ProfStop(PGROUP_MCT); */
   1692 
   1693     /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
   1694     if
   1695     (! opj_tcd_dc_level_shift_decode(p_tcd)) {
   1696         return OPJ_FALSE;
   1697     }
   1698     /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
   1699 
   1700 
   1701     /*---------------TILE-------------------*/
   1702     return OPJ_TRUE;
   1703 }
   1704 
   1705 OPJ_BOOL opj_tcd_update_tile_data(opj_tcd_t *p_tcd,
   1706                                   OPJ_BYTE * p_dest,
   1707                                   OPJ_UINT32 p_dest_length
   1708                                  )
   1709 {
   1710     OPJ_UINT32 i, j, k, l_data_size = 0;
   1711     opj_image_comp_t * l_img_comp = 00;
   1712     opj_tcd_tilecomp_t * l_tilec = 00;
   1713     opj_tcd_resolution_t * l_res;
   1714     OPJ_UINT32 l_size_comp, l_remaining;
   1715     OPJ_UINT32 l_stride, l_width, l_height;
   1716 
   1717     l_data_size = opj_tcd_get_decoded_tile_size(p_tcd, OPJ_TRUE);
   1718     if (l_data_size == UINT_MAX || l_data_size > p_dest_length) {
   1719         return OPJ_FALSE;
   1720     }
   1721 
   1722     l_tilec = p_tcd->tcd_image->tiles->comps;
   1723     l_img_comp = p_tcd->image->comps;
   1724 
   1725     for (i = 0; i < p_tcd->image->numcomps; ++i) {
   1726         const OPJ_INT32* l_src_data;
   1727         l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
   1728         l_remaining = l_img_comp->prec & 7;  /* (%8) */
   1729         l_res = l_tilec->resolutions + l_img_comp->resno_decoded;
   1730         if (p_tcd->whole_tile_decoding) {
   1731             l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
   1732             l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
   1733             l_stride = (OPJ_UINT32)(l_tilec->resolutions[l_tilec->minimum_num_resolutions -
   1734                                                                      1].x1 -
   1735                                     l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x0) - l_width;
   1736             l_src_data = l_tilec->data;
   1737         } else {
   1738             l_width = l_res->win_x1 - l_res->win_x0;
   1739             l_height = l_res->win_y1 - l_res->win_y0;
   1740             l_stride = 0;
   1741             l_src_data = l_tilec->data_win;
   1742         }
   1743 
   1744         if (l_remaining) {
   1745             ++l_size_comp;
   1746         }
   1747 
   1748         if (l_size_comp == 3) {
   1749             l_size_comp = 4;
   1750         }
   1751 
   1752         switch (l_size_comp) {
   1753         case 1: {
   1754             OPJ_CHAR * l_dest_ptr = (OPJ_CHAR *) p_dest;
   1755             const OPJ_INT32 * l_src_ptr = l_src_data;
   1756 
   1757             if (l_img_comp->sgnd) {
   1758                 for (j = 0; j < l_height; ++j) {
   1759                     for (k = 0; k < l_width; ++k) {
   1760                         *(l_dest_ptr++) = (OPJ_CHAR)(*(l_src_ptr++));
   1761                     }
   1762                     l_src_ptr += l_stride;
   1763                 }
   1764             } else {
   1765                 for (j = 0; j < l_height; ++j) {
   1766                     for (k = 0; k < l_width; ++k) {
   1767                         *(l_dest_ptr++) = (OPJ_CHAR)((*(l_src_ptr++)) & 0xff);
   1768                     }
   1769                     l_src_ptr += l_stride;
   1770                 }
   1771             }
   1772 
   1773             p_dest = (OPJ_BYTE *)l_dest_ptr;
   1774         }
   1775         break;
   1776         case 2: {
   1777             const OPJ_INT32 * l_src_ptr = l_src_data;
   1778             OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_dest;
   1779 
   1780             if (l_img_comp->sgnd) {
   1781                 for (j = 0; j < l_height; ++j) {
   1782                     for (k = 0; k < l_width; ++k) {
   1783                         OPJ_INT16 val = (OPJ_INT16)(*(l_src_ptr++));
   1784                         memcpy(l_dest_ptr, &val, sizeof(val));
   1785                         l_dest_ptr ++;
   1786                     }
   1787                     l_src_ptr += l_stride;
   1788                 }
   1789             } else {
   1790                 for (j = 0; j < l_height; ++j) {
   1791                     for (k = 0; k < l_width; ++k) {
   1792                         OPJ_INT16 val = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
   1793                         memcpy(l_dest_ptr, &val, sizeof(val));
   1794                         l_dest_ptr ++;
   1795                     }
   1796                     l_src_ptr += l_stride;
   1797                 }
   1798             }
   1799 
   1800             p_dest = (OPJ_BYTE*) l_dest_ptr;
   1801         }
   1802         break;
   1803         case 4: {
   1804             OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_dest;
   1805             const OPJ_INT32 * l_src_ptr = l_src_data;
   1806 
   1807             for (j = 0; j < l_height; ++j) {
   1808                 memcpy(l_dest_ptr, l_src_ptr, l_width * sizeof(OPJ_INT32));
   1809                 l_dest_ptr += l_width;
   1810                 l_src_ptr += l_width + l_stride;
   1811             }
   1812 
   1813             p_dest = (OPJ_BYTE*) l_dest_ptr;
   1814         }
   1815         break;
   1816         }
   1817 
   1818         ++l_img_comp;
   1819         ++l_tilec;
   1820     }
   1821 
   1822     return OPJ_TRUE;
   1823 }
   1824 
   1825 
   1826 
   1827 
   1828 static void opj_tcd_free_tile(opj_tcd_t *p_tcd)
   1829 {
   1830     OPJ_UINT32 compno, resno, bandno, precno;
   1831     opj_tcd_tile_t *l_tile = 00;
   1832     opj_tcd_tilecomp_t *l_tile_comp = 00;
   1833     opj_tcd_resolution_t *l_res = 00;
   1834     opj_tcd_band_t *l_band = 00;
   1835     opj_tcd_precinct_t *l_precinct = 00;
   1836     OPJ_UINT32 l_nb_resolutions, l_nb_precincts;
   1837     void (* l_tcd_code_block_deallocate)(opj_tcd_precinct_t *) = 00;
   1838 
   1839     if (! p_tcd) {
   1840         return;
   1841     }
   1842 
   1843     if (! p_tcd->tcd_image) {
   1844         return;
   1845     }
   1846 
   1847     if (p_tcd->m_is_decoder) {
   1848         l_tcd_code_block_deallocate = opj_tcd_code_block_dec_deallocate;
   1849     } else {
   1850         l_tcd_code_block_deallocate = opj_tcd_code_block_enc_deallocate;
   1851     }
   1852 
   1853     l_tile = p_tcd->tcd_image->tiles;
   1854     if (! l_tile) {
   1855         return;
   1856     }
   1857 
   1858     l_tile_comp = l_tile->comps;
   1859 
   1860     for (compno = 0; compno < l_tile->numcomps; ++compno) {
   1861         l_res = l_tile_comp->resolutions;
   1862         if (l_res) {
   1863 
   1864             l_nb_resolutions = l_tile_comp->resolutions_size / (OPJ_UINT32)sizeof(
   1865                                    opj_tcd_resolution_t);
   1866             for (resno = 0; resno < l_nb_resolutions; ++resno) {
   1867                 l_band = l_res->bands;
   1868                 for (bandno = 0; bandno < 3; ++bandno) {
   1869                     l_precinct = l_band->precincts;
   1870                     if (l_precinct) {
   1871 
   1872                         l_nb_precincts = l_band->precincts_data_size / (OPJ_UINT32)sizeof(
   1873                                              opj_tcd_precinct_t);
   1874                         for (precno = 0; precno < l_nb_precincts; ++precno) {
   1875                             opj_tgt_destroy(l_precinct->incltree);
   1876                             l_precinct->incltree = 00;
   1877                             opj_tgt_destroy(l_precinct->imsbtree);
   1878                             l_precinct->imsbtree = 00;
   1879                             (*l_tcd_code_block_deallocate)(l_precinct);
   1880                             ++l_precinct;
   1881                         }
   1882 
   1883                         opj_free(l_band->precincts);
   1884                         l_band->precincts = 00;
   1885                     }
   1886                     ++l_band;
   1887                 } /* for (resno */
   1888                 ++l_res;
   1889             }
   1890 
   1891             opj_free(l_tile_comp->resolutions);
   1892             l_tile_comp->resolutions = 00;
   1893         }
   1894 
   1895         if (l_tile_comp->ownsData && l_tile_comp->data) {
   1896             opj_image_data_free(l_tile_comp->data);
   1897             l_tile_comp->data = 00;
   1898             l_tile_comp->ownsData = 0;
   1899             l_tile_comp->data_size = 0;
   1900             l_tile_comp->data_size_needed = 0;
   1901         }
   1902 
   1903         opj_image_data_free(l_tile_comp->data_win);
   1904 
   1905         ++l_tile_comp;
   1906     }
   1907 
   1908     opj_free(l_tile->comps);
   1909     l_tile->comps = 00;
   1910     opj_free(p_tcd->tcd_image->tiles);
   1911     p_tcd->tcd_image->tiles = 00;
   1912 }
   1913 
   1914 
   1915 static OPJ_BOOL opj_tcd_t2_decode(opj_tcd_t *p_tcd,
   1916                                   OPJ_BYTE * p_src_data,
   1917                                   OPJ_UINT32 * p_data_read,
   1918                                   OPJ_UINT32 p_max_src_size,
   1919                                   opj_codestream_index_t *p_cstr_index,
   1920                                   opj_event_mgr_t *p_manager
   1921                                  )
   1922 {
   1923     opj_t2_t * l_t2;
   1924 
   1925     l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
   1926     if (l_t2 == 00) {
   1927         return OPJ_FALSE;
   1928     }
   1929 
   1930     if (! opj_t2_decode_packets(
   1931                 p_tcd,
   1932                 l_t2,
   1933                 p_tcd->tcd_tileno,
   1934                 p_tcd->tcd_image->tiles,
   1935                 p_src_data,
   1936                 p_data_read,
   1937                 p_max_src_size,
   1938                 p_cstr_index,
   1939                 p_manager)) {
   1940         opj_t2_destroy(l_t2);
   1941         return OPJ_FALSE;
   1942     }
   1943 
   1944     opj_t2_destroy(l_t2);
   1945 
   1946     /*---------------CLEAN-------------------*/
   1947     return OPJ_TRUE;
   1948 }
   1949 
   1950 static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager)
   1951 {
   1952     OPJ_UINT32 compno;
   1953     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
   1954     opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps;
   1955     opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
   1956     volatile OPJ_BOOL ret = OPJ_TRUE;
   1957     OPJ_BOOL check_pterm = OPJ_FALSE;
   1958     opj_mutex_t* p_manager_mutex = NULL;
   1959 
   1960     p_manager_mutex = opj_mutex_create();
   1961 
   1962     /* Only enable PTERM check if we decode all layers */
   1963     if (p_tcd->tcp->num_layers_to_decode == p_tcd->tcp->numlayers &&
   1964             (l_tccp->cblksty & J2K_CCP_CBLKSTY_PTERM) != 0) {
   1965         check_pterm = OPJ_TRUE;
   1966     }
   1967 
   1968     for (compno = 0; compno < l_tile->numcomps;
   1969             ++compno, ++l_tile_comp, ++l_tccp) {
   1970         if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) {
   1971             continue;
   1972         }
   1973 
   1974         opj_t1_decode_cblks(p_tcd, &ret, l_tile_comp, l_tccp,
   1975                             p_manager, p_manager_mutex, check_pterm);
   1976         if (!ret) {
   1977             break;
   1978         }
   1979     }
   1980 
   1981     opj_thread_pool_wait_completion(p_tcd->thread_pool, 0);
   1982     if (p_manager_mutex) {
   1983         opj_mutex_destroy(p_manager_mutex);
   1984     }
   1985     return ret;
   1986 }
   1987 
   1988 
   1989 static OPJ_BOOL opj_tcd_dwt_decode(opj_tcd_t *p_tcd)
   1990 {
   1991     OPJ_UINT32 compno;
   1992     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
   1993     opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
   1994     opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
   1995     opj_image_comp_t * l_img_comp = p_tcd->image->comps;
   1996 
   1997     for (compno = 0; compno < l_tile->numcomps;
   1998             compno++, ++l_tile_comp, ++l_img_comp, ++l_tccp) {
   1999         if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) {
   2000             continue;
   2001         }
   2002 
   2003         if (l_tccp->qmfbid == 1) {
   2004             if (! opj_dwt_decode(p_tcd, l_tile_comp,
   2005                                  l_img_comp->resno_decoded + 1)) {
   2006                 return OPJ_FALSE;
   2007             }
   2008         } else {
   2009             if (! opj_dwt_decode_real(p_tcd, l_tile_comp,
   2010                                       l_img_comp->resno_decoded + 1)) {
   2011                 return OPJ_FALSE;
   2012             }
   2013         }
   2014 
   2015     }
   2016 
   2017     return OPJ_TRUE;
   2018 }
   2019 
   2020 static OPJ_BOOL opj_tcd_mct_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager)
   2021 {
   2022     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
   2023     opj_tcp_t * l_tcp = p_tcd->tcp;
   2024     opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
   2025     OPJ_UINT32 l_samples, i;
   2026 
   2027     if (l_tcp->mct == 0 || p_tcd->used_component != NULL) {
   2028         return OPJ_TRUE;
   2029     }
   2030 
   2031     if (p_tcd->whole_tile_decoding) {
   2032         opj_tcd_resolution_t* res_comp0 = l_tile->comps[0].resolutions +
   2033                                           l_tile_comp->minimum_num_resolutions - 1;
   2034 
   2035         /* A bit inefficient: we process more data than needed if */
   2036         /* resno_decoded < l_tile_comp->minimum_num_resolutions-1, */
   2037         /* but we would need to take into account a stride then */
   2038         l_samples = (OPJ_UINT32)((res_comp0->x1 - res_comp0->x0) *
   2039                                  (res_comp0->y1 - res_comp0->y0));
   2040         if (l_tile->numcomps >= 3) {
   2041             if (l_tile_comp->minimum_num_resolutions !=
   2042                     l_tile->comps[1].minimum_num_resolutions ||
   2043                     l_tile_comp->minimum_num_resolutions !=
   2044                     l_tile->comps[2].minimum_num_resolutions) {
   2045                 opj_event_msg(p_manager, EVT_ERROR,
   2046                               "Tiles don't all have the same dimension. Skip the MCT step.\n");
   2047                 return OPJ_FALSE;
   2048             }
   2049         }
   2050         if (l_tile->numcomps >= 3) {
   2051             opj_tcd_resolution_t* res_comp1 = l_tile->comps[1].resolutions +
   2052                                               l_tile_comp->minimum_num_resolutions - 1;
   2053             opj_tcd_resolution_t* res_comp2 = l_tile->comps[2].resolutions +
   2054                                               l_tile_comp->minimum_num_resolutions - 1;
   2055             /* testcase 1336.pdf.asan.47.376 */
   2056             if (p_tcd->image->comps[0].resno_decoded !=
   2057                     p_tcd->image->comps[1].resno_decoded ||
   2058                     p_tcd->image->comps[0].resno_decoded !=
   2059                     p_tcd->image->comps[2].resno_decoded ||
   2060                     (OPJ_SIZE_T)(res_comp1->x1 - res_comp1->x0) *
   2061                     (OPJ_SIZE_T)(res_comp1->y1 - res_comp1->y0) != l_samples ||
   2062                     (OPJ_SIZE_T)(res_comp2->x1 - res_comp2->x0) *
   2063                     (OPJ_SIZE_T)(res_comp2->y1 - res_comp2->y0) != l_samples) {
   2064                 opj_event_msg(p_manager, EVT_ERROR,
   2065                               "Tiles don't all have the same dimension. Skip the MCT step.\n");
   2066                 return OPJ_FALSE;
   2067             }
   2068         }
   2069     } else {
   2070         opj_tcd_resolution_t* res_comp0 = l_tile->comps[0].resolutions +
   2071                                           p_tcd->image->comps[0].resno_decoded;
   2072 
   2073         l_samples = (res_comp0->win_x1 - res_comp0->win_x0) *
   2074                     (res_comp0->win_y1 - res_comp0->win_y0);
   2075         if (l_tile->numcomps >= 3) {
   2076             opj_tcd_resolution_t* res_comp1 = l_tile->comps[1].resolutions +
   2077                                               p_tcd->image->comps[1].resno_decoded;
   2078             opj_tcd_resolution_t* res_comp2 = l_tile->comps[2].resolutions +
   2079                                               p_tcd->image->comps[2].resno_decoded;
   2080             /* testcase 1336.pdf.asan.47.376 */
   2081             if (p_tcd->image->comps[0].resno_decoded !=
   2082                     p_tcd->image->comps[1].resno_decoded ||
   2083                     p_tcd->image->comps[0].resno_decoded !=
   2084                     p_tcd->image->comps[2].resno_decoded ||
   2085                     (OPJ_SIZE_T)(res_comp1->win_x1 - res_comp1->win_x0) *
   2086                     (OPJ_SIZE_T)(res_comp1->win_y1 - res_comp1->win_y0) != l_samples ||
   2087                     (OPJ_SIZE_T)(res_comp2->win_x1 - res_comp2->win_x0) *
   2088                     (OPJ_SIZE_T)(res_comp2->win_y1 - res_comp2->win_y0) != l_samples) {
   2089                 opj_event_msg(p_manager, EVT_ERROR,
   2090                               "Tiles don't all have the same dimension. Skip the MCT step.\n");
   2091                 return OPJ_FALSE;
   2092             }
   2093         }
   2094     }
   2095 
   2096     if (l_tile->numcomps >= 3) {
   2097         if (l_tcp->mct == 2) {
   2098             OPJ_BYTE ** l_data;
   2099 
   2100             if (! l_tcp->m_mct_decoding_matrix) {
   2101                 return OPJ_TRUE;
   2102             }
   2103 
   2104             l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps * sizeof(OPJ_BYTE*));
   2105             if (! l_data) {
   2106                 return OPJ_FALSE;
   2107             }
   2108 
   2109             for (i = 0; i < l_tile->numcomps; ++i) {
   2110                 if (p_tcd->whole_tile_decoding) {
   2111                     l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
   2112                 } else {
   2113                     l_data[i] = (OPJ_BYTE*) l_tile_comp->data_win;
   2114                 }
   2115                 ++l_tile_comp;
   2116             }
   2117 
   2118             if (! opj_mct_decode_custom(/* MCT data */
   2119                         (OPJ_BYTE*) l_tcp->m_mct_decoding_matrix,
   2120                         /* size of components */
   2121                         l_samples,
   2122                         /* components */
   2123                         l_data,
   2124                         /* nb of components (i.e. size of pData) */
   2125                         l_tile->numcomps,
   2126                         /* tells if the data is signed */
   2127                         p_tcd->image->comps->sgnd)) {
   2128                 opj_free(l_data);
   2129                 return OPJ_FALSE;
   2130             }
   2131 
   2132             opj_free(l_data);
   2133         } else {
   2134             if (l_tcp->tccps->qmfbid == 1) {
   2135                 if (p_tcd->whole_tile_decoding) {
   2136                     opj_mct_decode(l_tile->comps[0].data,
   2137                                    l_tile->comps[1].data,
   2138                                    l_tile->comps[2].data,
   2139                                    l_samples);
   2140                 } else {
   2141                     opj_mct_decode(l_tile->comps[0].data_win,
   2142                                    l_tile->comps[1].data_win,
   2143                                    l_tile->comps[2].data_win,
   2144                                    l_samples);
   2145                 }
   2146             } else {
   2147                 if (p_tcd->whole_tile_decoding) {
   2148                     opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data,
   2149                                         (OPJ_FLOAT32*)l_tile->comps[1].data,
   2150                                         (OPJ_FLOAT32*)l_tile->comps[2].data,
   2151                                         l_samples);
   2152                 } else {
   2153                     opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data_win,
   2154                                         (OPJ_FLOAT32*)l_tile->comps[1].data_win,
   2155                                         (OPJ_FLOAT32*)l_tile->comps[2].data_win,
   2156                                         l_samples);
   2157                 }
   2158             }
   2159         }
   2160     } else {
   2161         opj_event_msg(p_manager, EVT_ERROR,
   2162                       "Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",
   2163                       l_tile->numcomps);
   2164     }
   2165 
   2166     return OPJ_TRUE;
   2167 }
   2168 
   2169 
   2170 static OPJ_BOOL opj_tcd_dc_level_shift_decode(opj_tcd_t *p_tcd)
   2171 {
   2172     OPJ_UINT32 compno;
   2173     opj_tcd_tilecomp_t * l_tile_comp = 00;
   2174     opj_tccp_t * l_tccp = 00;
   2175     opj_image_comp_t * l_img_comp = 00;
   2176     opj_tcd_resolution_t* l_res = 00;
   2177     opj_tcd_tile_t * l_tile;
   2178     OPJ_UINT32 l_width, l_height, i, j;
   2179     OPJ_INT32 * l_current_ptr;
   2180     OPJ_INT32 l_min, l_max;
   2181     OPJ_UINT32 l_stride;
   2182 
   2183     l_tile = p_tcd->tcd_image->tiles;
   2184     l_tile_comp = l_tile->comps;
   2185     l_tccp = p_tcd->tcp->tccps;
   2186     l_img_comp = p_tcd->image->comps;
   2187 
   2188     for (compno = 0; compno < l_tile->numcomps;
   2189             compno++, ++l_img_comp, ++l_tccp, ++l_tile_comp) {
   2190 
   2191         if (p_tcd->used_component != NULL && !p_tcd->used_component[compno]) {
   2192             continue;
   2193         }
   2194 
   2195         l_res = l_tile_comp->resolutions + l_img_comp->resno_decoded;
   2196 
   2197         if (!p_tcd->whole_tile_decoding) {
   2198             l_width = l_res->win_x1 - l_res->win_x0;
   2199             l_height = l_res->win_y1 - l_res->win_y0;
   2200             l_stride = 0;
   2201             l_current_ptr = l_tile_comp->data_win;
   2202         } else {
   2203             l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
   2204             l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
   2205             l_stride = (OPJ_UINT32)(
   2206                            l_tile_comp->resolutions[l_tile_comp->minimum_num_resolutions - 1].x1 -
   2207                            l_tile_comp->resolutions[l_tile_comp->minimum_num_resolutions - 1].x0)
   2208                        - l_width;
   2209             l_current_ptr = l_tile_comp->data;
   2210 
   2211             assert(l_height == 0 ||
   2212                    l_width + l_stride <= l_tile_comp->data_size / l_height); /*MUPDF*/
   2213         }
   2214 
   2215         if (l_img_comp->sgnd) {
   2216             l_min = -(1 << (l_img_comp->prec - 1));
   2217             l_max = (1 << (l_img_comp->prec - 1)) - 1;
   2218         } else {
   2219             l_min = 0;
   2220             l_max = (OPJ_INT32)((1U << l_img_comp->prec) - 1);
   2221         }
   2222 
   2223 
   2224         if (l_tccp->qmfbid == 1) {
   2225             for (j = 0; j < l_height; ++j) {
   2226                 for (i = 0; i < l_width; ++i) {
   2227                     /* TODO: do addition on int64 ? */
   2228                     *l_current_ptr = opj_int_clamp(*l_current_ptr + l_tccp->m_dc_level_shift, l_min,
   2229                                                    l_max);
   2230                     ++l_current_ptr;
   2231                 }
   2232                 l_current_ptr += l_stride;
   2233             }
   2234         } else {
   2235             for (j = 0; j < l_height; ++j) {
   2236                 for (i = 0; i < l_width; ++i) {
   2237                     OPJ_FLOAT32 l_value = *((OPJ_FLOAT32 *) l_current_ptr);
   2238                     if (l_value > INT_MAX) {
   2239                         *l_current_ptr = l_max;
   2240                     } else if (l_value < INT_MIN) {
   2241                         *l_current_ptr = l_min;
   2242                     } else {
   2243                         /* Do addition on int64 to avoid overflows */
   2244                         OPJ_INT64 l_value_int = (OPJ_INT64)opj_lrintf(l_value);
   2245                         *l_current_ptr = (OPJ_INT32)opj_int64_clamp(
   2246                                              l_value_int + l_tccp->m_dc_level_shift, l_min, l_max);
   2247                     }
   2248                     ++l_current_ptr;
   2249                 }
   2250                 l_current_ptr += l_stride;
   2251             }
   2252         }
   2253     }
   2254 
   2255     return OPJ_TRUE;
   2256 }
   2257 
   2258 
   2259 
   2260 /**
   2261  * Deallocates the encoding data of the given precinct.
   2262  */
   2263 static void opj_tcd_code_block_dec_deallocate(opj_tcd_precinct_t * p_precinct)
   2264 {
   2265     OPJ_UINT32 cblkno, l_nb_code_blocks;
   2266 
   2267     opj_tcd_cblk_dec_t * l_code_block = p_precinct->cblks.dec;
   2268     if (l_code_block) {
   2269         /*fprintf(stderr,"deallocate codeblock:{\n");*/
   2270         /*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);*/
   2271         /*fprintf(stderr,"\t numbps=%d, numlenbits=%d, len=%d, numnewpasses=%d, real_num_segs=%d, m_current_max_segs=%d\n ",
   2272                         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 );*/
   2273 
   2274 
   2275         l_nb_code_blocks = p_precinct->block_size / (OPJ_UINT32)sizeof(
   2276                                opj_tcd_cblk_dec_t);
   2277         /*fprintf(stderr,"nb_code_blocks =%d\t}\n", l_nb_code_blocks);*/
   2278 
   2279         for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
   2280 
   2281             if (l_code_block->segs) {
   2282                 opj_free(l_code_block->segs);
   2283                 l_code_block->segs = 00;
   2284             }
   2285 
   2286             if (l_code_block->chunks) {
   2287                 opj_free(l_code_block->chunks);
   2288                 l_code_block->chunks = 00;
   2289             }
   2290 
   2291             opj_aligned_free(l_code_block->decoded_data);
   2292             l_code_block->decoded_data = NULL;
   2293 
   2294             ++l_code_block;
   2295         }
   2296 
   2297         opj_free(p_precinct->cblks.dec);
   2298         p_precinct->cblks.dec = 00;
   2299     }
   2300 }
   2301 
   2302 /**
   2303  * Deallocates the encoding data of the given precinct.
   2304  */
   2305 static void opj_tcd_code_block_enc_deallocate(opj_tcd_precinct_t * p_precinct)
   2306 {
   2307     OPJ_UINT32 cblkno, l_nb_code_blocks;
   2308 
   2309     opj_tcd_cblk_enc_t * l_code_block = p_precinct->cblks.enc;
   2310     if (l_code_block) {
   2311         l_nb_code_blocks = p_precinct->block_size / (OPJ_UINT32)sizeof(
   2312                                opj_tcd_cblk_enc_t);
   2313 
   2314         for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno)  {
   2315             if (l_code_block->data) {
   2316                 /* We refer to data - 1 since below we incremented it */
   2317                 /* in opj_tcd_code_block_enc_allocate_data() */
   2318                 opj_free(l_code_block->data - 1);
   2319                 l_code_block->data = 00;
   2320             }
   2321 
   2322             if (l_code_block->layers) {
   2323                 opj_free(l_code_block->layers);
   2324                 l_code_block->layers = 00;
   2325             }
   2326 
   2327             if (l_code_block->passes) {
   2328                 opj_free(l_code_block->passes);
   2329                 l_code_block->passes = 00;
   2330             }
   2331             ++l_code_block;
   2332         }
   2333 
   2334         opj_free(p_precinct->cblks.enc);
   2335 
   2336         p_precinct->cblks.enc = 00;
   2337     }
   2338 }
   2339 
   2340 OPJ_SIZE_T opj_tcd_get_encoded_tile_size(opj_tcd_t *p_tcd)
   2341 {
   2342     OPJ_UINT32 i;
   2343     OPJ_SIZE_T l_data_size = 0;
   2344     opj_image_comp_t * l_img_comp = 00;
   2345     opj_tcd_tilecomp_t * l_tilec = 00;
   2346     OPJ_UINT32 l_size_comp, l_remaining;
   2347 
   2348     l_tilec = p_tcd->tcd_image->tiles->comps;
   2349     l_img_comp = p_tcd->image->comps;
   2350     for (i = 0; i < p_tcd->image->numcomps; ++i) {
   2351         l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
   2352         l_remaining = l_img_comp->prec & 7;  /* (%8) */
   2353 
   2354         if (l_remaining) {
   2355             ++l_size_comp;
   2356         }
   2357 
   2358         if (l_size_comp == 3) {
   2359             l_size_comp = 4;
   2360         }
   2361 
   2362         l_data_size += l_size_comp * ((OPJ_SIZE_T)(l_tilec->x1 - l_tilec->x0) *
   2363                                       (OPJ_SIZE_T)(l_tilec->y1 - l_tilec->y0));
   2364         ++l_img_comp;
   2365         ++l_tilec;
   2366     }
   2367 
   2368     return l_data_size;
   2369 }
   2370 
   2371 static OPJ_BOOL opj_tcd_dc_level_shift_encode(opj_tcd_t *p_tcd)
   2372 {
   2373     OPJ_UINT32 compno;
   2374     opj_tcd_tilecomp_t * l_tile_comp = 00;
   2375     opj_tccp_t * l_tccp = 00;
   2376     opj_image_comp_t * l_img_comp = 00;
   2377     opj_tcd_tile_t * l_tile;
   2378     OPJ_SIZE_T l_nb_elem, i;
   2379     OPJ_INT32 * l_current_ptr;
   2380 
   2381     l_tile = p_tcd->tcd_image->tiles;
   2382     l_tile_comp = l_tile->comps;
   2383     l_tccp = p_tcd->tcp->tccps;
   2384     l_img_comp = p_tcd->image->comps;
   2385 
   2386     for (compno = 0; compno < l_tile->numcomps; compno++) {
   2387         l_current_ptr = l_tile_comp->data;
   2388         l_nb_elem = (OPJ_SIZE_T)(l_tile_comp->x1 - l_tile_comp->x0) *
   2389                     (OPJ_SIZE_T)(l_tile_comp->y1 - l_tile_comp->y0);
   2390 
   2391         if (l_tccp->qmfbid == 1) {
   2392             for (i = 0; i < l_nb_elem; ++i) {
   2393                 *l_current_ptr -= l_tccp->m_dc_level_shift ;
   2394                 ++l_current_ptr;
   2395             }
   2396         } else {
   2397             for (i = 0; i < l_nb_elem; ++i) {
   2398                 *l_current_ptr = (*l_current_ptr - l_tccp->m_dc_level_shift) * (1 << 11);
   2399                 ++l_current_ptr;
   2400             }
   2401         }
   2402 
   2403         ++l_img_comp;
   2404         ++l_tccp;
   2405         ++l_tile_comp;
   2406     }
   2407 
   2408     return OPJ_TRUE;
   2409 }
   2410 
   2411 static OPJ_BOOL opj_tcd_mct_encode(opj_tcd_t *p_tcd)
   2412 {
   2413     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
   2414     opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
   2415     OPJ_SIZE_T samples = (OPJ_SIZE_T)(l_tile_comp->x1 - l_tile_comp->x0) *
   2416                          (OPJ_SIZE_T)(l_tile_comp->y1 - l_tile_comp->y0);
   2417     OPJ_UINT32 i;
   2418     OPJ_BYTE ** l_data = 00;
   2419     opj_tcp_t * l_tcp = p_tcd->tcp;
   2420 
   2421     if (!p_tcd->tcp->mct) {
   2422         return OPJ_TRUE;
   2423     }
   2424 
   2425     if (p_tcd->tcp->mct == 2) {
   2426         if (! p_tcd->tcp->m_mct_coding_matrix) {
   2427             return OPJ_TRUE;
   2428         }
   2429 
   2430         l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps * sizeof(OPJ_BYTE*));
   2431         if (! l_data) {
   2432             return OPJ_FALSE;
   2433         }
   2434 
   2435         for (i = 0; i < l_tile->numcomps; ++i) {
   2436             l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
   2437             ++l_tile_comp;
   2438         }
   2439 
   2440         if (! opj_mct_encode_custom(/* MCT data */
   2441                     (OPJ_BYTE*) p_tcd->tcp->m_mct_coding_matrix,
   2442                     /* size of components */
   2443                     samples,
   2444                     /* components */
   2445                     l_data,
   2446                     /* nb of components (i.e. size of pData) */
   2447                     l_tile->numcomps,
   2448                     /* tells if the data is signed */
   2449                     p_tcd->image->comps->sgnd)) {
   2450             opj_free(l_data);
   2451             return OPJ_FALSE;
   2452         }
   2453 
   2454         opj_free(l_data);
   2455     } else if (l_tcp->tccps->qmfbid == 0) {
   2456         opj_mct_encode_real(l_tile->comps[0].data, l_tile->comps[1].data,
   2457                             l_tile->comps[2].data, samples);
   2458     } else {
   2459         opj_mct_encode(l_tile->comps[0].data, l_tile->comps[1].data,
   2460                        l_tile->comps[2].data, samples);
   2461     }
   2462 
   2463     return OPJ_TRUE;
   2464 }
   2465 
   2466 static OPJ_BOOL opj_tcd_dwt_encode(opj_tcd_t *p_tcd)
   2467 {
   2468     opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
   2469     opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
   2470     opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
   2471     OPJ_UINT32 compno;
   2472 
   2473     for (compno = 0; compno < l_tile->numcomps; ++compno) {
   2474         if (l_tccp->qmfbid == 1) {
   2475             if (! opj_dwt_encode(l_tile_comp)) {
   2476                 return OPJ_FALSE;
   2477             }
   2478         } else if (l_tccp->qmfbid == 0) {
   2479             if (! opj_dwt_encode_real(l_tile_comp)) {
   2480                 return OPJ_FALSE;
   2481             }
   2482         }
   2483 
   2484         ++l_tile_comp;
   2485         ++l_tccp;
   2486     }
   2487 
   2488     return OPJ_TRUE;
   2489 }
   2490 
   2491 static OPJ_BOOL opj_tcd_t1_encode(opj_tcd_t *p_tcd)
   2492 {
   2493     opj_t1_t * l_t1;
   2494     const OPJ_FLOAT64 * l_mct_norms;
   2495     OPJ_UINT32 l_mct_numcomps = 0U;
   2496     opj_tcp_t * l_tcp = p_tcd->tcp;
   2497 
   2498     l_t1 = opj_t1_create(OPJ_TRUE);
   2499     if (l_t1 == 00) {
   2500         return OPJ_FALSE;
   2501     }
   2502 
   2503     if (l_tcp->mct == 1) {
   2504         l_mct_numcomps = 3U;
   2505         /* irreversible encoding */
   2506         if (l_tcp->tccps->qmfbid == 0) {
   2507             l_mct_norms = opj_mct_get_mct_norms_real();
   2508         } else {
   2509             l_mct_norms = opj_mct_get_mct_norms();
   2510         }
   2511     } else {
   2512         l_mct_numcomps = p_tcd->image->numcomps;
   2513         l_mct_norms = (const OPJ_FLOAT64 *)(l_tcp->mct_norms);
   2514     }
   2515 
   2516     if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles, l_tcp, l_mct_norms,
   2517                               l_mct_numcomps)) {
   2518         opj_t1_destroy(l_t1);
   2519         return OPJ_FALSE;
   2520     }
   2521 
   2522     opj_t1_destroy(l_t1);
   2523 
   2524     return OPJ_TRUE;
   2525 }
   2526 
   2527 static OPJ_BOOL opj_tcd_t2_encode(opj_tcd_t *p_tcd,
   2528                                   OPJ_BYTE * p_dest_data,
   2529                                   OPJ_UINT32 * p_data_written,
   2530                                   OPJ_UINT32 p_max_dest_size,
   2531                                   opj_codestream_info_t *p_cstr_info,
   2532                                   opj_event_mgr_t *p_manager)
   2533 {
   2534     opj_t2_t * l_t2;
   2535 
   2536     l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
   2537     if (l_t2 == 00) {
   2538         return OPJ_FALSE;
   2539     }
   2540 
   2541     if (! opj_t2_encode_packets(
   2542                 l_t2,
   2543                 p_tcd->tcd_tileno,
   2544                 p_tcd->tcd_image->tiles,
   2545                 p_tcd->tcp->numlayers,
   2546                 p_dest_data,
   2547                 p_data_written,
   2548                 p_max_dest_size,
   2549                 p_cstr_info,
   2550                 p_tcd->tp_num,
   2551                 p_tcd->tp_pos,
   2552                 p_tcd->cur_pino,
   2553                 FINAL_PASS,
   2554                 p_manager)) {
   2555         opj_t2_destroy(l_t2);
   2556         return OPJ_FALSE;
   2557     }
   2558 
   2559     opj_t2_destroy(l_t2);
   2560 
   2561     /*---------------CLEAN-------------------*/
   2562     return OPJ_TRUE;
   2563 }
   2564 
   2565 
   2566 static OPJ_BOOL opj_tcd_rate_allocate_encode(opj_tcd_t *p_tcd,
   2567         OPJ_BYTE * p_dest_data,
   2568         OPJ_UINT32 p_max_dest_size,
   2569         opj_codestream_info_t *p_cstr_info,
   2570         opj_event_mgr_t *p_manager)
   2571 {
   2572     opj_cp_t * l_cp = p_tcd->cp;
   2573     OPJ_UINT32 l_nb_written = 0;
   2574 
   2575     if (p_cstr_info)  {
   2576         p_cstr_info->index_write = 0;
   2577     }
   2578 
   2579     if (l_cp->m_specific_param.m_enc.m_disto_alloc ||
   2580             l_cp->m_specific_param.m_enc.m_fixed_quality)  {
   2581         /* fixed_quality */
   2582         /* Normal Rate/distortion allocation */
   2583         if (! opj_tcd_rateallocate(p_tcd, p_dest_data, &l_nb_written, p_max_dest_size,
   2584                                    p_cstr_info, p_manager)) {
   2585             return OPJ_FALSE;
   2586         }
   2587     } else {
   2588         /* Fixed layer allocation */
   2589         opj_tcd_rateallocate_fixed(p_tcd);
   2590     }
   2591 
   2592     return OPJ_TRUE;
   2593 }
   2594 
   2595 
   2596 OPJ_BOOL opj_tcd_copy_tile_data(opj_tcd_t *p_tcd,
   2597                                 OPJ_BYTE * p_src,
   2598                                 OPJ_SIZE_T p_src_length)
   2599 {
   2600     OPJ_UINT32 i;
   2601     OPJ_SIZE_T j;
   2602     OPJ_SIZE_T l_data_size = 0;
   2603     opj_image_comp_t * l_img_comp = 00;
   2604     opj_tcd_tilecomp_t * l_tilec = 00;
   2605     OPJ_UINT32 l_size_comp, l_remaining;
   2606     OPJ_SIZE_T l_nb_elem;
   2607 
   2608     l_data_size = opj_tcd_get_encoded_tile_size(p_tcd);
   2609     if (l_data_size != p_src_length) {
   2610         return OPJ_FALSE;
   2611     }
   2612 
   2613     l_tilec = p_tcd->tcd_image->tiles->comps;
   2614     l_img_comp = p_tcd->image->comps;
   2615     for (i = 0; i < p_tcd->image->numcomps; ++i) {
   2616         l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
   2617         l_remaining = l_img_comp->prec & 7;  /* (%8) */
   2618         l_nb_elem = (OPJ_SIZE_T)(l_tilec->x1 - l_tilec->x0) *
   2619                     (OPJ_SIZE_T)(l_tilec->y1 - l_tilec->y0);
   2620 
   2621         if (l_remaining) {
   2622             ++l_size_comp;
   2623         }
   2624 
   2625         if (l_size_comp == 3) {
   2626             l_size_comp = 4;
   2627         }
   2628 
   2629         switch (l_size_comp) {
   2630         case 1: {
   2631             OPJ_CHAR * l_src_ptr = (OPJ_CHAR *) p_src;
   2632             OPJ_INT32 * l_dest_ptr = l_tilec->data;
   2633 
   2634             if (l_img_comp->sgnd) {
   2635                 for (j = 0; j < l_nb_elem; ++j) {
   2636                     *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++));
   2637                 }
   2638             } else {
   2639                 for (j = 0; j < l_nb_elem; ++j) {
   2640                     *(l_dest_ptr++) = (*(l_src_ptr++)) & 0xff;
   2641                 }
   2642             }
   2643 
   2644             p_src = (OPJ_BYTE*) l_src_ptr;
   2645         }
   2646         break;
   2647         case 2: {
   2648             OPJ_INT32 * l_dest_ptr = l_tilec->data;
   2649             OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_src;
   2650 
   2651             if (l_img_comp->sgnd) {
   2652                 for (j = 0; j < l_nb_elem; ++j) {
   2653                     *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++));
   2654                 }
   2655             } else {
   2656                 for (j = 0; j < l_nb_elem; ++j) {
   2657                     *(l_dest_ptr++) = (*(l_src_ptr++)) & 0xffff;
   2658                 }
   2659             }
   2660 
   2661             p_src = (OPJ_BYTE*) l_src_ptr;
   2662         }
   2663         break;
   2664         case 4: {
   2665             OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_src;
   2666             OPJ_INT32 * l_dest_ptr = l_tilec->data;
   2667 
   2668             for (j = 0; j < l_nb_elem; ++j) {
   2669                 *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++));
   2670             }
   2671 
   2672             p_src = (OPJ_BYTE*) l_src_ptr;
   2673         }
   2674         break;
   2675         }
   2676 
   2677         ++l_img_comp;
   2678         ++l_tilec;
   2679     }
   2680 
   2681     return OPJ_TRUE;
   2682 }
   2683 
   2684 OPJ_BOOL opj_tcd_is_band_empty(opj_tcd_band_t* band)
   2685 {
   2686     return (band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0);
   2687 }
   2688 
   2689 OPJ_BOOL opj_tcd_is_subband_area_of_interest(opj_tcd_t *tcd,
   2690         OPJ_UINT32 compno,
   2691         OPJ_UINT32 resno,
   2692         OPJ_UINT32 bandno,
   2693         OPJ_UINT32 band_x0,
   2694         OPJ_UINT32 band_y0,
   2695         OPJ_UINT32 band_x1,
   2696         OPJ_UINT32 band_y1)
   2697 {
   2698     /* Note: those values for filter_margin are in part the result of */
   2699     /* experimentation. The value 2 for QMFBID=1 (5x3 filter) can be linked */
   2700     /* to the maximum left/right extension given in tables F.2 and F.3 of the */
   2701     /* standard. The value 3 for QMFBID=0 (9x7 filter) is more suspicious, */
   2702     /* since F.2 and F.3 would lead to 4 instead, so the current 3 might be */
   2703     /* needed to be bumped to 4, in case inconsistencies are found while */
   2704     /* decoding parts of irreversible coded images. */
   2705     /* See opj_dwt_decode_partial_53 and opj_dwt_decode_partial_97 as well */
   2706     OPJ_UINT32 filter_margin = (tcd->tcp->tccps[compno].qmfbid == 1) ? 2 : 3;
   2707     opj_tcd_tilecomp_t *tilec = &(tcd->tcd_image->tiles->comps[compno]);
   2708     opj_image_comp_t* image_comp = &(tcd->image->comps[compno]);
   2709     /* Compute the intersection of the area of interest, expressed in tile coordinates */
   2710     /* with the tile coordinates */
   2711     OPJ_UINT32 tcx0 = opj_uint_max(
   2712                           (OPJ_UINT32)tilec->x0,
   2713                           opj_uint_ceildiv(tcd->win_x0, image_comp->dx));
   2714     OPJ_UINT32 tcy0 = opj_uint_max(
   2715                           (OPJ_UINT32)tilec->y0,
   2716                           opj_uint_ceildiv(tcd->win_y0, image_comp->dy));
   2717     OPJ_UINT32 tcx1 = opj_uint_min(
   2718                           (OPJ_UINT32)tilec->x1,
   2719                           opj_uint_ceildiv(tcd->win_x1, image_comp->dx));
   2720     OPJ_UINT32 tcy1 = opj_uint_min(
   2721                           (OPJ_UINT32)tilec->y1,
   2722                           opj_uint_ceildiv(tcd->win_y1, image_comp->dy));
   2723     /* Compute number of decomposition for this band. See table F-1 */
   2724     OPJ_UINT32 nb = (resno == 0) ?
   2725                     tilec->numresolutions - 1 :
   2726                     tilec->numresolutions - resno;
   2727     /* Map above tile-based coordinates to sub-band-based coordinates per */
   2728     /* equation B-15 of the standard */
   2729     OPJ_UINT32 x0b = bandno & 1;
   2730     OPJ_UINT32 y0b = bandno >> 1;
   2731     OPJ_UINT32 tbx0 = (nb == 0) ? tcx0 :
   2732                       (tcx0 <= (1U << (nb - 1)) * x0b) ? 0 :
   2733                       opj_uint_ceildivpow2(tcx0 - (1U << (nb - 1)) * x0b, nb);
   2734     OPJ_UINT32 tby0 = (nb == 0) ? tcy0 :
   2735                       (tcy0 <= (1U << (nb - 1)) * y0b) ? 0 :
   2736                       opj_uint_ceildivpow2(tcy0 - (1U << (nb - 1)) * y0b, nb);
   2737     OPJ_UINT32 tbx1 = (nb == 0) ? tcx1 :
   2738                       (tcx1 <= (1U << (nb - 1)) * x0b) ? 0 :
   2739                       opj_uint_ceildivpow2(tcx1 - (1U << (nb - 1)) * x0b, nb);
   2740     OPJ_UINT32 tby1 = (nb == 0) ? tcy1 :
   2741                       (tcy1 <= (1U << (nb - 1)) * y0b) ? 0 :
   2742                       opj_uint_ceildivpow2(tcy1 - (1U << (nb - 1)) * y0b, nb);
   2743     OPJ_BOOL intersects;
   2744 
   2745     if (tbx0 < filter_margin) {
   2746         tbx0 = 0;
   2747     } else {
   2748         tbx0 -= filter_margin;
   2749     }
   2750     if (tby0 < filter_margin) {
   2751         tby0 = 0;
   2752     } else {
   2753         tby0 -= filter_margin;
   2754     }
   2755     tbx1 = opj_uint_adds(tbx1, filter_margin);
   2756     tby1 = opj_uint_adds(tby1, filter_margin);
   2757 
   2758     intersects = band_x0 < tbx1 && band_y0 < tby1 && band_x1 > tbx0 &&
   2759                  band_y1 > tby0;
   2760 
   2761 #ifdef DEBUG_VERBOSE
   2762     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",
   2763            compno, resno, nb, bandno, x0b, y0b,
   2764            band_x0, band_y0, band_x1, band_y1,
   2765            tbx0, tby0, tbx1, tby1, intersects);
   2766 #endif
   2767     return intersects;
   2768 }
   2769 
   2770 /** Returns whether a tile componenent is fully decoded, taking into account
   2771  * p_tcd->win_* members.
   2772  *
   2773  * @param p_tcd    TCD handle.
   2774  * @param compno Component number
   2775  * @return OPJ_TRUE whether the tile componenent is fully decoded
   2776  */
   2777 static OPJ_BOOL opj_tcd_is_whole_tilecomp_decoding(opj_tcd_t *p_tcd,
   2778         OPJ_UINT32 compno)
   2779 {
   2780     opj_tcd_tilecomp_t* tilec = &(p_tcd->tcd_image->tiles->comps[compno]);
   2781     opj_image_comp_t* image_comp = &(p_tcd->image->comps[compno]);
   2782     /* Compute the intersection of the area of interest, expressed in tile coordinates */
   2783     /* with the tile coordinates */
   2784     OPJ_UINT32 tcx0 = opj_uint_max(
   2785                           (OPJ_UINT32)tilec->x0,
   2786                           opj_uint_ceildiv(p_tcd->win_x0, image_comp->dx));
   2787     OPJ_UINT32 tcy0 = opj_uint_max(
   2788                           (OPJ_UINT32)tilec->y0,
   2789                           opj_uint_ceildiv(p_tcd->win_y0, image_comp->dy));
   2790     OPJ_UINT32 tcx1 = opj_uint_min(
   2791                           (OPJ_UINT32)tilec->x1,
   2792                           opj_uint_ceildiv(p_tcd->win_x1, image_comp->dx));
   2793     OPJ_UINT32 tcy1 = opj_uint_min(
   2794                           (OPJ_UINT32)tilec->y1,
   2795                           opj_uint_ceildiv(p_tcd->win_y1, image_comp->dy));
   2796 
   2797     OPJ_UINT32 shift = tilec->numresolutions - tilec->minimum_num_resolutions;
   2798     /* Tolerate small margin within the reduced resolution factor to consider if */
   2799     /* the whole tile path must be taken */
   2800     return (tcx0 >= (OPJ_UINT32)tilec->x0 &&
   2801             tcy0 >= (OPJ_UINT32)tilec->y0 &&
   2802             tcx1 <= (OPJ_UINT32)tilec->x1 &&
   2803             tcy1 <= (OPJ_UINT32)tilec->y1 &&
   2804             (shift >= 32 ||
   2805              (((tcx0 - (OPJ_UINT32)tilec->x0) >> shift) == 0 &&
   2806               ((tcy0 - (OPJ_UINT32)tilec->y0) >> shift) == 0 &&
   2807               (((OPJ_UINT32)tilec->x1 - tcx1) >> shift) == 0 &&
   2808               (((OPJ_UINT32)tilec->y1 - tcy1) >> shift) == 0)));
   2809 }
   2810