diff options
author | Tor Andersson <tor@ghostscript.com> | 2010-06-15 14:16:05 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2010-06-15 14:16:05 +0200 |
commit | 1746eaca2a013e39b29c4036caec88c3a0ba92d5 (patch) | |
tree | c4ac8532211e546d8839d863af34eb2a4641f4ff /fitz | |
parent | 1c9aa98359e9101787e93d68e7b83bbf1213919f (diff) | |
download | mupdf-1746eaca2a013e39b29c4036caec88c3a0ba92d5.tar.xz |
Allow bare J2K code streams in the JPXDecode filter.
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/filt_jpxd.c | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/fitz/filt_jpxd.c b/fitz/filt_jpxd.c index 2a40670d..b50bf74e 100644 --- a/fitz/filt_jpxd.c +++ b/fitz/filt_jpxd.c @@ -45,20 +45,6 @@ fz_newjpxd(fz_obj *params) d->y = 0; d->k = 0; - memset(&d->evtmgr, 0, sizeof(d->evtmgr)); - d->evtmgr.error_handler = fz_opj_error_callback; - d->evtmgr.warning_handler = fz_opj_warning_callback; - d->evtmgr.info_handler = fz_opj_info_callback; - - opj_set_default_decoder_parameters(&d->params); - - d->info = opj_create_decompress(CODEC_JP2); - if (!d->info) - fz_warn("assert: opj_create_decompress failed"); - - opj_set_event_mgr((opj_common_ptr)d->info, &d->evtmgr, stderr); - opj_setup_decoder(d->info, &d->params); - return (fz_filter*)d; } @@ -66,14 +52,17 @@ void fz_dropjpxd(fz_filter *filter) { fz_jpxd *d = (fz_jpxd*)filter; - if (d->image) opj_image_destroy(d->image); - if (d->info) opj_destroy_decompress(d->info); + if (d->image) + opj_image_destroy(d->image); + if (d->info) + opj_destroy_decompress(d->info); } fz_error fz_processjpxd(fz_filter *filter, fz_buffer *in, fz_buffer *out) { fz_jpxd *d = (fz_jpxd*)filter; + int format; int n, w, h, depth, sgnd; int k, v; @@ -94,6 +83,29 @@ input: d->stage = 1; decode: + memset(&d->evtmgr, 0, sizeof(d->evtmgr)); + d->evtmgr.error_handler = fz_opj_error_callback; + d->evtmgr.warning_handler = fz_opj_warning_callback; + d->evtmgr.info_handler = fz_opj_info_callback; + + opj_set_default_decoder_parameters(&d->params); + + if (in->wp - in->rp < 2) + return fz_throw("not enough data to determine image format"); + + /* Check for SOC marker -- if found we have a bare J2K stream */ + if (in->rp[0] == 0xFF && in->rp[1] == 0x4F) + format = CODEC_J2K; + else + format = CODEC_JP2; + + d->info = opj_create_decompress(format); + if (!d->info) + fz_warn("assert: opj_create_decompress failed"); + + opj_set_event_mgr((opj_common_ptr)d->info, &d->evtmgr, stderr); + opj_setup_decoder(d->info, &d->params); + cio = opj_cio_open((opj_common_ptr)d->info, in->rp, in->wp - in->rp); in->rp = in->wp; @@ -106,8 +118,6 @@ decode: opj_cio_close(cio); - d->stage = 2; - for (k = 1; k < d->image->numcomps; k++) { if (d->image->comps[k].w != d->image->comps[0].w) @@ -118,12 +128,7 @@ decode: return fz_throw("image components have different precision"); } - { - n = d->image->numcomps; - w = d->image->comps[0].w; - h = d->image->comps[0].h; - depth = d->image->comps[0].prec; - } + d->stage = 2; output: n = d->image->numcomps; |