summaryrefslogtreecommitdiff
path: root/src/j2k_transcode.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/j2k_transcode.cc')
-rw-r--r--src/j2k_transcode.cc59
1 files changed, 48 insertions, 11 deletions
diff --git a/src/j2k_transcode.cc b/src/j2k_transcode.cc
index 664d18a3..4fc48042 100644
--- a/src/j2k_transcode.cc
+++ b/src/j2k_transcode.cc
@@ -57,16 +57,16 @@ using namespace dcp;
shared_ptr<dcp::OpenJPEGImage>
-dcp::decompress_j2k (Data const& data, int reduce)
+dcp::decompress_j2k(Data const& data, int reduce, shared_ptr<OpenJPEGCancel> cancel)
{
- return dcp::decompress_j2k (data.data(), data.size(), reduce);
+ return dcp::decompress_j2k(data.data(), data.size(), reduce, cancel);
}
shared_ptr<dcp::OpenJPEGImage>
-dcp::decompress_j2k (shared_ptr<const Data> data, int reduce)
+dcp::decompress_j2k(shared_ptr<const Data> data, int reduce, shared_ptr<OpenJPEGCancel> cancel)
{
- return dcp::decompress_j2k (data->data(), data->size(), reduce);
+ return dcp::decompress_j2k (data->data(), data->size(), reduce, cancel);
}
@@ -123,7 +123,7 @@ compress_error_callback (char const * msg, void *)
shared_ptr<dcp::OpenJPEGImage>
-dcp::decompress_j2k (uint8_t const * data, int64_t size, int reduce)
+dcp::decompress_j2k(uint8_t const * data, int64_t size, int reduce, shared_ptr<OpenJPEGCancel> cancel)
{
DCP_ASSERT (reduce >= 0);
@@ -152,6 +152,10 @@ dcp::decompress_j2k (uint8_t const * data, int64_t size, int reduce)
parameters.cp_reduce = reduce;
opj_setup_decoder (decoder, &parameters);
+ if (cancel) {
+ opj_set_cancel(decoder, cancel->opj_cancel());
+ }
+
auto stream = opj_stream_default_create (OPJ_TRUE);
if (!stream) {
throw MiscError ("could not create JPEG2000 stream");
@@ -166,19 +170,24 @@ dcp::decompress_j2k (uint8_t const * data, int64_t size, int reduce)
opj_image_t* image = 0;
opj_read_header (stream, decoder, &image);
- if (opj_decode (decoder, stream, image) == OPJ_FALSE) {
- opj_destroy_codec (decoder);
- opj_stream_destroy (stream);
+ auto const result = opj_decode(decoder, stream, image);
+ opj_destroy_codec (decoder);
+ opj_stream_destroy (stream);
+
+ switch (result) {
+ case OPJ_FAILURE:
if (format == OPJ_CODEC_J2K) {
boost::throw_exception (ReadError (String::compose ("could not decode JPEG2000 codestream of %1 bytes.", size)));
} else {
boost::throw_exception (ReadError (String::compose ("could not decode JP2 file of %1 bytes.", size)));
}
+ break;
+ case OPJ_CANCEL:
+ boost::throw_exception(Cancelled{});
+ default:
+ break;
}
- opj_destroy_codec (decoder);
- opj_stream_destroy (stream);
-
image->x1 = rint (float(image->x1) / pow (2.0f, reduce));
image->y1 = rint (float(image->y1) / pow (2.0f, reduce));
return std::make_shared<OpenJPEGImage>(image);
@@ -332,3 +341,31 @@ dcp::compress_j2k (shared_ptr<const OpenJPEGImage> xyz, int bandwidth, int frame
return enc;
}
+
+OpenJPEGCancel::OpenJPEGCancel()
+{
+ _cancel = opj_create_cancel();
+}
+
+
+OpenJPEGCancel::~OpenJPEGCancel()
+{
+ opj_destroy_cancel(_cancel);
+}
+
+
+void
+OpenJPEGCancel::cancel()
+{
+ ::opj_cancel(_cancel);
+}
+
+
+void
+OpenJPEGCancel::reset()
+{
+ ::opj_reset(_cancel);
+}
+
+
+