summaryrefslogtreecommitdiff
path: root/fitz/filt_jpxd.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-06-15 14:16:05 +0200
committerTor Andersson <tor@ghostscript.com>2010-06-15 14:16:05 +0200
commit1746eaca2a013e39b29c4036caec88c3a0ba92d5 (patch)
treec4ac8532211e546d8839d863af34eb2a4641f4ff /fitz/filt_jpxd.c
parent1c9aa98359e9101787e93d68e7b83bbf1213919f (diff)
downloadmupdf-1746eaca2a013e39b29c4036caec88c3a0ba92d5.tar.xz
Allow bare J2K code streams in the JPXDecode filter.
Diffstat (limited to 'fitz/filt_jpxd.c')
-rw-r--r--fitz/filt_jpxd.c53
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;