From: Carl Hetherington Date: Wed, 10 Jun 2015 12:20:55 +0000 (+0100) Subject: Support decompression of JP2 as well as JPEG2000 codestreams. X-Git-Tag: v1.1.0~7 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=885c2ea2aca4d2f5d891ff0954e1fe21fdd16ab4;p=libdcp.git Support decompression of JP2 as well as JPEG2000 codestreams. --- diff --git a/src/util.cc b/src/util.cc index 86d1bc87..d972d8ce 100644 --- a/src/util.cc +++ b/src/util.cc @@ -204,17 +204,43 @@ dcp::content_kind_from_string (string kind) shared_ptr dcp::decompress_j2k (uint8_t* data, int64_t size, int reduce) { - opj_dinfo_t* decoder = opj_create_decompress (CODEC_J2K); + uint8_t const jp2_magic[] = { + 0x00, + 0x00, + 0x00, + 0x0c, + 'j', + 'P', + 0x20, + 0x20 + }; + + OPJ_CODEC_FORMAT format = CODEC_J2K; + if (size >= int (sizeof (jp2_magic)) && memcmp (data, jp2_magic, sizeof (jp2_magic)) == 0) { + format = CODEC_JP2; + } + + opj_dinfo_t* decoder = opj_create_decompress (format); + if (!decoder) { + boost::throw_exception (DCPReadError ("could not create JPEG2000 decompresser")); + } opj_dparameters_t parameters; opj_set_default_decoder_parameters (¶meters); parameters.cp_reduce = reduce; opj_setup_decoder (decoder, ¶meters); opj_cio_t* cio = opj_cio_open ((opj_common_ptr) decoder, data, size); + if (!cio) { + boost::throw_exception (DCPReadError ("could not create JPEG2000 memory stream")); + } opj_image_t* image = opj_decode (decoder, cio); if (!image) { opj_destroy_decompress (decoder); opj_cio_close (cio); - boost::throw_exception (DCPReadError (String::compose ("could not decode JPEG2000 codestream of %1 bytes.", size))); + if (format == CODEC_J2K) { + boost::throw_exception (DCPReadError (String::compose ("could not decode JPEG2000 codestream of %1 bytes.", size))); + } else { + boost::throw_exception (DCPReadError (String::compose ("could not decode JP2 file of %1 bytes.", size))); + } } opj_destroy_decompress (decoder);