summaryrefslogtreecommitdiff
path: root/src/util.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-11-30 21:17:50 +0000
committerCarl Hetherington <cth@carlh.net>2014-11-30 21:17:50 +0000
commit4e60579afd2cec1a12dd4ed245111999861ab212 (patch)
tree7b77d4cf51f60f69eb68995ccb0200091a3ec787 /src/util.cc
parentbbb3db16cc7e6f2262a89da4bec9fc356d6c3c12 (diff)
Use openjpeg2.
Diffstat (limited to 'src/util.cc')
-rw-r--r--src/util.cc58
1 files changed, 50 insertions, 8 deletions
diff --git a/src/util.cc b/src/util.cc
index 4ac3685c..bb1f9834 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -190,6 +190,41 @@ libdcp::content_kind_from_string (string type)
assert (false);
}
+class ReadBuffer
+{
+public:
+ ReadBuffer (uint8_t* data, int64_t size)
+ : _data (data)
+ , _size (size)
+ , _offset (0)
+ {}
+
+ OPJ_SIZE_T read (void* buffer, OPJ_SIZE_T nb_bytes)
+ {
+ int64_t N = min (nb_bytes, _size - _offset);
+ memcpy (buffer, _data + _offset, N);
+ _offset += N;
+ return N;
+ }
+
+private:
+ uint8_t* _data;
+ OPJ_SIZE_T _size;
+ OPJ_SIZE_T _offset;
+};
+
+static OPJ_SIZE_T
+read_function (void* buffer, OPJ_SIZE_T nb_bytes, void* data)
+{
+ return reinterpret_cast<ReadBuffer*>(data)->read (buffer, nb_bytes);
+}
+
+static void
+free_function (void* data)
+{
+ delete reinterpret_cast<ReadBuffer*>(data);
+}
+
/** Decompress a JPEG2000 image to a bitmap.
* @param data JPEG2000 data.
* @param size Size of data in bytes.
@@ -202,21 +237,28 @@ libdcp::content_kind_from_string (string type)
shared_ptr<libdcp::XYZFrame>
libdcp::decompress_j2k (uint8_t* data, int64_t size, int reduce)
{
- opj_dinfo_t* decoder = opj_create_decompress (CODEC_J2K);
+ opj_codec_t* decoder = opj_create_decompress (OPJ_CODEC_J2K);
+
opj_dparameters_t parameters;
opj_set_default_decoder_parameters (&parameters);
parameters.cp_reduce = reduce;
opj_setup_decoder (decoder, &parameters);
- opj_cio_t* cio = opj_cio_open ((opj_common_ptr) decoder, data, size);
- opj_image_t* image = opj_decode (decoder, cio);
- if (!image) {
- opj_destroy_decompress (decoder);
- opj_cio_close (cio);
+
+ opj_stream_t* stream = opj_stream_default_create (OPJ_TRUE);
+ opj_stream_set_read_function (stream, read_function);
+ ReadBuffer* buffer = new ReadBuffer (data, size);
+ opj_stream_set_user_data (stream, buffer, free_function);
+
+ 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);
boost::throw_exception (DCPReadError ("could not decode JPEG2000 codestream of " + lexical_cast<string> (size) + " bytes."));
}
- opj_destroy_decompress (decoder);
- opj_cio_close (cio);
+ opj_destroy_codec (decoder);
+ opj_stream_destroy (stream);
image->x1 = rint (float(image->x1) / pow (2, reduce));
image->y1 = rint (float(image->y1) / pow (2, reduce));