]> granicus.if.org Git - openjpeg/commitdiff
[trunk] This fixes issues seen on PDF files
authorMathieu Malaterre <mathieu.malaterre@gmail.com>
Wed, 11 Jul 2012 14:55:39 +0000 (14:55 +0000)
committerMathieu Malaterre <mathieu.malaterre@gmail.com>
Wed, 11 Jul 2012 14:55:39 +0000 (14:55 +0000)
Fixes issue 156

libopenjpeg/j2k.c
libopenjpeg/tcd.c

index d2e5c927c5e0b63157821ce98c2feadd2a972747..caa5a781ade61fdb2a0d5e7bf9258549508429ab 100644 (file)
@@ -6326,7 +6326,7 @@ opj_bool j2k_update_rates(        opj_j2k_v2_t *p_j2k,
 
 static void j2k_read_eoc(opj_j2k_t *j2k) {
        int i, tileno;
-       opj_bool success;
+       opj_bool success = false;
 
        /* if packets should be decoded */
        if (j2k->cp->limit_decoding != DECODE_ALL_BUT_PACKETS) {
@@ -6334,11 +6334,16 @@ static void j2k_read_eoc(opj_j2k_t *j2k) {
                tcd_malloc_decode(tcd, j2k->image, j2k->cp);
                for (i = 0; i < j2k->cp->tileno_size; i++) {
                        tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info);
-                       tileno = j2k->cp->tileno[i];
-                       success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info);
-                       opj_free(j2k->tile_data[tileno]);
-                       j2k->tile_data[tileno] = NULL;
-                       tcd_free_decode_tile(tcd, i);
+                       if (j2k->cp->tileno[i] != -1)
+                       {
+                               tileno = j2k->cp->tileno[i];
+                               success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info);
+                               opj_free(j2k->tile_data[tileno]);
+                               j2k->tile_data[tileno] = NULL;
+                               tcd_free_decode_tile(tcd, i);
+                       }
+                       else
+                               success = false;
                        if (success == OPJ_FALSE) {
                                j2k->state |= J2K_STATE_ERR;
                                break;
index 1fc97a80e3866feac7fa99774558d633a37ef1c0..1476bef4edef58d22fe5bafc120b36629406ee26 100644 (file)
@@ -796,6 +796,12 @@ void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
                opj_tccp_t *tccp = &tcp->tccps[compno];
                opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
                
+               if (tccp->numresolutions <= 0)
+               {
+                       cp->tileno[tileno] = -1;
+                       return;
+               }
+
                /* border of each tile component (global) */
                tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
                tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);