From 1746eaca2a013e39b29c4036caec88c3a0ba92d5 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Tue, 15 Jun 2010 14:16:05 +0200 Subject: Allow bare J2K code streams in the JPXDecode filter. --- fitz/filt_jpxd.c | 53 +++++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 24 deletions(-) (limited to 'fitz/filt_jpxd.c') 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; -- cgit v1.2.3