Add an explicit exception for J2K decompression failures.
authorCarl Hetherington <cth@carlh.net>
Tue, 14 Apr 2020 21:11:33 +0000 (23:11 +0200)
committerCarl Hetherington <cth@carlh.net>
Tue, 14 Apr 2020 21:11:33 +0000 (23:11 +0200)
src/exceptions.h
src/j2k.cc

index cd4f5fbbd504a128b837b35868fe1e1881478ea8..b58d02404675bae17e518518a6036538e8f51f6f 100644 (file)
@@ -121,6 +121,18 @@ private:
 };
 
 
+/** @class J2KDecompressionError
+ *  @brief An error that occurs during decompression of JPEG2000 data.
+ */
+class J2KDecompressionError : public ReadError
+{
+public:
+       explicit J2KDecompressionError (std::string message)
+               : ReadError (message)
+       {}
+};
+
+
 class BadContentKindError : public ReadError
 {
 public:
index 4aca621eee51c442f9491f538a9a11e556c1e8cc..7854e6834549bfe013f25bfcb6575e04b9ae913d 100644 (file)
@@ -90,8 +90,16 @@ read_free_function (void* data)
        delete reinterpret_cast<ReadBuffer*>(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);
 }
@@ -140,7 +148,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);
@@ -273,7 +281,7 @@ dcp::compress_j2k (shared_ptr<const OpenJPEGImage> 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;