X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fj2k.cc;h=fc60acfa54ca197f4042a29451f1eb41cd21a6a5;hb=d08f6892b676caffa6f609724d3e801b563c6cc8;hp=f1e4c3f5ebbddf5710ee14968e54e2032f7e8ede;hpb=d2593fb73b15c66dd2c9b28dad53a98186c2a70a;p=libdcp.git diff --git a/src/j2k.cc b/src/j2k.cc index f1e4c3f5..fc60acfa 100644 --- a/src/j2k.cc +++ b/src/j2k.cc @@ -43,6 +43,7 @@ using std::min; using std::pow; +using std::string; using boost::shared_ptr; using boost::shared_array; using namespace dcp; @@ -90,8 +91,16 @@ read_free_function (void* data) delete reinterpret_cast(data); } + +static void +decompress_error_callback (char const * msg, void *) +{ + throw J2KDecompressionError (msg); +} + + static void -error_callback (char const * msg, void *) +compress_error_callback (char const * msg, void *) { throw MiscError (msg); } @@ -128,7 +137,7 @@ dcp::decompress_j2k (uint8_t* data, int64_t size, int reduce) opj_codec_t* decoder = opj_create_decompress (format); if (!decoder) { - boost::throw_exception (DCPReadError ("could not create JPEG2000 decompresser")); + boost::throw_exception (ReadError ("could not create JPEG2000 decompresser")); } opj_dparameters_t parameters; opj_set_default_decoder_parameters (¶meters); @@ -140,7 +149,7 @@ dcp::decompress_j2k (uint8_t* data, int64_t size, int reduce) throw MiscError ("could not create JPEG2000 stream"); } - opj_set_error_handler(decoder, error_callback, 00); + opj_set_error_handler(decoder, decompress_error_callback, 00); opj_stream_set_read_function (stream, read_function); ReadBuffer* buffer = new ReadBuffer (data, size); @@ -153,9 +162,9 @@ dcp::decompress_j2k (uint8_t* data, int64_t size, int reduce) opj_destroy_codec (decoder); opj_stream_destroy (stream); if (format == OPJ_CODEC_J2K) { - boost::throw_exception (DCPReadError (String::compose ("could not decode JPEG2000 codestream of %1 bytes.", size))); + boost::throw_exception (ReadError (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))); + boost::throw_exception (ReadError (String::compose ("could not decode JP2 file of %1 bytes.", size))); } } @@ -191,7 +200,7 @@ dcp::decompress_j2k (uint8_t* data, int64_t size, int reduce) 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))); + boost::throw_exception (ReadError (String::compose ("could not decode JPEG2000 codestream of %1 bytes.", size))); } opj_destroy_decompress (decoder); @@ -265,7 +274,7 @@ seek_function (OPJ_OFF_T nb_bytes, void* data) * after this call; see opj_j2k_encode where if l_reuse_data is false it will set l_tilec->data = l_img_comp->data. */ Data -dcp::compress_j2k (shared_ptr xyz, int bandwidth, int frames_per_second, bool threed, bool fourk) +dcp::compress_j2k (shared_ptr xyz, int bandwidth, int frames_per_second, bool threed, bool fourk, string comment) { /* get a J2K compressor handle */ opj_codec_t* encoder = opj_create_compress (OPJ_CODEC_J2K); @@ -273,7 +282,7 @@ dcp::compress_j2k (shared_ptr xyz, int bandwidth, int frame throw MiscError ("could not create JPEG2000 encoder"); } - opj_set_error_handler (encoder, error_callback, 0); + opj_set_error_handler (encoder, compress_error_callback, 0); /* Set encoding parameters to default values */ opj_cparameters_t parameters; @@ -282,7 +291,7 @@ dcp::compress_j2k (shared_ptr xyz, int bandwidth, int frame parameters.numresolution = 7; } parameters.rsiz = fourk ? OPJ_PROFILE_CINEMA_4K : OPJ_PROFILE_CINEMA_2K; - parameters.cp_comment = strdup ("libdcp"); + parameters.cp_comment = strdup (comment.c_str()); /* set max image */ parameters.max_cs_size = (bandwidth / 8) / frames_per_second; @@ -299,6 +308,8 @@ dcp::compress_j2k (shared_ptr xyz, int bandwidth, int frame opj_stream_t* stream = opj_stream_default_create (OPJ_FALSE); if (!stream) { + opj_destroy_codec (encoder); + free (parameters.cp_comment); throw MiscError ("could not create JPEG2000 stream"); } @@ -308,31 +319,36 @@ dcp::compress_j2k (shared_ptr xyz, int bandwidth, int frame opj_stream_set_user_data (stream, buffer, write_free_function); if (!opj_start_compress (encoder, xyz->opj_image(), stream)) { + opj_stream_destroy (stream); + opj_destroy_codec (encoder); + free (parameters.cp_comment); if ((errno & 0x61500) == 0x61500) { /* We've had one of the magic error codes from our patched openjpeg */ - throw MiscError (String::compose ("could not start JPEG2000 encoding (%1)", errno & 0xff)); + boost::throw_exception (StartCompressionError (errno & 0xff)); } else { - throw MiscError ("could not start JPEG2000 encoding"); + boost::throw_exception (StartCompressionError ()); } } if (!opj_encode (encoder, stream)) { - opj_destroy_codec (encoder); opj_stream_destroy (stream); + opj_destroy_codec (encoder); + free (parameters.cp_comment); throw MiscError ("JPEG2000 encoding failed"); } if (!opj_end_compress (encoder, stream)) { - opj_destroy_codec (encoder); opj_stream_destroy (stream); + opj_destroy_codec (encoder); + free (parameters.cp_comment); throw MiscError ("could not end JPEG2000 encoding"); } Data enc (buffer->data ()); - free (parameters.cp_comment); - opj_destroy_codec (encoder); opj_stream_destroy (stream); + opj_destroy_codec (encoder); + free (parameters.cp_comment); return enc; }