My preliminary thoughts on OpenJPEG
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user