From d5892bbb32de66e1c3b2d519495152309b0c8f93 Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Sun, 6 Jan 2013 02:38:12 +0100 Subject: [PATCH] My preliminary thoughts on OpenJPEG --- indra/libopenjpeg/j2k.c | 46 ++++++++++++++++++++++------------------- indra/libopenjpeg/t1.c | 19 ++++++++++++++--- indra/libopenjpeg/tcd.c | 17 +++++++++------ 3 files changed, 52 insertions(+), 30 deletions(-) diff --git a/indra/libopenjpeg/j2k.c b/indra/libopenjpeg/j2k.c index b81bd579c..47ec0be3a 100644 --- a/indra/libopenjpeg/j2k.c +++ b/indra/libopenjpeg/j2k.c @@ -703,15 +703,15 @@ static void j2k_read_cox(opj_j2k_t *j2k, int compno) { /* If user wants to remove more resolutions than the codestream contains, return error*/ if (cp->reduce >= tccp->numresolutions) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number " - "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno); + "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno); j2k->state |= J2K_STATE_ERR; } - if( tccp->numresolutions > J2K_MAXRLVLS ) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions is too big: %d vs max= %d. Truncating.\n\n", - compno, tccp->numresolutions, J2K_MAXRLVLS); + if( tccp->numresolutions > J2K_MAXRLVLS ) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions is too big: %d vs max= %d. Truncating.\n\n", + compno, tccp->numresolutions, J2K_MAXRLVLS); j2k->state |= J2K_STATE_ERR; - tccp->numresolutions = J2K_MAXRLVLS; - } + tccp->numresolutions = J2K_MAXRLVLS; + } tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */ tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */ @@ -1516,27 +1516,31 @@ static void j2k_read_sod(opj_j2k_t *j2k) { if (len == cio_numbytesleft(cio) + 1) { truncate = 1; /* Case of a truncate codestream */ - } + } - {/* chop padding bytes: */ - unsigned char *s, *e; + {/* chop padding bytes: */ + unsigned char *s, *e; - s = cio_getbp(cio); - e = s + len; + s = cio_getbp(cio); + e = s + len; - if(len > 8) s = e - 8; + if(len > 8) s = e - 8; - if(e[-2] == 0x00 && e[-1] == 0x00) /* padding bytes */ - { - while(e > s) - { - if(e[-2] == 0xff && e[-1] == 0xd9) break; - --len; --e; truncate = 1; - } - } - } + if(e[-2] == 0x00 && e[-1] == 0x00) /* padding bytes */ + { + while(e > s) + { + if(e[-2] == 0xff && e[-1] == 0xd9) break; + --len; --e; truncate = 1; + } + } + } data = j2k->tile_data[curtileno]; + if(!(j2k->tile_len[curtileno] + len)) { + opj_event_msg(j2k->cinfo, EVT_WARNING, "SG Corrupt data length\n"); + return; + } data = (unsigned char*) opj_realloc(data, (j2k->tile_len[curtileno] + len) * sizeof(unsigned char)); data_ptr = data + j2k->tile_len[curtileno]; diff --git a/indra/libopenjpeg/t1.c b/indra/libopenjpeg/t1.c index ed9cdc3fe..93b997b79 100644 --- a/indra/libopenjpeg/t1.c +++ b/indra/libopenjpeg/t1.c @@ -1091,14 +1091,27 @@ static double t1_getwmsedec( int numcomps, int mct) { - double w1, w2, wmsedec; + double w1 = 1, w2, wmsedec; + + // Prevent running an MCT on more than 3 components. NB openjpeg v2.0 will support this via + // custom MCT tables that can be passed as encode parameters, 1.3 cannot support this as it + // uses a static table of 3 entries and there for can only cope with 3 components with out an + // array overflow + + if(numcomps==3) { + if (qmfbid == 1) { + w1 = (numcomps > 1) ? mct_getnorm(compno) : 1.0; + } else { + w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1.0; + } + } + if (qmfbid == 1) { - w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0; w2 = dwt_getnorm(level, orient); } else { /* if (qmfbid == 0) */ - w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0; w2 = dwt_getnorm_real(level, orient); } + wmsedec = w1 * w2 * stepsize * (1 << bpno); wmsedec *= wmsedec * nmsedec / 8192.0; diff --git a/indra/libopenjpeg/tcd.c b/indra/libopenjpeg/tcd.c index ee0520556..c19b3eb6a 100644 --- a/indra/libopenjpeg/tcd.c +++ b/indra/libopenjpeg/tcd.c @@ -1418,15 +1418,20 @@ opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno int numres2decode; if (tcd->cp->reduce != 0) { - if ( tile->comps[compno].numresolutions < ( tcd->cp->reduce - 1 ) ) { + if ( tile->comps[compno].numresolutions < ( tcd->cp->reduce - 1 ) ) { opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number " - " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions); + " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions); return OPJ_FALSE; } - else { - tcd->image->comps[compno].resno_decoded = - tile->comps[compno].numresolutions - tcd->cp->reduce - 1; - } + else { + tcd->image->comps[compno].resno_decoded = + tile->comps[compno].numresolutions - tcd->cp->reduce - 1; + } + } + + if(!tilec->data) { + opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. null data\n"); + return OPJ_FALSE; } numres2decode = tcd->image->comps[compno].resno_decoded + 1;