summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-06-02 19:47:11 +0200
committerCarl Hetherington <cth@carlh.net>2020-06-02 19:47:11 +0200
commit5f2db276b59257b05e351c1ca5665de9cc3f78f4 (patch)
treeb1c0c737835fa45409d7285b7619ef989987b7c1 /src
parent0e910402791b27e082946d99e8f7bc333ab680a9 (diff)
Align OpenJPEG image data arrays to 32-byte boundaries.
Diffstat (limited to 'src')
-rw-r--r--src/openjpeg_image.cc47
1 files changed, 31 insertions, 16 deletions
diff --git a/src/openjpeg_image.cc b/src/openjpeg_image.cc
index 31889566..3ca7aeb4 100644
--- a/src/openjpeg_image.cc
+++ b/src/openjpeg_image.cc
@@ -111,32 +111,47 @@ OpenJPEGImage::OpenJPEGImage (uint8_t const * data_16, dcp::Size size, int strid
void
OpenJPEGImage::create (Size size)
{
- opj_image_cmptparm_t cmptparm[3];
-
- for (int i = 0; i < 3; ++i) {
- cmptparm[i].dx = 1;
- cmptparm[i].dy = 1;
- cmptparm[i].w = size.width;
- cmptparm[i].h = size.height;
- cmptparm[i].x0 = 0;
- cmptparm[i].y0 = 0;
- cmptparm[i].prec = 12;
- cmptparm[i].bpp = 12;
- cmptparm[i].sgnd = 0;
- }
-
- /* XXX: is this _SRGB right? */
- _opj_image = opj_image_create (3, &cmptparm[0], OPJ_CLRSPC_SRGB);
+ _opj_image = reinterpret_cast<opj_image_t*> (malloc(sizeof(opj_image_t)));
if (_opj_image == 0) {
throw std::runtime_error ("could not create libopenjpeg image");
}
+ /* XXX: is this right? */
+ _opj_image->color_space = OPJ_CLRSPC_SRGB;
_opj_image->x0 = 0;
_opj_image->y0 = 0;
_opj_image->x1 = size.width;
_opj_image->y1 = size.height;
+ _opj_image->icc_profile_buf = 0;
+ _opj_image->icc_profile_len = 0;
+
+ _opj_image->numcomps = 3;
+ _opj_image->comps = reinterpret_cast<opj_image_comp_t *> (malloc(_opj_image->numcomps * sizeof(opj_image_comp_t)));
+ if (!_opj_image->comps) {
+ opj_image_destroy(_opj_image);
+ throw std::runtime_error ("could not create libopenjpeg image");
+ }
+
+ for (int i = 0; i < 3; ++i) {
+ opj_image_comp_t *comp = &_opj_image->comps[i];
+ comp->dx = 1;
+ comp->dy = 1;
+ comp->w = size.width;
+ comp->h = size.height;
+ comp->x0 = 0;
+ comp->y0 = 0;
+ comp->prec = 12;
+ comp->bpp = 12;
+ comp->sgnd = 0;
+ comp->data = reinterpret_cast<int*>(aligned_alloc(32, comp->w * comp->h * sizeof(int)));
+ if (!comp->data) {
+ opj_image_destroy(_opj_image);
+ throw std::runtime_error ("could not create libopenjpeg image");
+ }
+ }
}
+
/** OpenJPEGImage destructor */
OpenJPEGImage::~OpenJPEGImage ()
{